IP分片、TCP分段
本文详细的讲解了TCP分段与UDP分包的过程,希望让你对网络有一定的认识
服务器开发系列
文章目录
一、计算机网络传输基础知识
OSI 七层结构:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
七层结构如下:
网络中的数据传输过程:
数据发送应用层发送请求,需要通过硬件层发送,于是要往下层走。每经过一层,都会要给数据加上报头,最终发送出数据。在局域网中的数据都能收到数据,收到数据的主机会在链路层分析报头是否与当前主机mac地址匹配,不匹配将数据丢弃,匹配继续向上解包,每次向上发送数据要确定是发送给哪个协议。最终会在应用层收到最终的数据。
对封装和分用的理解:
在传输层,切割成数据段;
在网络层,打成IP包 数据包;
在数据链路层,切割成 数据帧。
在物理层,转变成 比特流。
二、IP分片、TCP分段
1.MTU 定义
MTU是什么?
MTU的英文全称为Maximum Transmission Unit,中文是意思是最大传输单元。MTU就是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。
MTU的大小?
在 Ethernet 中,一个标准的以太网数据帧最大1518字节,头信息有14 字节,尾部校验和 FCS 占了 4 字节,剩下数据即为MTU,最大为1500字节。
通常数据包的大小范围是在 [64 1518] 字节之间,如果除去头部开销,则实际的数据大小为 [46 1500] 字节之间。
一般情况下,数据包的大小都是在这个范围内,如果数据包小于64字节,称为碎片;
如果大于1518 字节,称为 特大数据包。这两种类型的数据包都是非正常的以太网数据包,它们将影响网络的正常运行。无论是碎片或特大数据包,都会增加网络的负载,导致网络故障的发生。所以,我们在对网络进行分析的时候,对数据包大小的判断也是不可缺少的一个环节。
2. MSS 简述
MSS(Maximum Segment Size,最大报文长度),是TCP协议定义的一个选项,MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。
MSS是最大报文段长度的缩写,是TCP协议里面的一个概念。MSS是TCP数据包每次能够传输的最大数据分段。
为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以一般MSS值1460
3. udp 或 tcp 包的最佳大小
netsh interface ipv4 show subinterfaces
本地 MTU 值 = 1500:
UDP 包的大小: 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
TCP 包的大小: 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
4. 如何测出当前网络最佳MTU值
这条命令的意思是向 www.baidu.com(百度主页)发送一个探测请求,请求将一个不允许分割的 1480 字节的数据包发送出去。经过多次测试,可以知道www.baidu.com的最大MTU是1464字节。
ping -l 1480 -f www.baidu.com
5. MTU 对 UDP的影响
MTU 对 UDP 的影响:
一旦 UDP携带的数据超过1472(1500-20(IP首部)-8(UDP首部)),那么UDP 数据就会在网络层被分成多个IP数据报。即:发送方 IP 层就需要将数据包分成若干片,而接收方 IP 层就需要进行数据报的重组。
更严重的是,如果使用 UDP 协议,当 IP 层组包发生错误,那么包就会被丢弃。接收方无法重组数据报,将导致丢弃整个 IP 数据报。
6. MTU 对TCP 的影响
TCP 的一个数据报也不可能无限大,还是受制于 MTU,TCP 单个数据报的最大消息长度,称为MSS。TCP在建立连接的过程中,双方会进行 MSS 协商,最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度受限于数据链路层的 MTU)。双方在发送 SYN 的时候会在 TCP 的头部写入字节能支持的 MSS 值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS,MMS的值就在 TCP首部的 40 字节变长选项中(kind=2)。MTU通过限制MSS(单个数据报的最大消息长度)的取值,来限制单个TCP包的长度。
7. 为什么会分片、分段
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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)