Chinaunix首页 | 论坛 | 博客
  • 博客访问: 172855
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 350
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-03 15:44
文章分类

全部博文(13)

文章存档

2015年(3)

2014年(10)

我的朋友

分类: 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接口和环回接口对应的数据结构。

      接口层主要的数据结构包括ifnetifaddress。结构ifnet中包含所有网络接口的通用信息。操作系统初始化时,分别为每个网络设备接口分配一个独立的ifnet结构。有的接口(如slip)仅支持一种协议,有的接口(如以太网)支持多个协议。不同协议编址方式不同,每种协议至少需要一个地址。网络接口也支持同一协议的多个地址。因此一个网络接口可以有多个地址,BSD协议栈实现中为每个地址分配一个ifaddr结构,同一接口的多个地址对于的ifaddr结构连接成一个链表。每个接口的ifnet结构通过指针指向ifaddr结构队首,每个ifaddr结构回指向其对应的接口。在ifnet结构中包含了五个部分,实现信息、硬件信息、接口统计、函数指针和输出队列。这些都是所有接口的通用信息,这些接口信息是专业网络接口数据结构的通用部分。对于以太网接口、slip接口、环回接口,在BSD实现中为这些特定的类型的设备设计了对应的数据结构,并且设计了对各种接口类型进行操作的函数,可以通过这些函数对网络接口数据结构进行初始化,从而完成对对应接口的配置。

ifaddr结构中包含了网络接口的地址信息。操作系统内核通过分配一个ifaddr结构和两个sockaddr_dl结构来构造一个链路层地址,其中一个是链路层地址本身,另一个是地址掩码。链路层地址由一个逻辑地址和一个硬件地址组成。

在链路层初始化过程中,操作系统为每个网络接口分配一个ifnetifaddr结构,结构ifnet链接成ifnet链表,每个接口的链路层地址被初始化,并被加入到ifnet结构的地址链表中,还存放到if_addrs数组中。

    接口层主要提供了对于网络接口进行配置的数据结构和函数,通过这些数据结构和函数可以设计相应网络接口的设备驱动程序,完成设备初始化、链路层初始化。


协议层主要讨论IP协议处理,协议层主要数据结构包括domain结构和protosw结构。每一个domain结构中通过函数指针,可以对对应的协议域进行操作,并且指明了访问权限,不同域的domain结构通过指针连接为链表。protosw结构对协议域提供了标识和表征协议,同时提供了从其他函数访问本协议的函数指针,并且提供了对本协议进行操作的处理函数。在BSD实现中,所有协议的domain结构和protosw结构需要静态初始化,对于protosw结构使用protosw结构数组进行初始化。

协议层通过相应函数的的操作,完成IP协议层的处理。协议层通过初始函数生成domain链表和协议域对应的协议的protosw结构。协议层提供了对IP包进行配置和操作的函数,实现了不同域的多种IP层协议。在BSD实现中,协议层使用协议控制块(PCB)存放UDPTCP插口所需要的多个信息片。通过引入协议控制块来实现位于传输层的UDPTCP,每一个Internet插口都有一个相关的PCB,它包含了本地和外部IP地址,指向一个路由结构的指针等。对于给定的协议所有的PCB都放在该协议维护的一个双向链表上。在BSD实现中,通过提供多个操作PCB的函数,对UDPTCPPCB进行操作,实现UDPTCP协议。

BSD实现中插口层产生的知道思想是为了提供一个统一的访问网络和进程间通信协议的接口。插口层的主要功能是:将进程发送的与协议有光的请求,映射到产生插口时指定的与协议有关的实现。为了允许标准的UNIX I/O调用,也能读写网络连接,在BSD实现中文件系统和网络功能集成在系统调用级。在插口层主要的数据结构包括socket结构,socket结构标识了一条通信链路的一端,包含着与链路有关的所有信息,包括:使用的协议、协议的状态信息、源地址和目的地址、到达的链接队列、数据缓存和可选标志。

插口层的重点在于通过系统调用实现进程访问网络的统一标准。在BSD实现中,操作系统内核通过对其他协议层层级调用实现了多个标准系统调用函数,包括socket()bind()listen()connect()close()等。这些系统调用都在操作系统内核实现,为用户态的进程提供了统一了系统调用接口。

     本文是在粗略阅读了第1、3、7、15、22章后所写,BSD协议栈复杂难懂,本文犹如管中窥豹,还有很多地方没有理解和感悟,尚需继续研读。如有错误和不准确之处请批评指正,您的意见定会让我获益匪浅。


阅读(3639) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~