计算机网络•自顶向下方法:IP分片与重组
IP协议
数据报格式
IP分片与重组
链路层帧能承载的最大数据字节数称为MTU (Max Transmission Unit)
- 不同类型的链路可能具有不同的MTU
- 以太网帧最多携带1500字节载荷,有些广域网帧只能携带576字节载荷
传输过程中,较大的IP数据报可以被分片:
- 将数据报载荷划分为若干较小的数据块,每个数据块封装成一个独立的数据报传输
- 数据报在传输的过程中可以被多次分片,但仅在目的主机上重组
分片的报头
分片的报头取自原始数据报
与分片有关的字段:
- 标识:每个分片必须携带与原始数据报相同的标识
- 偏移量:指示分片中的数据在原始数据报载荷中的位置
- 标志位:
- MF(more fragments):最后一个分片的MF=0,其余分片的MF=1
- DF(don’t fragment):DF=1表示不允许对数据报分片
分片报头中的以下字段需要修改:
总长度,偏移量,MF,TTL,头部检查和
分片的数据长度
假设原始数据报的报头长度为H,分片的数据长度 N,应满足:H+N ≦ MTU
由于偏移量只有13比特,除最后一个分片外,其余分片的数据长度应为8字节的整倍数
考虑到分组传输效率,除最后一个分片外,分片的数据长度 N 应为满足以上两个条件的最大整数
数据报分片的处理过程
- 根据报头长度H和输出线路的MTU,确定分片的最大数据长度N
- 将数据报的载荷划分成长度为N的若干数据块(最后一个数据块可能不足N字节)
- 将原始报头加到每一个数据块的前面,修改报头中的以下字段:
- 总长度 = H + 数据块长度
- 最后一个报头的MF位置0,其余报头的MF位置1
- 偏移量 = 数据块在原始数据报载荷中的字节序号/8
- TTL=TTL-1
- 计算头部检查和
分片的例子
例:要将一个总长度=4000字节的IP包发送到MTU=1500字节的链路上,IP报头长度H=20字节
数据块最大长度 N = 1480字节
原始数据报的载荷(3980字节)被分成三个数据块,长度分别为1480字节、1480字节和1020字节
分片序号 | 总长度 | MF | 偏移量 |
---|---|---|---|
1 | 1500(=1480+20) | 1 | 0 |
2 | 1500(=1480+20) | 1 | 185(=1480/8) |
3 | 1040(=1020+20) | 0 | 370(=185+185) |
重组
将收到的分片重新组装成原始数据报的过程称为重组,重组在目的主机中进行:
- 收集分片:目的主机使用 <源IP地址,标识> 确定属于同一个数据报的分片
- 利用最后一个分片(MF=0)计算原始数据报长度:
- 原始数据报长度=偏移量×8 + 分片总长度
- 原始数据报载荷=偏移量×8 +(分片总长度 – 报头长度)
- 组装:将各分片中的数据块按照其在原始数据报载荷中的偏移量重组
分片的问题
分片的开销:
- 降低了路由器的吞吐量
- 消耗了目的主机的资源:每个重组的数据报需要一个重组缓冲区和一个重组定时器
针对分片的DoS攻击:
- 攻击者发送一系列奇怪的分片,消耗目的主机的资源
IPv6取消了路由器分片的功能:
- 源主机发送探测报文,确定路径上的最小MTU
- 源主机构造的数据报大小不超过最小MTU
- 路由器丢弃超大的数据报,并发送错误报告