1. IP分片基础:IP分片产生的背景、分片原理与MTU概念
1.1 为什么需要IP分片?—— 链路层的“尺寸天花板”
IP协议在设计之初就面临一个根本矛盾:IP层希望传输任意大小的数据包,但底层的链路层(如以太网、Wi-Fi、PPP等)对每一帧能够承载的最大数据量有严格限制。这个限制被称为最大传输单元(MTU,Maximum Transmission Unit)。
当IP层准备将一个数据报发送给链路层时,如果IP数据报的总长度超过了出接口的MTU,就必须将其拆分成多个较小的片段,每个片段独立地在网络中传输,到达目的地后再重新组装成原始数据报。这个过程就是IP分片(IP Fragmentation)。
核心矛盾:IP层“无界” vs 链路层“有界”。分片是IP协议为了适配异构网络而引入的妥协机制。
常见链路层MTU值对比
| 链路层技术 | 典型MTU(字节) | 备注 |
|---|---|---|
| 以太网(Ethernet v2) | 1500 | 互联网最普遍的MTU |
| PPPoE(宽带拨号) | 1492 | 以太网MTU减去8字节PPPoE头部 |
| Wi-Fi(802.11) | 2304 | 通常受以太网封装限制,实际常见1500 |
| 令牌环(Token Ring) | 4464 | 传统局域网技术 |
| FDDI | 4352 | 光纤分布式数据接口 |
| ATM(AAL5) | 9180 | 异步传输模式 |
| “巨帧”(Jumbo Frame) | 9000 | 数据中心内部常用,需端到端支持 |
| 环回接口(Loopback) | 65535 | 通常不分片 |
MTU发现(Path MTU Discovery):现代TCP/IP协议栈更倾向于在发送前探测整条路径上的最小MTU(PMTU),从而在源端避免分片,而不是依赖中间路由器分片。这是性能优化的关键方向。
1.2 IP分片原理:拆解与重组
IP分片的核心逻辑由IPv4头部中的三个字段驱动:标识符(Identification)、标志(Flags)和片偏移(Fragment Offset)。
分片相关IPv4头部字段
| 字段 | 长度(位) | 作用 |
|---|---|---|
| Identification | 16 | 标识原始IP数据报。同一原始数据报的所有分片共享相同的Identification值。 |
| Flags | 3 | 第0位:保留(必须为0);第1位(DF):禁止分片;第2位(MF):更多分片,为1表示后面还有分片,为0表示最后一个分片。 |
| Fragment Offset | 13 | 指示该分片在原始数据报中的位置,以8字节为单位。接收方据此重组。 |
分片规则
- 分片必须发生在8字节边界上:除了最后一个分片,每个分片的数据部分长度必须是8的倍数。
- 每个分片都包含IP头部:分片后的每个片段都是一个独立的IP数据报,拥有完整的IP头部(除了部分字段被修改)。
- DF位(Don't Fragment):如果DF位被设置为1,则路由器不能对该数据报进行分片。如果此时数据报长度超过MTU,路由器会丢弃该数据报并返回ICMP“需要分片但设置了DF位”错误。
- MF位(More Fragments):除了最后一个分片,所有分片的MF位都设置为1。最后一个分片的MF位为0。
分片与重组流程SVG图
1.3 分片带来的性能问题与优化动机
IP分片虽然在协议层面解决了异构网络适配问题,但在实际高性能网络环境中,它带来了显著的性能开销:
- 头部开销增加:每个分片都需要携带完整的IP头部(20字节,不含选项),导致有效载荷占比下降。
- 重组复杂度:接收端需要维护重组缓冲区,等待所有分片到达。分片丢失会导致整个原始数据报无法重组,触发超时重传。
- 安全风险:分片重叠、分片攻击等安全漏洞可能被利用。
- 硬件卸载困难:分片和重组逻辑难以在网卡硬件中高效实现,通常由CPU处理,消耗大量计算资源。
性能调优启示:在高速网络(如10G/25G/100G)中,应尽量避免IP分片。现代协议栈通过GRO(Generic Receive Offload)和TSO(TCP Segmentation Offload)等技术,在数据路径上合并或避免分片,是提升网络吞吐量的关键手段。后续章节将深入分析这些技术。
1.4 分片计算示例
假设一个IP数据报总长度为4000字节(包含20字节IP头部),需要从一个MTU为1500字节的接口发出。计算分片结果:
- 每个分片的最大数据长度:1500(MTU) - 20(IP头部) = 1480字节。
- 分片数量:ceil((4000 - 20) / 1480) = ceil(3980 / 1480) = ceil(2.689) = 3个分片。
- 分片详情:
| 分片 | 数据长度(字节) | 片偏移(8字节单位) | MF位 | 总长度(字节) |
|---|---|---|---|---|
| 1 | 1480 | 0 | 1 | 1500 |
| 2 | 1480 | 185(1480/8) | 1 | 1500 |
| 3 | 1020(3980 - 1480*2) | 370(2960/8) | 0 | 1040 |
注意:片偏移字段以8字节为单位,因此1480字节的数据对应偏移值为185(1480/8)。最后一个分片的MF位为0,表示这是最后一个分片。
1.5 本章小结
- MTU是链路层对IP数据报长度的硬性约束,是分片产生的根本原因。
- IP分片通过Identification、Flags(MF)和Fragment Offset三个字段实现拆解与重组。
- 分片虽然解决了协议兼容性问题,但带来了性能开销和安全风险,是现代网络性能调优需要重点规避和优化的对象。
- 理解分片原理是后续学习GRO合并、TSO等高级卸载技术的基础。