首页 > 代码库 > 《TCP/IP详解卷2:实现》笔记--域和协议

《TCP/IP详解卷2:实现》笔记--域和协议

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Net/3组把协议关联到一个域,并且用一个协议族常量来标识每个域。Net/3还通过所有的编址方法将协议分组。在一个域中</span>

的每个协议使用同类地址,并且每种地址只被一个域使用。作为结果,一个域能通过它的协议族或地址族常量唯一标识。

下图是是我们讨论的协议和常量。



1.domain结构

一个协议有一个下图所示的domain结构来表示。

下图显示了一个domains列表的例子。


2.protosw结构

在编译期间,Net/3为内核中每个协议分配一个protosw结构并初始化,同时将在一个域中的所有协议的这个结构组织到一个
数组中,每个domain结构引用相应的protosw结构数组。一个内核可以通过提供多个protosw项为同一协议提供多个接口。
protosw结构的定义如下:

pr_type可能的值和对应的Internet协议如下图所示。

pr_flags的值如下图所示。


pr_input,pr_output,pr_ctlinput,pr_ctloutput和pr_usrreq这几个函数的关系如下下图所示:


3.IP的domain和protosw结构

申明所有协议的结构domain和protosw,并进行静态初始化。对于Internet协议,inetsw数组包含protosw结构,下图总结了
在数组inetsw中协议信息。

下图为Internet协议的数组定义和domain结构的定义。

domaininit函数:
在系统初始化期间,在main函数中,内核调用domaininit来链接结构domain和protosw。
下图显示了链接的结构domain和protosw,它们
配置在内核中来支持Internnet、Unix和OSI协议族。


4.pfctlinput函数

函数pfctlinput给每个域中的每个协议发送一个控制请求,当可能影响每个协议的事件发生时,使用这个函数,例如一个接口
被关闭,或路由表发生变化,当一个ICMP重定向报文到达时,ICMP调用pfctlinput,因为重定向会影响所有Internet协议。
函数通过遍历每个域,然后遍历每个域下面的protosw,最终调用protosw中的pr_ctlinput函数。

5.sysctl系统调用

系统调用sysctl访问并修改Net/3系统范围参数。系统管理员通过程序sysctl修改这些参数。每个参数有一个分层的整数列表
来标识,并由一个相应的类型,此系统调用的原型为:
int sysctl(int *name, u_int namelen, void *old, size_t * oldlenp, void *new, size_t newlen) ;
*name指向一个包含namelen个整数的数组。*old指向在此范围内返回的旧值,*new指向在此范围内传递的新值。
下图总结了关于联网名称的组织。
在上图中,IP转发标志的全名为:
CTL_NET、PF_INET、0、IPCTL_FORWARDING
用4个整数存储在一个数组中。

net_sysctl函数:
每层的sysctl命名方案通过不同函数处理。下图显示了处理这些Internet参数的函数。

顶层名称由sysctl处理。网络层名称由net_sysctl处理,它根据族和协议将控制转给此协议的protosw项指定的pr_sysctl函数。