卷2 第32章 原始IP

32.1 引言

原始IP插口(SOCK_RAW)提供三种功能:

  1. 发送/接收ICMP、IGMP
  2. 构造自己的IP首部
  3. 支持内核不认识的IP协议

32.2 代码介绍

  • netinet/raw_ip.c:原始IP函数

32.3 原始IP的protosw结构

协议说明
IPPROTO_ICMPICMP原始插口
IPPROTO_IGMPIGMP原始插口
IPPROTO_RAW原始IP(255)
0通配(默认)

32.4 rip_init函数

  • 初始化原始IP PCB表

32.5 rip_input函数

分用规则

  1. 协议匹配
  2. 本地地址匹配
  3. 远端地址匹配

处理流程

  • 遍历所有PCB
  • 复制数据报到匹配插口
  • 无匹配则丢弃

32.6 rip_output函数

内核填充首部

  • 设置协议、TOS、TTL
  • 调用ip_output

IP_HDRINCL选项

  • 应用进程提供完整首部
  • IP只填充ID字段

32.7 rip_usrreq函数

PRU_ATTACH

  • 检查超级用户权限
  • 分配PCB
  • 保存协议号

PRU_BIND

  • 绑定本地地址

PRU_CONNECT

  • 设置远端地址

PRU_DISCONNECT

  • 清除远端地址

PRU_SEND

  • 调用rip_output

32.8 rip_ctloutput函数

IP_HDRINCL

  • 控制首部包含

多播选路选项

选项说明
DVMRP_INIT初始化
DVMRP_DONE关闭
DVMRP_ADD_VIF添加虚拟接口
DVMRP_DEL_VIF删除虚拟接口

32.9 小结

原始IP插口允许应用进程直接访问IP层。支持自定义IP首部和内核不认识的协议。