卷2 第22章 协议控制块
22.1 引言
协议控制块(PCB)存储UDP和TCP插口的状态信息。
PCB类型
- Internet PCB:UDP和TCP共用
- TCP PCB:TCP专用
22.2 代码介绍
netinet/in_pcb.h:PCB定义netinet/in_pcb.c:PCB函数
22.3 inpcb结构
struct inpcb {
struct inpcb *inp_next, *inp_prev;
struct inpcb *inp_head;
struct in_addr inp_faddr; // 远端IP
u_short inp_fport; // 远端端口
struct in_addr inp_laddr; // 本地IP
u_short inp_lport; // 本地端口
struct socket *inp_socket;
struct route inp_route;
int inp_flags;
struct ip inp_ip;
struct mbuf *inp_options;
};标志 标志 说明 INP_RECVOPTS 接收IP选项 INP_RECVRETOPTS 接收反向选项 INP_RECVDSTADDR 接收目的地址 INP_HDRINCL 包含IP首部
22.4 in_pcballoc和in_pcbdetach
in_pcballoc:分配PCB
in_pcbdetach:释放PCB
22.5 绑定、连接和分用
绑定规则 SO_REUSEADDR:重用地址
SO_REUSEPORT:重用端口
分用规则 完全匹配优先
通配匹配次之
22.6 in_pcblookup函数
匹配规则 比较本地端口
比较本地地址
比较远端地址和端口
最小通配匹配优先
22.7 in_pcbbind函数
绑定本地地址和端口
选择临时端口(1024-5000)
22.8 in_pcbconnect函数
设置远端地址
选择本地地址(路由决定)
验证唯一性
22.9 in_pcbdisconnect函数
断开连接
清除远端地址
22.10 in_setsockaddr和in_setpeeraddr
返回本地/远端地址
22.11 in_pcbnotify、in_rtchange和in_losing
in_pcbnotify 通知PCB差错
处理ICMP差错
in_rtchange 使路由无效
in_losing 路由丢失通知
22.12 实现求精
线性搜索可能成为瓶颈
散列链可提高性能
22.13 小结
PCB存储连接状态。in_pcblookup执行分用。