10.2 Linux TCP/IP 网络层
图 10.2: Linux 网络层
正如网络协议本身,图 10.2 显示出Linux用一系列相互连接层的软件实现Internet协议地址族。BSD套接字(BSD sockets)由专门处理BSD sockets通用套接字管理软件处理。它由INET sockets层来支持,这一层为基于IP的协议TCP和UDP管理传输端点。UDP(用户数据报协议)是一个无连接协议而TCP(传输控制协议)是个可靠的端对端协议。传输UDP包时,Linux不知道也不关心是否它们安全到达目的地。TCP包则被TCP连接两端编号以保证传输的数据被正确接收。IP层包含了实现Internet协议的代码。这些代码给要传输的数据加上IP头,并知道如何把传入的IP包送给TCP或UDP。在IP层以下,是网络设备来支持所有Linux网络工作,如PPP和以太网。网络设备不总是物理设备;一些象loopback这样的设备是纯软件设备。标准的Linux设备用mknod命令建立,网络设备要用底层软件发现并初始化它。建立一个有适当的以太网设备驱动在内的内核后,你就可以看到 /dev/eth0 。ARP协议位于IP层与支持ARP的协议之间。
10.3 BSD Socket 接口
这是一个通用的接口,它不仅支持各种网络工作形式,而且还是一个交互式通讯机制。一个套接字描述一个通讯连接的一端,两个通讯程序中各自有一个套接字来描述它们自己那一端。套接字可以被看成一个专门的管道,但又不象管道,套接字对它们能容纳的数据量没有限制。Linux支持多种类型的套接字。这是因为每一类型的套接字有它自己的通信寻址方法。Linux支持下列套接字地址族或域:
UNIX Unix 域套接字
INET Internet地址族支持通过TCP/IP协议的通信
AX25 Amateur radio X25
IPX Novell IPX
APPLETALK Appletalk DDP
X25 X25
有一些套接字类型支持面向连接的服务类型。并非所有的地址族能支持所有的服务类型。Linux BSD 套接字支持下列套接字类型:
Stream
这些套接字提供可靠的双工顺序数据流,能保证传送过程中数据不丢失,不被弄混和复制。Internet地址中的TCP协议支持流套接字。
Datagram
这些套接字提供双工数据传送,但与流套接字不同,这里不保证信息的到达。即使它们到达了,也不能保其到达的顺序,甚至不能保证被复制和弄混。这类套接字由Internet地址族中的UDP协议支持。
Raw
允许直接处理下层协议(所以叫“Raw”)。例如,有可能打开一个raw套接字到以太网设备,看 raw IP数据传输。
Reliable Delivered Messages
与数据报很象,但它能保证数据的到达。
Sequenced Packets
与流套接字相似,但的数据包大小是固定的。
Packet
这不是一个标准的BSD套接字类型,而是一个Linux特定的扩展,它允许在设备级上直接处理包。
客户服务器模式下使用套接字进行通信。服务器提供一种服务,客户使用这种服务。Web服务器就是一个例子,它提供网页,而客户端,或者说浏览器,来读这些网页。服务器要使用套接字,首先要建立套接字并将它与一个名称绑定。名称的格式由套接字的地址族来定,是服务器的本地有效地址。套接字的名称或地址用结构sockaddr来指定。一个INET套接字还与一个端口地址绑定。已注册的端口号可在 /etc/services 中找到;例如,Web服务的端口号是80。将套接字与地址绑定以后,服务器不可以监听指定的绑定了的地址上的引入连接请求。请求的发起者,客户端,建立一个套接字并通过它来发出一个连接请求到指定的目标服务器地址。对于一个INET套接字,服务器地址是它的IP地址和它的端口号。这些引入请求必须通过各种协议层找到目的地址,然后等待服务器的监听套接字。服务器收到引入请求后可以接收或拒绝它。如果决定接收,服务器必需建立一个新一套接字来接收请求。当一个套接字被用来监听引入连接请求时,它就不能用来支持连接了。连接建立后两端就可以自由地发送和接收数据了。最后,当不再需要连接时,就将之关闭。要注意保证在传输过程正确处理数据包。
对BSD socket进行准确操作要依赖于它下面的地址族。设置TCP/IP连接与设置amateur radio X.25连接有很大不同。象虚拟文件系统一样,Linux从BSD socket层抽象出socket接口,应用程序和BSD socket由每个地址族的特定软件来支持。内核初始化时,地址族被置入内核中并将自己注册到BSD socket接口。之后,当应用程序建立用使用BDS sockets时,在BSD socket与它支持的地址族之间将产生一个联接。这一联接是由交叉链接数据结构和地址族表特定支持程序产生。例如,每当应用程序建立一个新的socket,就会有一个BSD socket接口用的地址族特定 socket建立程序。
构造内核时,一些地址族和协议被置入 protocols 向量。每个由它的名称来表征,例如,“INET”和它的初始程序地址。当套接口启动时被初始化时,要调用每一协议和初始程序。对socket地址族来说,这会导致它们注册一套协议操作。这是一套例程,其中的每一例程执行一个特定的针对那一地址族的操作。已注册的协议操作被存在 pops 向量,一个指向 proto_ops 数据结构的向量中。
proto_ops 结构由地址族类型和一系列指向与特定地址族对应的socket操作例程的指针组成。pops 向量通过地址族标识符来索引,如Internet地址族标识符(AF_INET是2)。
图 10.3: Linux BSD Socket 数据结构
10.4 INET Socket 层
INET socket层支持包括TCP/IP协议在内的internet地址族。如前所述,这些协议是分层的,一个协议使用另一个协议的服务。Linux的TCP/IP代码和数据结构反映了这一分层模型。它与BSD socket层的接口要通过一系列Internet地址族socket操作,这一操作是在网络初始化时就已经注册到BSD socket层的。这些都与其它已注册的地址族一起保存在 pops 向量中。BSD socket层从已注册的INET proto_ops 数据结构中调用INET层 socket支持例程来为它执行工作。例如,一个地址族为INET的BSD socket建立请求,将用到下层的INET socket的建立函数。在这些操作中,BSD socket层把用来描述BSD socket的 socket 结构传构到INET层。为了不把BSD socket 与TCP/IP的特定信息搞混,INET socket层使用它自己的数据结构,sock ,它与BSD socket 结构相连。这一联接关系可以从图 10.3 中看出。它用BSD socket的 data 指针来连接 sock 结构与BSD socket结构。这意味着后来的INET socket调用能够很容易地重新找到 sock 结构。 sock 结构的协议操作指针也在初始化时建立,它依赖与被请求的协议。如果请求的是TCP,那么 sock 结构的协议操作指针将指向TCP连接所必需的TCP协议操作集。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



