卷2 第8章 IP:网际协议
8.1 引言
本章讨论IP分组结构和基本处理过程。
8.2 代码介绍
netinet/ip.h:IP定义netinet/ip_var.h:IP实现定义netinet/ip_input.c:IP输入netinet/ip_output.c:IP输出netinet/ip_forward.c:IP转发
8.3 IP分组
术语
- 报文:传输协议交给IP的数据
- 数据报:报文 + IP首部
- 分片:数据报的分段
- 分组:链路层传输单元
ip结构
struct ip {
u_char ip_v:4; // 版本
u_char ip_hl:4; // 首部长度
u_char ip_tos; // 服务类型
u_short ip_len; // 总长度
u_short ip_id; // 标识
u_short ip_off; // 偏移+标志
u_char ip_ttl; // 生存时间
u_char ip_p; // 协议
u_short ip_sum; // 检验和
struct in_addr ip_src, ip_dst;
};8.4 输入处理:ipintr函数
验证步骤 检查版本(4)
检查首部长度
计算检验和
转换字节序
验证总长度
转发判断 目的地址匹配本地接口 → 本地交付
否则 → 转发(如果ipforwarding=1)
8.5 转发:ip_forward函数
检查TTL
选择下一跳路由
发送ICMP重定向(如果需要)
调用ip_output
8.6 输出处理:ip_output函数
首部初始化 设置版本、ID、HL
处理选项
路由选择 检查高速缓存
旁路选路(IP_ROUTETOIF)
路由表查找
源地址选择 使用输出接口地址
广播地址特殊处理
分片 MTU检查
需要时分片
8.7 Internet检验和:in_cksum函数
16bit反码和
延迟进位技术
循环展开优化
8.8 setsockopt和getsockopt
IP选项 选项 说明 IP_OPTIONS IP选项 IP_TOS 服务类型 IP_TTL TTL IP_RECVDSTADDR 接收目的地址
8.9 ip_sysctl函数
可配置参数 常量 说明 IPCTL_FORWARDING 转发 IPCTL_SENDREDIRECTS 重定向 IPCTL_DEFTLL 默认TTL
8.10 小结
IP输入验证分组并决定本地交付或转发。输出处理首部、选路、分片。