数据包分片和重组 && MTU与MSS

本文探讨了IP分片的概念及其在网络传输中的作用,重点介绍了路径MTU发现技术的工作原理,以及不同网络环境下如何避免IP分片以提高传输效率。

 

前言

 

任何一台主机都有必要对IP分片进行相应的处理。

分片往往出现在网络上遇到比较大的报文无法一下子发送出去才会进行处理。

 

正文

比如说在前一个FDDI链路中的报文大小为4352字节,小于其MTU所以能够安全传送。如果经过一个路由器后,跳到以太网链路,由于以太链路的MTU为1500字节,所以显然报文无法传输。因此,路由器会将其分片成三个报文段进行分别顺序发送。这里分片的任务交给了路由器,而经过分片之后的IP数据报在重组的时候,只能在目标主机上进行。


显然,随着网络的流量的提升,一旦出现较多的分片 情况的话,路由器的负担便会加重。也会降低网络的传输效率。同时也是出于网络安全的考虑。

因此,引入路径MTU发现(Path MTU Discovery )

使用了路径MTU发现技术后,使得路由器可以提前得知下一个链路的MTU大小。

在传送过来的报文中,由于首先在发送端主机发送IP数据报的时候将其首部的分片禁止标志位设置为1,根据这个标志位,在遇到下一个路由器的时候就不会进行分片处理,而是直接弃包。同时路由器通过一个ICMP的不可达消息将数据链路的MTU发送给主机。主机接收到这个值后在下一次发送报文的时候,IP层进行分片。

IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。

注意:

1)对于UDP,由于UDP是不可重发的。UDP一般数据包大小会限制在512字节。

Internet大多数网络接口MTU>512,即使DNS报文 + UDP+ IP= 512+8+20=540,这个大小几乎可以在Internet上畅通无阻,而无需IP分片。

为何IP分片不好?
一个UDP报文如果因为size > MTU,则会被IP层分成两片或者多片,但是只有一片有端口号,由于其它分片没有端口号能否通过防火墙则完全看防火墙的脸色,所以对于能否通信成功是一个未知数。

如果防火墙网开一面,不检查端口号,分片可以全部通行,到目的地再组装到一起,IP层提交给UDP/DNS,一点问题没有。但是防火墙的安全功能大打折扣,如何阻止非法的外来攻击包?

如果防火墙严格检查端口号,则没有端口号的分片则统统丢弃,造成通信障碍。

所以选择一个合适的UDP size至关重要,避免分片。

 

2)而对于TCP而言,由于是可重发的,所以第一次弃包(发送失败)的时候,主机接收到路由器返回来的MTU值。根据TCP重发处理,数据包会被重新发送,在IP层进行分片。

 


MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。

MSS:maximum segment size,最大分节大小,为TCP数据包每次传输的最大数据分段大小,一般由发送端向对端TCP通知对端在每个分节中能发送的最大TCP数据。MSS值为MTU值减去IPv4 Header(20 Byte)和TCP header(20 Byte)得到

分片:若一IP数据报大小超过相应链路的MTU的时候,IPV4和IPV6都执行分片(fragmentation),各片段到达目的地前通常不会被重组(re-assembling)。IPV4主机对其产生的数据报执行分片,IPV4路由器对其转发的数据也执行分片。然而IPV6只在数据产生的主机执行分片;IPV6路由器对其转发的数据不执行分片。

 

例如:一个以太网上的主机和一个令牌环网上的主机间建立连接,其中以太网上主机通告的MSS为1460,令牌环网上主机通告的MSS为4096。观察分组,在两个方向上都找不到大于1460字节的数据,为什么?

        令牌环网上发送到以太网的数据大小不大于1460字节的原因是因为以太网上主要通告的MSS值就为1460个字节,所以令牌环网上发送出去的数据的长度不能够大于MSS值;令牌环网上主机通告的MSS值为4096,也即是说以太网能够发送到令牌环网上的TCP净荷值为4096,但是以太网的MTU值又是由硬件所决定的,最大只支持1500(包括IP头至少20B和TCP头至少20B),为避免分片,因此以太网发送到令牌环网的数据的净荷也为1500-20-20=1460B,所以两个方向的净数据长度不会大于1460字节。

 

 

 

 

