卷2 第32章 原始IP
32.1 引言
原始IP插口(SOCK_RAW)提供三种功能:
- 发送/接收ICMP、IGMP
- 构造自己的IP首部
- 支持内核不认识的IP协议
32.2 代码介绍
netinet/raw_ip.c:原始IP函数
32.3 原始IP的protosw结构
| 协议 | 说明 |
|---|---|
| IPPROTO_ICMP | ICMP原始插口 |
| IPPROTO_IGMP | IGMP原始插口 |
| IPPROTO_RAW | 原始IP(255) |
| 0 | 通配(默认) |
32.4 rip_init函数
- 初始化原始IP PCB表
32.5 rip_input函数
分用规则
- 协议匹配
- 本地地址匹配
- 远端地址匹配
处理流程
- 遍历所有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首部和内核不认识的协议。