卷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 分片
分片算法
- 检查DF标志
- 计算分片大小(8字节倍数)
- 创建分片表
- 复制首部和选项
- 复制数据
- 发送各分片
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函数
- 查找匹配ipq
- 超时检查
- 插入分片
- 检查是否完整
- 重装完成时恢复首部
ip_slowtimo
- 每500ms递减TTL
- 超时丢弃分片
10.5 小结
分片在输出时处理,重装在输入时处理。ipq和ipasfrag结构管理分片。