<think>我们讨论的是网络通信中的分片重组(Fragmentation and Reassembly)。在IP协议中,当数据包的大小超过网络链路的最大传输单元(MTU)时,路由器会将数据包分割成多个较小的片段(分片),这些片段在到达目的地主机后再重新组合成原始数据包重组)。 ### 分片重组的过程 1. **分片的原因**: - 不同的物理网络可能有不同的MTU(例如以太网MTU为1500字节)。 - 当IP数据包MTU较大的网络进入MTU较小的网络时,如果数据包大小超过新网络的MTU,则必须分片。 2. **分片过程**: - 路由器将原始IP数据包分割成多个片段,每个片段都包含一个IP头部(大部分字段复制自原始头部,但有些字段需要修改)。 - 关键字段: - **标识(Identification)**:同一原始数据包的所有分片具有相同的标识值,用于重组时识别属于同一个数据包。 - **标志(Flags)**: - **DF(Don't Fragment)**:如果该位为1,则不允许分片(如果数据包超过MTU且DF=1,则丢弃并发送ICMP错误消息)。 - **MF(More Fragments)**:除了最后一个分片,其他分片都置为1,表示后面还有分片。 - **片偏移(Fragment Offset)**:表示当前分片的数据部分在原始数据包中的位置(以8字节为单位)。 3. **重组过程**: - 目的主机收到分片后,根据标识字段将属于同一个原始数据包分片收集起来。 - 然后根据片偏移进行排序,并检查是否所有分片都已到达(通过MF标志偏移量判断)。 - 一旦所有分片到达,将数据部分按顺序组合,还原原始数据包,然后交给上层协议。 ### 示例 假设一个原始IP数据包总长度为4000字节(包括20字节IP头部,数据部分3980字节),需要经过一个MTU为1500字节的网络。分片如下: - **分片1**: - 偏移量:0 - MF:1(表示还有后续分片) - 长度:1480(数据部分) + 20(头部)= 1500字节(MTU允许的最大值) - **分片2**: - 偏移量:1480/8 = 185 - MF:1 - 长度:1480 + 20 = 1500字节 - **分片3**: - 偏移量:2960/8 = 370 - MF:0(最后一个分片) - 长度:1020(剩余数据:3980-2960=1020) + 20 = 1040字节 注意:每个分片的数据长度必须是8的整数倍(除了最后一个分片),因为片偏移以8字节为单位。 ### 重要规则 - 只有目的地主机进行重组,中间路由器不会重组。 - 如果任何分片丢失,整个数据包将被丢弃(重组失败),并由ICMP通知上层协议(如TCP会重传)。 §§相关问题§§ 1. 在IP分片中,为什么片偏移量要以8字节为单位?如果以1字节为单位会有什么问题? 2. 如果一个分片在传输过程中丢失,目的地主机如何处理?会通知发送方吗? 3. 在IPv6中,分片重组机制IPv4有什么主要区别? 4. 如何避免IP分片?在应用层传输层可以采取哪些措施? 5. 分片重组过程中,如何检测分片是否丢失或重复?</think>### 分片重组详解 分片(Fragmentation)重组(Reassembly)是网络通信中处理大数据包的核心机制,用于解决**数据包大小超过链路MTU(最大传输单元)** 的问题。以下是具体原理过程: --- #### **一、分片(Fragmentation)** 当数据包长度 > 链路MTU时,路由器或发送方主机将其切割为多个小片段: 1. **触发条件**: - 数据包长度 > 当前链路MTU(如以太网MTU=1500字节)。 - **DF标志位=0**(Don't Fragment,若DF=1则丢弃包并返回ICMP错误)。 2. **分片规则**: - **每个分片独立封装**:包含独立的IP头部(复制原头部关键字段)。 - **关键字段修改**: | 字段 | 修改说明 | |---------------|--------------------------------------------------------------------------| | **总长度** | 更新为分片后长度(头部+数据) | | **片偏移** | 表示当前分片数据在原数据包中的位置(以**8字节**为单位) | | **MF标志** | More Fragments:<br> - 最后一个分片置`0`,其他分片置`1` | | **标识符** | 所有分片保持相同值,用于重组时识别同属一个数据包 | 3. **分片示例**: - 原始包:数据长度3800字节,IP头部20字节,MTU=1500字节。 ``` 分片1:总长度=1500(20头+1480数据),偏移=0,MF=1 分片2:总长度=1500(20头+1480数据),偏移=185(1480/8),MF=1 分片3:总长度=900(20头+880数据),偏移=370(2960/8),MF=0 ``` --- #### **二、重组(Reassembly)** 由**目的主机**完成分片重组: 1. **重组条件**: - 所有分片必须具有相同的**标识符、源IP、目的IP、协议号**。 - 分片必须按顺序到达(乱序不影响重组,但需缓存)。 2. **重组过程**: - **缓存分片**:根据标识符源/目的IP建立重组队列。 - **检测完整性**: - 检查首个分片偏移=0且MF=1。 - 检查末位分片MF=0。 - 通过片偏移计算数据总长度(偏移量×8 + 当前分片数据长度)。 - **超时机制**: - 若60秒内未收到全部分片,丢弃所有分片并发送ICMP超时错误。 3. **重组示例**: ``` 收到分片:标识符=12345, 偏移=0, MF=1 → 缓存 收到分片:标识符=12345, 偏移=370, MF=0 → 缓存 收到分片:标识符=12345, 偏移=185, MF=1 → 缓存 检测:偏移0+185+370覆盖全部数据 → 按偏移排序重组 ``` --- #### **三、关键注意事项** 1. **分片位置**: - IPv4:路由器或发送方可分片。 - IPv6:**仅发送方主机可分片**,路由器不分片(需依赖PMTUD)。 2. **性能影响**: - 分片增加头部开销(每个分片20字节IP头)。 - 重组消耗目的主机CPU/内存资源。 3. **避免分片**: - 应用层:使用`setsockopt()`设置`IP_MTU_DISCOVER`(如DF=1强制不分片)。 - 传输层:TCP通过MSS协商自动限制分段大小(MSS=MTU-40)。 > 💡 **典型场景**: > - UDP大包(如DNS响应>1500字节)可能被分片。 > - ICMP Echo Request(ping大包)触发分片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值