OSI 七层结构:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
七层结构如下:
网络中的数据传输过程:
数据发送应用层发送请求,需要通过硬件层发送,于是要往下层走。每经过一层,都会要给数据加上报头,最终发送出数据。在局域网中的数据都能收到数据,收到数据的主机会在链路层分析报头是否与当前主机mac地址匹配,不匹配将数据丢弃,匹配继续向上解包,每次向上发送数据要确定是发送给哪个协议。最终会在应用层收到最终的数据。
对封装和分用的理解:
在传输层,切割成数据段;
在网络层,打成IP包 数据包;
在数据链路层,切割成 数据帧。
在物理层,转变成 比特流。
MTU是什么?
MTU的英文全称为Maximum Transmission Unit,中文是意思是最大传输单元。MTU就是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。
MTU的大小?
在 Ethernet 中,一个标准的以太网数据帧最大1518字节,头信息有14 字节,尾部校验和 FCS 占了 4 字节,剩下数据即为MTU,最大为1500字节。
通常数据包的大小范围是在 [64 1518] 字节之间,如果除去头部开销,则实际的数据大小为 [46 1500] 字节之间。
一般情况下,数据包的大小都是在这个范围内,如果数据包小于64字节,称为碎片;
如果大于1518 字节,称为 特大数据包。这两种类型的数据包都是非正常的以太网数据包,它们将影响网络的正常运行。无论是碎片或特大数据包,都会增加网络的负载,导致网络故障的发生。所以,我们在对网络进行分析的时候,对数据包大小的判断也是不可缺少的一个环节。
MSS(Maximum Segment Size,最大报文长度),是TCP协议定义的一个选项,MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。
MSS是最大报文段长度的缩写,是TCP协议里面的一个概念。MSS是TCP数据包每次能够传输的最大数据分段。
为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以一般MSS值1460
netsh interface ipv4 show subinterfaces
本地 MTU 值 = 1500:
UDP 包的大小: 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
TCP 包的大小: 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
这条命令的意思是向 www.baidu.com(百度主页)发送一个探测请求,请求将一个不允许分割的 1480 字节的数据包发送出去。经过多次测试,可以知道www.baidu.com的最大MTU是1464字节。
ping -l 1480 -f www.baidu.com
MTU 对 UDP 的影响:
一旦 UDP携带的数据超过1472(1500-20(IP首部)-8(UDP首部)),那么UDP 数据就会在网络层被分成多个IP数据报。即:发送方 IP 层就需要将数据包分成若干片,而接收方 IP 层就需要进行数据报的重组。
更严重的是,如果使用 UDP 协议,当 IP 层组包发生错误,那么包就会被丢弃。接收方无法重组数据报,将导致丢弃整个 IP 数据报。
TCP 的一个数据报也不可能无限大,还是受制于 MTU,TCP 单个数据报的最大消息长度,称为MSS。TCP在建立连接的过程中,双方会进行 MSS 协商,最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度受限于数据链路层的 MTU)。双方在发送 SYN 的时候会在 TCP 的头部写入字节能支持的 MSS 值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS,MMS的值就在 TCP首部的 40 字节变长选项中(kind=2)。MTU通过限制MSS(单个数据报的最大消息长度)的取值,来限制单个TCP包的长度。
TCP/IP 协议栈中定义了MSS, 为的是提高网络的性能,因为如果让IP层分包的话,丢包后的重发没法控制,需要重传整个TCP包(浪费了网络资源)。MSS就是这个协商的结果,不能人为修改,这个MSS的大小是MTU减去TCP头,从TCPDUMP结果中我们可以看到我们的TCP协商的MSS都在1.3~1.4K字节。
UDP包,因为UDP是用IP层来分包的,所以对于UDP层来说发一个大包,收到就是一个大包,但是IP层丢了包也没有办法处理,这样就需要应用层多一点校验。
IP层协议格式:
16位标识:发送端发送的IP数据包标识字段都是一个唯一值,该值在分片时被复制到每个片中。
3位标志:
第一位保留。
第二位表示禁止分片,如果设置了该位,IP数据报长度超过MTU将被丢弃,返回错误。
第三位表示更多分片,除了最后一个分片,其它都要置它为1.。
当数据报被分片后,每个片的总长度值要改为该片的长度值。而每一个分片的有效载荷需要减去分片信息(32字节),所以如果要发送的IP数据包是4096字节(包含tcp/udp头),发送的IP数据20(IP头)+4090,将会被分三次发送:
每次发送的IP数据都为发送3次,每次1500字节。即Header + 数据部分
32(IP分包头部)+(1472-32),
32(IP分包头部)+(1472-32),
32(IP分包头部)+(1230+填充数据)。
所以TCP协议进行数据传输,是不会造成IP分片的。若数据过大,只会在传输层进行数据分包,到了IP层就不用分片。而我们常提到的IP分片是由于UDP传输协议造成的,因为UDP传输协议并未限定传输数据报的大小。
通过本文的学习,应该了解了对UDP分片与TCP分段的原理与过程。
参考:https://blog.csdn.net/LearnLHC/article/details/115228649