卷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执行分用。