TCP/IP——IP分片

一、IP分片

IP把出接口的MTU与数据报长度进行比较,如果需要则进行分片。分片可以发送在原始发送端主机上,也可以发送在中间路由器时。把一份IP数据报分片以后,只有到达目的地才进行重新组装,重新组装是由目的端的IP层来完成的,其目的是使分片和重新组装过程对传输层是透明的,已经分片过的数据报可以再次进行分片。

使用UDP很容易导致分片

任何时候I P层接收到一份要发送的 IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其 M T U。 I P把M T U与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
对于TCP来说,MTU是路径MTU。

对于UDP来说,MTU是本地的MTU。

无论TCP还是UDP,即使在发送时,已按MTU大小来限制,但仍有可能在中途发生分片。这是因为,对于TCP来说,路径MTU并不一定是当前路径的MTU,当前路径的MTU仍可能小于源端发送数据包时的MTU。对于UDP来说,路径中的任何节点的MTU都可能小于发送端的MTU。

把一份 I P数据报分片以后,只有到达目的地才进行重新组装。重新组装由目的端的 I P层来完成,其目的是使分片和重新组装过程对运输层( T C P和U D P)是透明的。已经分片过的数据报有可能会再次进行分片(可能不止一次)。
重新组装的依据(参考IP头部格式):IP首部中的三个字段

16位的标识符(数据报的唯一标识)

3位标识符(1位未用,1位是否分片标志,1位是否还有更多分片标识)

13位偏移片(单位是字节;在分片时,除最后一片外,其他每一片中的数据部分(除 I P首部外的其余部分)必须是 8字节的整数倍。)

在分片时,除最后一片外,其他每一片中的数据部分(除 I P首部外的其余部分)必须是 8字节的整数倍。IP分片之后,只有第一片中有上层协议的头部。这是正常的,因为对于IP层来说,IP分片分的只是数据部分,而上层协议(TCP/UDP)是属于IP数据报的数据部分的。

分片之后,每一个分片中都含有IP的头部,但只有第一个分片中才会包含上层协议的头部。

当发生分片丢失时,即使只丢失一片数据也要重传整个数据报。为什么会发生这种情况呢?因为 I P层本身没有超时重传的机制,需要由更高层来负责超时和重传( T C P有超时和重传机制,但 U D P没有该机制,因此需要使用UDP协议的上层应用来实现重传功能)。

在第一个到达数据报片出现时, I P层必须启动一个定时器。这里“第一个”表示给定数据报的第一个到达数据报片,而不是第一个数据报片(数据报片偏移为 0)。正常的定时器值为 3 0或6 0秒。如果定时器超时而该数据报的所有数据报片未能全部到达,那么将这些数据报片丢弃,避免接收端缓存满。另外,如果最终超时未收到该IP数据报的全部分片,但收到了该IP数据报的第一个分片(即片偏移为0,包含TCP/UDP的头部),则会产生ICMP差错报文给发送端;如果未收到该IP数据报的第一个分片,则不产生ICMP差错报文。(为什么只有在收到第一个IP分片后才会产生ICMP差错报文,请参考: 第三章:IP 网际协议 )

关于TCP分段和IP分片

1. IP分片产生的原因是网络层的MTU;TCP分段产生原因是MSS(最大报文段);

2. IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组;

3.对于以太网,MSS为1460字节,而MUT往往会大于MSS。

在这里插入图片描述

标识位:每个IP数据报都有唯一的标识符,通常多发一个包这个标识就+1(操作系统不一样可能也不一样),由这个数据报可能产生了很多分片,但是每个分片的标识位都是一样的,当抵达最终目的地时,网络层会根据标识位相同的数据包进行重组,然后交给传输层,这时对两端的传输层来说,它们是不知道数据报有没有被分片过(透明的),只知道完整的收到了对端的数据。

CU:没有使用

DF:分片(0)或者不分片(1),如果对DF设置值为1,而且数据报的大小又大于路径MTU,那么中间的路由器会把数据报给丢到,并发送一个ICMP差错报文“需要分片,但是设置了DF位”

MF:标识该分片是不是数据报的最后一片,1表示不是最后一片,0表示是最后一片

片偏移:指出较长的分钟再分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。也就是说,每个分片的长度一定是8字节(64位)的整数倍。

例子:一数据报的总长度为3820字节,其数据部分为3800字节长(使用固定首部),需要分片为长度不超过1420字节的数据报片。因固定首部长度为20字节,因此每个数据报片的数据部分长度不能超过1400字节。于是分成3个数据报片,其数据部分的长度分别分为1400,1400和1000字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。
在这里插入图片描述
当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据分片,传输过程中,哪怕丢失一片数据也要重传整个数据报。IP本身没有超时重传的机制,由更高层的TCP来完成,一些UDP应用程序也具有超时和重传。

在分片时,除最后一片外,其他每一片中的数据部(除IP首部外的其余部分)必须是8字节的整数倍。只有第一个分片携带四层信息,IP数据报(从传输层给网络层,由网络层发下来的数据叫数据报)是指IP层端到端的传输单元(分片之前和重组之后),分组(在网络中传输的叫分组)是指IP层和链路层之间传送的数据单元。一个分组可以是一个完整的IP数据报,也可以是IP数据报的一个分片。

二、ICMP不可达差错(需要分片)

在这里插入图片描述
在出接口查MTU

当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特,路由器就会返回一个ICMP不可达信息。

Ping的时候DF置为不分片(echo设置DF位,echo-reply也会设置DF位),A去B的时候可能数据报大小小于MTU,但是回来的时候却大于MTU,这时A就会显示超时,不会收到ICMP不可达信息,而是由B收到ICMP不可达信息。

MTU发现机制,在IPsec VPN中,要防止IP分片,因为有分片的话会严重影响效率,所以两台路由器都会做一个 path MTU发现技术,发送一个数据报为1500字节的IP数据报,并且DF置1。如果中间路由器MTU比1500小,就会对源端发送一个ICMP不可达信息,在这个ICMP不可达信息中,携带此路由器的最大MTU值,这时源端主机收到后修改数据报大小继续发送,如果中间路由器还有更小的,又会向源发送一个ICMP不可达信息,源端主机再次修改,如此重复,只到到达目的地,就知道单向路径MTU的最小值了。

猜你喜欢

转载自blog.csdn.net/weixin_44233369/article/details/87734986