Linux 核心--11.网络( 三 )




10.3BSD Socket 接口
这是一个通用的接口,它不仅支持各种网络工作形式,而且还是一个交互式通讯机制 。一个套接字描述一个通讯连接的一端,两个通讯程序中各自有一个套接字来描述它们自己那一端 。套接字可以被看成一个专门的管道,但又不象管道,套接字对它们能容纳的数据量没有限制 。Linux支持多种类型的套接字 。这是因为每一类型的套接字有它自己的通信寻址方法 。Linux支持下列套接字地址族或域:

UNIXUnix 域套接字
INETInternet地址族支持通过TCP/IP协议的通信
AX25Amateur radio X25
IPXNovell IPX
APPLETALKAppletalk DDP
X25X25


有一些套接字类型支持面向连接的服务类型 。并非所有的地址族能支持所有的服务类型 。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 数据结构的向量中 。

推荐阅读