分类: BSD
2014-04-27 04:50:50
本文是在通过对4.4BSD-lite版本中的部分源代码的学习基础上,重点研究了BSD实现中的数据结构和函数功能,从而分析 Berkeley联网程序的代码实现TCP/IP协议栈的架构。由于时间和篇幅有限,本文对接口层进行了详细分析,对其他协议层进行了总体分析,通过分析对BSD协议栈架构思想形成了初步的了解。
在BSD实现中,操作系统的内核中联网代码被分成三层组织:接口层、协议层和插口层。在内核之外,操作系统向应用层提供网络编程API,应用程序可以通过API函数的操作,完成对内核协议的数据传输和控制。网络编程API是在用户空间实现的,函数内部通过系统调用来操作应用层无法直接调用的协议。在BSD实现中接口层、协议层和插口层的分层结构于标准OSI模型的对应关系如图所示。接口层位于BSD协议栈的底部,BSD协议栈主要针对以太网接口、SLIP接口和环回接口三种网络接口,接口层为网络接口提供驱动程序。在操作系统初始化时,接口层初始化程序会初始化接口层数据结构,其中包括以太网接口、SLIP接口和环回接口对应的数据结构。
在ifaddr结构中包含了网络接口的地址信息。操作系统内核通过分配一个ifaddr结构和两个sockaddr_dl结构来构造一个链路层地址,其中一个是链路层地址本身,另一个是地址掩码。链路层地址由一个逻辑地址和一个硬件地址组成。
在链路层初始化过程中,操作系统为每个网络接口分配一个ifnet和ifaddr结构,结构ifnet链接成ifnet链表,每个接口的链路层地址被初始化,并被加入到ifnet结构的地址链表中,还存放到if_addrs数组中。
协议层主要讨论IP协议处理,协议层主要数据结构包括domain结构和protosw结构。每一个domain结构中通过函数指针,可以对对应的协议域进行操作,并且指明了访问权限,不同域的domain结构通过指针连接为链表。protosw结构对协议域提供了标识和表征协议,同时提供了从其他函数访问本协议的函数指针,并且提供了对本协议进行操作的处理函数。在BSD实现中,所有协议的domain结构和protosw结构需要静态初始化,对于protosw结构使用protosw结构数组进行初始化。
协议层通过相应函数的的操作,完成IP协议层的处理。协议层通过初始函数生成domain链表和协议域对应的协议的protosw结构。协议层提供了对IP包进行配置和操作的函数,实现了不同域的多种IP层协议。在BSD实现中,协议层使用协议控制块(PCB)存放UDP和TCP插口所需要的多个信息片。通过引入协议控制块来实现位于传输层的UDP和TCP,每一个Internet插口都有一个相关的PCB,它包含了本地和外部IP地址,指向一个路由结构的指针等。对于给定的协议所有的PCB都放在该协议维护的一个双向链表上。在BSD实现中,通过提供多个操作PCB的函数,对UDP、TCP的PCB进行操作,实现UDP、TCP协议。
BSD实现中插口层产生的知道思想是为了提供一个统一的访问网络和进程间通信协议的接口。插口层的主要功能是:将进程发送的与协议有光的请求,映射到产生插口时指定的与协议有关的实现。为了允许标准的UNIX I/O调用,也能读写网络连接,在BSD实现中文件系统和网络功能集成在系统调用级。在插口层主要的数据结构包括socket结构,socket结构标识了一条通信链路的一端,包含着与链路有关的所有信息,包括:使用的协议、协议的状态信息、源地址和目的地址、到达的链接队列、数据缓存和可选标志。
插口层的重点在于通过系统调用实现进程访问网络的统一标准。在BSD实现中,操作系统内核通过对其他协议层层级调用实现了多个标准系统调用函数,包括socket(),bind(),listen(),connect(),close()等。这些系统调用都在操作系统内核实现,为用户态的进程提供了统一了系统调用接口。
本文是在粗略阅读了