协议层使用协议控制块(PCB)存放各UDP和TCP插口所要求的多个信息片。Internet协议维护Internet协议控制块
(internet protocol control block)和TCP控制块(TCP control block)。因为UDP是无连接的,所以一个端结点需要的
所有信息都在Internet PCB中找到,不存在UDP控制块。
Internet PCB含有所有UDP和TCP端结点共有的信息:外部和本地IP地址、外部和本地端号、IP首部原型、该端结点使用的
IP选项以及一个指向该端结点目的地址选路表入口的指针。TCP控制块包含了TCP为各连接维护的所有结点信息:两个方向
的序号、窗口大小、重传次数等等。
下图总结了协议控制块以及它们与file和socket结构之间的关系。
图中有几个要点要考虑:
1.当socket或accept创建一个插口后,插口层生成一个file结构和一个socket结构。文件类型是DTYPE_SOCKET,UDP端结点
的插口类型是SOCK_DGRAM,TCP端结点插口类型是SOCK_STREAM。
2.然后调用协议层。UDP创建一个Internet PCB(一个inpcb结构),并把它链接到socket结构上:so_pcb成员指向inpcb结构,
inp_socket成员指向socket结构。
3.TCP做同样的工作,也创建它自己的控制块(一个inpcb结构),并用指针inp_ppcb和t_inpcb把它链接到inpcb上。在两个
UDP inpcb中,inp_ppcb成员是一个空指针,因为UDP不负责维护它自己的控制块。
4.我们显示的其他四个inpcb结构的成员,从inp_faddr到inp_lport,形成了该端结点的插口对:外部IP地址和端口号,以及
本地IP地址和端口号。
5.UDP和TCP用指针inp_next和inp_prev维护一个所有Internet PCB的双向链表。他们在表头分配一个全局inpcb(命名为udb
和tcb),在该结构中使用三个成员:下一个和前一个指针,以及本地端口号。后一个成员中包含了该协议使用的下一个临时
端口号。
Internet PCB是一个传输层数据结构。TCP、UDP和原始IP使用它,但是IP、ICMP或IGMP不用它。
1.inpcb的结构
下图是inpcb结构的定义。inp_next和inp_prev为UDP和TCP的所有PCB形成一个双向链表。另外,每个PCB都