引言
在上一章节中,我们详细讨论了IP的分类和无分类原则的原理以及其在网络通信中的应用。IP分片与重组是在数据包传输过程中起到关键作用的机制。当数据包的大小超过网络链路的MTU(最大传输单元)限制时,IP分片将数据包分割为多个较小的分片进行传输。这些分片在网络中独立传输,到达目的地后,通过IP重组机制将它们重新组合成完整的数据包。这种分片和重组的过程确保了大尺寸的数据包能够在网络中进行传输,同时保证了数据的完整性和可靠性。在本章节中,我们将深入探讨IP分片与重组的工作原理。
IP 分片与重组
不同的数据链路具有不同的最大传输单元(MTU),例如FDDI数据链路的MTU为4352字节,以太网的MTU为1500字节。MTU代表最大传输单元(Maximum Transmission Unit),指的是网络中可以传输的最大数据包大小。
FDDI(Fiber Distributed Data Interface)是一种高速局域网(LAN)标准,使用光纤作为传输介质。MTU(Maximum Transmission Unit)是指一个数据链路层协议所能传输的最大数据包大小。在FDDI网络中,MTU的大小是4352字节。这意味着在FDDI网络中,数据链路层协议能够传输的最大数据包大小为4352字节。如果要传输的数据包超过这个大小,就需要进行分片,将数据包分割成适合MTU大小的多个分片进行传输,并在接收端进行重组。
对于以太网来说,MTU的大小通常是1500字节。这意味着以太网可以传输最大为1500字节的数据包。如果数据包的大小超过了MTU的限制,那么数据包将被分片为更小的片段进行传输,并在目的地重新组装。分片后的IP数据报在重新组装时只能由目标主机进行,路由器不会进行重组操作。
之前我们还说过TCP报文段,不知道还有没有印象,MSS是最大段大小(Maximum Segment Size)的缩写,它在TCP协议中扮演着重要的角色。MSS指的是在TCP连接中允许发送的最大数据段的大小。与MTU类似,MSS也是用来限制数据包的大小,但是它是在传输层,即TCP协议层进行限制。TCP协议通过将应用层的数据分成多个数据段来传输,而每个数据段的大小受到MSS的限制。
每种数据链路的MTU之所以不同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的MTU也就不同。
假设发送方要发送一个4000字节的大数据报,在以太网链路上传输,就需要将该数据报分片成3个小数据报进行传输。这是因为每个小数据报的大小不能超过MTU限制,即1500字节。接收方在收到这3个小数据报后,会根据每个数据报的序号和偏移量,将它们重组成原始的4000字节的大数据报。
在分片传输中,一旦某个分片丢失,则会造成整个IP数据报作废。为了避免这种情况,TCP引入了MSS,即在TCP层进行分片,而不是由IP层进行分片。这样做的好处是,TCP可以更加精确地控制每个数据段的大小,避免了IP层分片可能引发的问题。
对于UDP协议来说,我们尽量不要发送一个大于MTU的数据报文。这是因为UDP是面向无连接的传输协议,它不提供像TCP那样的可靠性和重传机制。如果我们发送一个大于MTU的UDP数据报文,它将被IP层进行分片传输。一旦其中某个分片丢失,UDP协议无法进行重传,导致数据的丢失。因此,为了确保数据的可靠传输,我们应尽量将UDP数据报文的大小控制在MTU之内,避免分片传输。
为什么IP层会分片,TCP还要分段
由于在网络传输中,IP层会自动对数据包进行分片,即使TCP层不对数据进行分段,数据包也会被IP层自动分片并正常传输。因此,TCP为什么还需要进行分段呢?难道这不是多此一举吗?
假设有一份较大的数据在TCP层不进行分段,在传输过程中发生了丢包现象,TCP会进行重传,但重传的单位却是整个大份数据(尽管IP层会将数据切分为多个小包,每个小包的长度为MTU)。这是因为IP层并不关心数据的可靠性传输。
换句话说,在一台机器的传输层到网络层这条链路上,如果传输层对数据进行分段,那么IP层就不会再进行分片。如果传输层没有进行分段,那么IP层就有可能进行分片。
简单来说,TCP对数据进行分段的目的是为了让IP层不再进行分片,并且在发生重传时只重传已经分段的小份数据。这样可以提高传输效率和可靠性。
TCP分段了,IP层就一定不会分片了吗
在上述讨论中,我们提到了在发送端进行TCP分段后,IP层就不会再进行分片。然而,在整个传输链路中,可能还存在其他网络层设备,这些设备的最大传输单元(MTU)可能小于发送端的MTU。因此,即使数据包在发送端已经进行了分段,但在经过这些设备的IP层时,仍会再次进行分片。最终,所有的分片将在接收端进行组装。
如果我们能够确定整个链路上的最小MTU,并以此长度发送数据,那么无论数据传输到哪个节点,都不会发生分片。这个整个链路上的最小MTU被称为路径MTU(PMTU)。当IP数据包到达某个路由器时,如果该路由器的MTU小于数据包长度,并且设置了DF(Do not Fragment)标志为1,该路由器将无法对数据包进行分片,只能将其丢弃。在这种情况下,路由器会生成一个ICMP(Internet Control Message Protocol)错误消息,称为“分片需要但被禁止(Fragmentation Needed But DF Set)”。该ICMP错误消息将被发送回源地址,并携带路由器的MTU值。发送端收到该ICMP错误消息后,可以根据其中的MTU值来调整发送的数据包大小,以避免再次发生被禁止分片的情况。
IP分片是一种不得已的行为,我们应尽量避免在IP层进行分片,特别是在链路中的中间设备上进行分片。因此,在IPv6中,已经禁止了中间设备对IP报文进行分片,分片只能在链路的起始和终点进行。
IPv6 基本认识
IPv6是Internet协议第6版,它是IPv4的继任者。IPv6采用128位地址长度,相比IPv4的32位地址长度,可以提供更多的IP地址。这是因为IPv4的地址空间正在逐渐枯竭,而IPv6的地址空间非常庞大,可以满足未来互联网的需求。
当谈论IPv6时,除了提到更多的地址空间外,它还带来了更好的安全性和扩展性,这意味着IPv6相比于IPv4能提供更加出色的网络体验。
虽然IPv6已经存在很长时间,但其在全球范围内的部署仍然相对较慢。这主要是因为IPv6需要与现有的IPv4网络兼容,需要进行过渡和迁移。然而,随着IPv4地址的枯竭以及对IPv6的需求增加,越来越多的互联网服务提供商和组织正在逐步采用IPv6,并逐渐实现IPv6与IPv4的双栈运行。
总结
本章节中,我们深入探讨了IP分片与重组的工作原理。不同的数据链路具有不同的最大传输单元(MTU),当数据包的大小超过MTU限制时,IP分片将数据包分割为多个较小的分片进行传输,到达目的地后通过IP重组机制重新组合成完整的数据包。TCP分段的目的是为了让IP层不再进行分片,并在发生重传时只重传已经分段的小份数据,提高传输效率和可靠性。然而,在整个传输链路中可能存在其他网络层设备,它们的MTU可能小于发送端的MTU,因此数据包仍会在这些设备的IP层进行再次分片。我们应尽量避免在IP层进行分片,特别是在链路中的中间设备上进行分片。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!