IP分片浅析

详见原文:

https://www.cnblogs.com/glacierh/p/3653442.html

摘录:

TCP/IP分层中,数据链路层用MTUMaximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU1500字节,实际上数据帧的最大长度为1512字节,其中以太网数据帧的帧头为12字节。这里占注:14个字节,另外还有帧尾4字节等。

当发送的IP数据报的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功。


避免IP分片

在网络编程中,我们要避免出现IP分片,那么为什么要避免呢?原因是IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。由此可见,IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片。

对于UDP包,我们需要在应用层去限制每个包的大小,一般不要超过1472字节,即以太网MTU1500)—UDP首部(8)—IP首部(20)。

对于TCP数据,应用层就不需要考虑这个问题了,因为传输层已经帮我们做了。在建立连接的三次握手的过程中,连接双方会相互通告MSSMaximum Segment Size,最大报文段长度),MSS一般是MTUIP首部(20)—TCP首部(20),每次发送的TCP数据都不会超过双方MSS的最小值,所以就保证了IP数据报不会超过MTU,避免了IP分片。


IP分片实例

TCP

10.224.142.16610.137.133.101发送2000字节的TCP数据,抓包的结果如下图。从图中可以看出TCP数据被分成了2IP片,包含的数据大小分别为1448552,从三次握手可以看出双方通告的MSS都是1460字节,刚好是MTU1500)—IP首部(20)—TCP首部(20),但实际为什么第一个分片只发送了1448字节呢,个人觉得应该是TCP首部还有一些选项占用了12个字节

因为一般TCP选项中有12字节的时间戳选项(外加两字节的填充选项)。




猜你喜欢

转载自blog.csdn.net/wmyan/article/details/78962536