目录
一、应用层
1、功能
2、协议的分类
二、UDP原理(传输层)
1、协议端格式
2、格式解释
三、TCP原理(传输层)
1、协议端格式
2、长度
3、可靠传输
(1)确认应答
(2)超时重传
(3)连接管理
(4)滑动窗口
(5)流量控制
(6)拥塞控制
(7)延时应答
(8)捎带应答
(9)面向字节流
(10)tcp异常情况处理
四、IP协议(网络层)
1、网络层的功能
2、协议端格式
3、格式解释
4、地址管理
5、网段划分
6、路由选择
五、以太网协议(数据链路层)
1、以太网数据帧格式
2、格式解释
3、区别IP地址和MAC地址
一、应用层
1、功能
①根据需要,明确要传输什么信息;②约定好协议,规定信息按什么格式组织。
2、协议的分类
eg:点外卖时,发送请求包括用户ID和位置信息。
用户ID:001;经度:35;纬度:87;
①自定义协议
程序员规定按照用户ID,经度,纬度顺序,中间逗号隔开的格式组织信息
请求:001,35,87
优点:格式灵活,随意更改;
缺点:可读性不高。
②xml(通过标签组织数据)
请求:
<request>
<useID>001</useID>
<position>35,87</position>
</request>
优点:可读性高;
缺点:标签写起来繁琐,传输时会占用许多网络宽带。
③json
{
useID:"001",
position:"35,87"
}
使用{}把键值对包裹起来。键值对之间用“,”分割,键与值之间用“:”分割,键是String类型,值可以是数字、字符串、json、数组等类型。
优点:可读性高;
缺点:传输时会占用许多网络宽带。
④protobuffer
使用二进制来传输数据。
优点:传输效率高,占用网络宽带最低;
缺点:可读性不高。
二、UDP原理(传输层)
1、协议端格式
2、格式解释
(1)16位源端口号:2个字节,发送方程序端口号;
(2)16位目的端口号:2个字节,接收方程序端口号。
(3)16位UDP长度:表示整个数据报的最大长度(报头+数据),为0-65535,即64kb。若发送的数据报长度超过64kb,则需在应用层手动分包,多次发送,在接收端手动拼接。
(4)16位UDP检验和:
①检验和:在数据传输中,由于磁场、电场等外部环境的影响,导致数据传输出错,检验和就是检查数据是否传输出错。本质上是一个字符串,体积比原始数据小,但是由原始数据生成的。原始数据相同,得到的检验和一定相同;检验和相同,原始数据大概率相同。
②基于检验和完成数据检验:
发送方整理好数据(data1),通过一定算法计算出检验和(checksum1);
发送方将data1和checksum1通过网络发送出去;
接收方收到数据(data2,可能和data1不一样)和检验和checksum1;
接收方根据data2通过一样算法计算出检验和checksum2;特别
对比checksum1和checksum2,若不同,则原始数据肯定不同;若相同,则原始数据大概率相同。
③计算检验和:
UDP使用的CRC算法(循环冗余算法),把当前要计算检验和的数据,每个字节都进行累加,把结果保存到两个字节的变量中,累加过程溢出也没影响。但这种算法也不是靠谱的。
md5算法:一系列公式,完成md5的计算。
特点:无论原始数据多长,计算得到的md5都是固定长度;原始数据中,只要一个字节不同,md5差异也会很大;不可逆,给一个原始数据可以计算出md5,但已知md5计算出原始数据难以实现。
三、TCP原理(传输层)
1、协议端格式
2、长度
(1)报头长度:最短20字节(没有选项),最长60字节
(2)报头+数据长度:可变,当长度不够用时,可使用保留位扩充。
3、可靠传输
(1)确认应答
①概念:发送端将数据报发送给接收端,接收端收到数据后会向发送端发送一个回应报文(acknowledge,ack)发送端接收到回应报文后就知道自己发送成功了。
②如何保证数据与回应报文对应上?如何解决数据后发先至的情况?
上述发送数据时,第一个载荷数据的第一个字节为1,就会在报文序号中填1(载荷数据第一个字节的序号),长度为1000字节,则最后一个是1000,但不会在序号中记录。确认序号是对应的应答报文的,是对应载荷数据的最后一个序号+1,意思是确认序号之前的数据都已成功收到。如果数据出现后发先至的情况,接收端可以根据数据包的序号字段在接收缓存区进行排序,确保数据包按照正确的顺序进行处理。
③怎样区分是业务数据还是应答报文?
若传输的报文是应答报文,则在标志位ack位为1,表示传输的报文是应答报文,若为0,则为普通业务数据报文。
(2)超时重传
①概念
确认应答是一个理想情况,但若传输过程中出现丢包情况,发送端未收到ack,此时就会出现超时重传。
②丢包
在传输数据时,若数据包太多,会在路由器/交换机上出现堵塞情况,此时路由器/交换机不会保存这些挤压的数据,而是直接放弃这些数据,就会出现“丢包”情况。
③不同丢包情况
要发送的数据丢了:
返回的应答报文丢了:
④重传
发送端无法区分哪种情况导致ack未送达,在规定等待时间内,只要没有收到ack,发送端都会重新发送数据。初始等待时间是可配置的,随着丢包情况变多,等待时间也会发生变化,等待时间会变长,但也不是无限变长,当达到一定程度,认为数据无法成功传输,就会放弃tcp连接,触发tcp重置连接操作。
当是ack丢包时,重传数据时,站在接收方角度,会不会收到两份一样的数据???
答案是不会的。接收端收到数据后会将数据放到接收缓存区,当数据第二次来时,接收端发现数据已在缓存区存在,就会放弃该数据,所以读数据时也只会读取到一次。
(3)连接管理
①建立连接(三次握手)
上述建立连接过程中,传输的数据是一个简短的,没有业务的数据包,只是为了唤起对方。由发送端(客户端)先发起连接,此时数据的报文syn位为1;接收端收到syn后,接收端向发送端发送一个简短的,没有业务的数据包,此时数据的报文syn、ack位为1(合并为1次,提高效率),发送端收到后向接收端发送回应报文。完成三次握手后,发送端和接收端之间就建立了连接,即他们之间保存了对方的信息。
LISTEN状态:服务器这边把socket创建好,并把端口号绑定好,进入LISTEN状态,此时允许客户端随时建立连接。
ESTABLISHED状态:连接建立完成,可以进行正常通信。
三次握手的意义:确认当前网络是否通畅;使发送端和接收端确认发送和接收能力是否正常;让通信双方,在握手过程中,对一些参数(序号等)作出协商。
②断开连接(四次挥手)
发送端(服务器或者客户端)调用close方法或结束进程,发送报文,此时数据的报文FIN位为1;接收端收到报文发送应答报文,此时数据的报文ACK位为1;且调用close方法或结束进程发送报文,此时数据的报文FIN位为1。发送端收到数据报文后,发送应答报文。此时4次挥手完成,连接断开。
为什么这里ACK和FIN不能合并,ACK可以和SYN合并???
因为ACK和SYN是内核触发的,同一个时机发送可以合并;而FIN是应用程序执行的,与ACK发生的时机不同,不能合并;TCP还有一种机制是延时应答,能够拖延ACK的发送,ACK滞后就有机会和FIN合并。
TIME_WAIT状态:哪一方先断开连接,哪一方就会进入TIME_WAIT状态。若最后一个ACK丢失,接收端超时重传FIN,但此时发送端已经没有了,接收端一直无法收到ACK,此状态就是让发送端等待一段时间,防止ACK丢失了超时重传时也无法收到ACK。假设网络上两个节点通信消耗的最大时间为MSL,则等待的时间就为2MSL。
(4)滑动窗口
①背景
发送端发送一个数据,发送端收到应答报文后再发送下一个数据。但这样一发一收的话效率低。可不可以一次多发几个数据,批量传输,提高效率。
②具体机制
窗口大小:无需等待确认应答,发送端一次发送数据的最大数量。窗口大小越大,传输效率越高。上图中的窗口大小就是4000.
当收到一个ACK包之后,滑动窗口就向后移动,继续发送下一个数据。但若是中途出现丢包情况怎么解决???
③ACK丢包
此时ACK丢包了,不用进行重传。比如上图确认序号为1001的ACK包丢了,但确认序号为2001的ACK包发送端已经收到,表明2001序号之前的数据接收端都已经收到,1001的ACK包也就没那么重要了。
④数据包丢包
此时比如1001-2000的数据包丢包了。A需要知道此数据包丢了,B反复告诉A我需要1001序号的数据,在重复几次后,A就知道了1001序号的数据包没有发送成功,就会重新发送。发送成功后,就开始现在已经收到数据的应答报文。
若传输的数据少也不频繁,就使用普通的确认应答和超时重传;若传输的数据多且频繁,就使用滑动窗口模式。
当滑动窗口也不是越大越好,若一次传输的数据太多,就会出现阻塞,接收端处理不过来,就容易出现丢包情况。
(5)流量控制
①概念
根据接收端接收数据的能力,对滑动窗口大小进行控制。滑动窗口大小不应该超过接收端接收数据的能力。
②接收端接收数据能力
接收端接收到数据之后,会把数据放到接收缓冲区,接收端这边的应用程序read后,接收缓存区就会把数据删除,此时接收缓存区剩余空间大小就大了。接收缓存区剩余空间越大,接收端接收数据能力就越大。
③具体机制
接收端每次收到数据之后,就会把接收缓冲区剩余空间大小通过ACK包传输给发送端,发送端收到ACK包后就会根据接收缓冲区剩余空间大小调整下一轮的窗口大小。但若接收缓存区已满,没有数据传输,也没有ACK包告诉发送端接收缓存区什么时候有剩余。此时,发送端就会给接收端不断发送窗口探测包,不携带具体的业务数据,只是为了触发ACK包,获取接收缓存区剩余空间。
(6)拥塞控制
①概念:流量控制考虑了接收方的接收能力,而拥塞控制是考虑了整个通信的路径,考虑了通信过程中中间结点的情况,任何一个结点处理能力达到上限都容易导致数据传输出现丢包情况。
②具体机制
滑动窗口以一个较小的大小传输数据,之后以指数增长窗口大小,当到达阈值之后,窗口大小以线性增长,当出现丢包情况后,降低阈值,滑动窗口开始新一轮的动态变化。
注:流量控制和拥塞控制机制都在限制窗口大小,最终窗口大小是两种机制的最小值。
(7)延时应答
具体机制:平常情况下,A给B发送数据,B收到数据后就会立即返回ACK,但有时也会延时应答。B收到数据后,先不着急返回ACK,等一段时间后,可能B的接收缓存区剩余空间也会变多,此时返回ACK也会提高传输效率。
(8)捎带应答
具体机制:捎带应答是在延时应答的基础下提高tcp的传输效率,在传输数据时,往往是一问一答的方式,A给B请求,B给A应答报文,B给A响应,在延时应答后,应答报文会滞后,此时响应正好计算完成,则B将应答报文和响应可以一同返回给A,从而提高传输效率。
(9)面向字节流
①问题
在面向字节流传输时,当有多个应用层数据包被传输时,在接收端的缓冲区就容易出现粘包问题,无法区分从哪里到哪里是一个完整的数据包。
②解决办法
明确应用数据包之间的边界
引入分隔符;引入长度
(10)tcp异常情况处理
①进程崩溃tcp
进程结束相当于调用了socket.close()方法,触发四次挥手,tcp断开连接。进程结束时,tcp的连接还未断开。
②正常关机
强制结束进程,如果在系统关闭之前完成了四次挥手,则会正常断开连接;如果在系统关闭之后,B的ACK和FIN才到达,此时B收不到ACK,就会超时重传,重传几次后也没有响应,就会放弃tcp连接,触发tcp重置连接操作,发现没有什么效果,也就释放连接了。
③主机断电(非正常)
系统关闭是一瞬间的事,来不及进行四次挥手,此时对端迟迟未收到数据。
若对端是接收端,tcp有一个心跳包机制,接收端会周期性向发送端发送一个没有业务的数据包,期望得到发送端的一个应答,若重复几次没有响应,则认为发送端挂了,接收端单方面释放连接。
若对端是发送端,发送端未收到应答,就会超时重传,重传几次后也没有响应,就会放弃tcp连接,触发tcp重置连接操作,发现没有什么效果,也就释放连接了。
④网线端口
是一瞬间的事,来不及进行四次挥手,此时对端迟迟未收到数据。
若对端是接收端,tcp有一个心跳包机制,接收端会周期性向发送端发送一个没有业务的数据包,期望得到发送端的一个应答,若重复几次没有响应,则认为发送端挂了,接收端单方面释放连接。
若对端是发送端,发送端未收到应答,就会超时重传,重传几次后也没有响应,就会放弃tcp连接,触发tcp重置连接操作,发现没有什么效果,也就释放连接了。
注:若需要将数据发给局域网中的所有设备(广播),使用UDP
四、IP协议(网络层)
1、网络层的功能
(1)地址管理;通过IP地址描述出一个设备在网络上的地址。
(2)路由选择;规划出合适的路径进行数据传输。
2、协议端格式
3、格式解释
(1)4位版本:若为4,代表IPV4版本;若为6,代表IPV6版本。
(2)8位服务类型:能够让IP协议切换形态。4种形态彼此之间是冲突的,最小延时、最小成本、最大吞吐量、最高可靠性。
(3)16位总长度:IP协议总长度为64kb,但是IP协议支持拆包组包。拆出的小包之间的16位标识是一样的,标志中是是否支持拆包和是否是最后一个包,13位片偏移是小包的相对位置,方便按顺序组包。
(4)8位生存时间:描述这个数据包,在网络上还能生成多久。TTL的单位是次,表明该数据包还能被路由器/交换机转发的次数。TTL会设置一个初始值(32,64,128....),每经过一次转发就会-1.若一个数据包,目的IP是不存在的,当TTL消耗完时,该数据包也就消失了。每个路由器都知道自己的相邻设备,所以到达目的IP消耗的TTL不会太大。
(5)8位协议:描述的传输层是TCP协议还是UDP协议。
4、地址管理
(1)IP地址:是一个32位的整数,为了方便人们理解,写作点分十进制方式,可以用2^32-1个IP地址,但在当代社会,上网设备多,IP地址存在不够用的问题。
(2)解决IP地址不够用的问题
①动态分配IP
同一时间,需要上网的设备才会分配一个IP地址。
②NAT机制(网络地址转化)
内网IP(局域网IP):如果一个IP地址是以10.或者172.16.-172.31.或者192.168.开头,IP就是内网IP,在同一个局域网内,内网IP之间不能重复;在不同局域网类,内网IP直之间可以重复。
外网IP(广域网IP):内网IP剩下的为外网IP,外网IP是唯一的,不可以重复。
通常一个学校,小区等有一个外网IP,一个外网IP内有多台设备,即有多个内网IP。
当电脑访问网站服务器时,需要先把电脑的内网IP地址通过NAT设备转换为外网IP地址,此时才能访问广域网,响应完成返回时,再通过NAT设备中的映射关系,将电脑外网IP地址转换为之前的内网IP地址。
当不同的电脑访问服务器时,若他们的内网IP地址是一样的,NAT设备转换时,在映射方面会结合端口号,使得区分数据应传给哪个设备;若IP地址和端口号都一样,则在转换时会分配他们不同的端口号,使得区分数据应返回给哪个设备。
③IPV6
16个字节表示IP地址,大幅度提高了IP地址的个数。但由于IPV4与IPV6不兼容,导致IPV6的普及程度并不高。
5、网段划分
IP地址会被划分成两部分,网络号(标识一个局域网)+主机号(标识一个局域网中的设备),同一个局域网下,主机号必须不同。
一个IP地址中,哪部分是网络号,哪部分是主机号是通过子网掩码确定的。
eg:IP地址为:192.168.100.176;子网掩码为:255.255.255.0
子网掩码转为二进制为:11111111 11111111 11111111 00000000(左侧为1,右侧为0,不会交替出现)
IP地址转为二进制为:11000000 10101000 01100100 10110000
两者取余:11000000 10101000 01100100 00000000
上述结果为网络号:192.168.100
(1)5类划分方式
若一个IP地址主机号全为0,表示是网络号;
若一个IP地址主机号二进制全为1,表示是广播地址,该局域网中的所有设备都能收到;
若一个IP地址是127.开头的表示是环回IP(loopback),能够排除网络不流畅的因素,测试;
6、路由选择
每个路由器内部都有一个数据结构路由表,传输数据时,根据目的IP,查路由表,如果查到了,就按照路由表给的方向继续转发;若没有查到,就按照路由表的默认表项继续转发。
五、以太网协议(数据链路层)
1、以太网数据帧格式
2、格式解释
①目的地址和源地址:指网卡的物理地址(mac),固定的,每个设备是唯一的;
②载荷数据类型:帧协议类型字段有三种值,分别对应IP(数据报长度不能超过1500字节(MTU),所以IP协议有拆包组包功能)、ARP、RARP;
③CRC:校验码。
3、区别IP地址和MAC地址
MAC地址用来识别数据链路层中相连的节点,描述路途上每个区间的起点和终点;
IP地址是整个路途的终点和起点。
在数据转发过程中,IP地址不会改变,MAC地址会根据转发情况改变。