卷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输入验证分组并决定本地交付或转发。输出处理首部、选路、分片。