卷2 第10章 IP的分片与重装

10.1 引言

  • 分片:数据报过大时分割
  • 重装:只在目的主机进行

分片字段

字段说明
ip_id标识数据报
ip_off标志+偏移
DF不分片
MF更多分片

10.2 代码介绍

  • netinet/ip_var.h:重装数据结构
  • netinet/ip_output.c:分片代码
  • netinet/ip_input.c:重装代码

10.3 分片

分片算法

  1. 检查DF标志
  2. 计算分片大小(8字节倍数)
  3. 创建分片表
  4. 复制首部和选项
  5. 复制数据
  6. 发送各分片

ip_optcopy函数

  • 复制需要分片的选项
  • 仅复制copied标志=1的选项

10.4 重装

ipq结构

成员说明
ipq_next/prev链表指针
ipq_id数据报ID
ipq_src/dst源/目的地址
ipq_ttl超时

ipasfrag结构

  • 覆盖IP首部存储分片信息
  • 使用ipf_next/prev指针

ip_reass函数

  1. 查找匹配ipq
  2. 超时检查
  3. 插入分片
  4. 检查是否完整
  5. 重装完成时恢复首部

ip_slowtimo

  • 每500ms递减TTL
  • 超时丢弃分片

10.5 小结

分片在输出时处理,重装在输入时处理。ipq和ipasfrag结构管理分片。