BSD Socket  介绍
第16章网络系统
网络和L i n u x系统几乎可以说是同义词,因为L i n u x系统是W W W的产物。下面我们讨论一下L i n u x系统是如何支持T C P/I P协议的。
T C P/I P协议最初用来支持计算机和A R P A N E T网络之间通信。现在广泛使用的World Wi d e We b就是从A R P A N E T中发展来的,并且World Wide We b使用的也是T C P/I P协议。在U N I X系统中,首先带有网络功能的版本是4.3 BSD。L i n u x系统的网络功能就是以UNIX 4.3 BSD为模型发展起来的,它支持B S D套接口和全部的T C P/I P功能。这样U N I X系统中的软件就可以十分方便地移植到Linux 系统中了。
16.1  TCP/IP 网络简介
现在简单地介绍T C P/I P网络的主要原理。
在一个IP(Internet Protocol)网络中,每一台计算机都有一个3 2位的I P地址。每台计算机的I P地址都是唯一的。W W W是一个范围十分大,并且不断增长的I P网络,所以网络上的每台计算机都必须有一个唯一的I P地址。I P地址是用. 分隔开的4个十进制数,例如1 6.42.0.9。实际上
I P地址可以分为两部分:一部分是网络地址,另一部分是主机地址,例如,在  1 6.42.0.9中,
1 6.42是网络地址,0 .9则为主机地址。而主机地址又可以分为子网地址和主机地址。计算机的
I P地址很不容易记忆,如果使用一个名字就可以方便得多。如果使用名字,则必须有某一种机制将名字转化为I P地址。这些名字可以静态地保存在/ e t c/h o s t s文件中,或者L i n u x系统请求域名服务器(D N S服务器)来转换名字。如果使用D N S服务器的话,本地的主机则必须知道一个或者多个D N S服务器的I P地址,这些信息保存在/ e t c/r e s o l v. c o n f文件中。
当你和其他计算机相连时,系统要使用I P地址和其他计算机交换数据。数据保存在I P数据包中。每一个I P数据包都有一个I P数据头,其中包括源地址和目的地址,一个数据校验和以及其他一些有关的信息。I P数据包的大小随传输介质的不同而不同,例如,以太网的数据包要大于P P P的数据包。目的地址的主机在接收数据包后,必须再将数据装配起来,然后传送给接收的应用程序。
连接在同一个I P子网上的主机之间可以直接传送I P数据包,而在不同子网之间的主机却要使用网关。网关用来在不同的子网之间传送数据包。
I P协议是一个传输层的协议,其他的协议可以利用I P协议来传输数据。T C P(T r a n s m i s s i o n Control Protocol)协议是一个可靠的点到点之间的协议,它使用I P协议来传送和接收自己的数据包,如图1 6-1所示。T C P协议是基于连接的协议。需要通信的两个应用程序之间将建立起一条虚拟的连接线路,即使其中要经过很多子网、网关和路由器。T C P协议保证在两个应用程序之间可靠地传送和接收数据,并且可以保证没有丢失的或者重复的数据包。当T C P协议使用I P协议传送它自己的数据包时,I P数据包中的数据就是T C P数据包本身。相互通信的主机中的I P协议层负责传送和接收I P数据包。每一个I P数据头中都包括一个字节的协议标识符。当T C P协议请求I P协议层传送一个I P数据包时,I P数据头中的协议标识符指明其中的数据包是一个T C P数据包。接收端的IP层则可以使用此协议标识符来决定将接收到的数据包传送到那一层,在这里是TCP协议层。当应用程序使用T C P/I P通信时,它们不仅要指明目标计算机的I P地址,也要指明应用程序使用
的端口地址。端口地址可以唯一地表示一个应用程序,标准的网络应用程序使用标准的端口地址,例如,web 服务器使用端口80。你可以在/etc/services 中查看已经登记的端口地址。
图16-1  网络协议示意图
IP 协议层也可以使用不同的物理介质来传送I P 数据包到其他的I P 地址主机。这些介质可以自己添加协议头。例如以太网协议层、P P P 协议层或者S L I P 协议层。以太网可以同时连接很多个主机,每一个主机上都有一个以太网的地址。这个地址是唯一的,并且保存在以太网卡中。所以在以太网上传输I P 数据包时,必须将I P 数据包中的I P 地址转换成主机的以太网卡中的物理地址。L i n u x 系统使用地址解决协议(A R P )来把I P 地址翻译成主机以太网卡中的物理地址。希望把I P 地址翻译成硬件地址的主机使用广播地址向网络中的所有节点发送一个包括I P 地址的
A R P 请求数据包。拥有此I P 地址的目的计算机接收到请求以后,返回一个包括其物理地址的
A R P 应答。A R P 协议不仅仅限于以太网,它还可以用于其他的物理介质,例如F D D I 等。那些不能使用A R P 的网络设备可以标记出来,这样L i n u x 系统就不会试图使用A R P 。系统中也有一个反向的翻译协议,叫做R A R P ,用来将主机的物理地址翻译成I P 地址。网关可以使用此协议来代表远程网络中的I P 地址回应A R P 请求。
16.2  TCP/IP 网络的分层
图1 6-2显示了L i n u x 系统网络实现的分层结构。BSD 套接口是最早的网络通信的实现,它由一个只处
理BSD 套接口的管理软件支持。其下面是I N E T 套接口层,它管理T C P 协议和U D P 协议的通信末端。UDP(User Datagram Protocol)是无连接的协议,而T C P 则是一个可靠的端到端协议。当网络中传送一个U D P 数据包时,L i n u x 系统不知道也不关心这些U D P 数据包是否安全地到达目的节点。T C P 数据包是编号的,同时T C P 传输的两端都要确认数据包的正确性。I P 协议层是用来实现网间协议的,其中的代码要为上一层数据准备I P 数据头,并且要决定如何把接收到的I P 数据包传送到T C P 协议层或者U D P 协议层。在I P 协议层的下方是支持整个Linux 网络系统的网络设备,例如P P P 和以太网。网络设备并不完全等同于物理设备,因为一些网络设备,例如回馈设备是完全由软件实现的。和其他那些使用m k n o d 命令创建的L i n u x 系统的标准设备不同,网络设备只有在软件检测到和初始化这些设备时才在系统中出现。当你构建系统内核时,即使系统中有相应的以太网设备驱动程序,你也只能看到/ d e v /e t h 0。A R P 协议在I P 协议以太网数据祯
IP 数据包
数据
目的地址源地址协议目的TCP 地址源TCP 地址目的IP 地址源IP 地址校验和协议类型数据长度校验和
数据数据
TCP 数据包
层和支持A R P 翻译地址的协议之间。
图16-2  TCP/ IP 结构分层示意图
16.3  BSD 套接口
B S D 是U N I X 系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制。两个通信进程都用一个套接口来描述通信链路的两端。套接口可以认为是一种特殊的管道,但和管道不同的是,套接口对于可以容纳的数据的大小没有限制。L i n u x 支持多种类型的套接口,也叫做套接口寻址族,这是因为每种类型的套接口都有自己的寻址方法。L i n u x 支持以下的套接口类型:
UNIX  U N I X 域套接口
INET  I n t e r n e t 地址族T C P /I P 协议支持通信。
AX25  Amateur radio X25
IPX  Novell IPX
A P P L E T ALK  Appletalk DDP
X25  X25
这些类型的套接口代表各种不同的连接服务。
L i n u x 的BSD 套接口支持下面的几种套接口类型:
1. 流式(s t r e a m )
这些套接口提供了可靠的双向顺序数据流连接。它们可以保证数据传输中的完整性、正确
BSD 套接口层
用户层
核心层
网络应用程序
LNET 套接口层
Socket 接口
协议层网络设备TCP
tcp ip协议下载
UDP
IP
PPP SLIP Ethernet
ARP
性和单一性。I N E T寻址族中的T C P协议支持这种类型的套接口。
2. 数据报(D a t a g r a m)
这种类型的套接口也可以像流式套接口一样提供双向的数据传输,但它们不能保证传输的数据一定能够到达目的节点。即使数据能够到达,也无法保证数据以正确的顺序到达以及数据的单一性、正确性。U D P协议支持这种类型的套接口。
3. 原始(R a w)
这种类型的套接口允许进程直接存取下层的协议。
4. 可靠递送消息(Reliable Delivered Messages)
这种套接口和数据报套接口一样,只能保证数据的到达。
5. 顺序数据包(Sequenced Packets)
这种套接口和流式套接口相同,除了数据包的大小是固定的。
6. 数据包(P a c k e t)
这不是标准的BSD 套接口类型,而是Linux 中的一种扩展。它允许进程直接存取设备层的数据包。
利用套接口进行通信的进程使用的是客户机/服务器模式。服务器用来提供服务,而客户机可以使用服务
器提供的服务,就像一个提供w e b页服务的We b服务器和一个读取并浏览w e b 页的浏览器。服务器首先创建一个套接口,然后给它指定一个名字。名字的形式取决于套接口的地址族,事实上也就是服务器的当地地址。系统使用数据结构s o c k a d d r来指定套接口的名字和地址。一个INET 套接口可以包括一个I P端口地址。你可以在/ e t c/s e r v i c e s中查看已经注册的端口号,例如,一个w e b页面服务器的端口号是8 0。在服务器指定套接口的地址以后,它将监听和此地址有关的连接请求。请求的发起者,也就是客户机,将会创建一个套接口,然后再创建连接请求,并指定服务器的目的地址。对于一个INET 套接口来说,服务器的地址就是它的I P地址和端口号。这些连接请求必须通过各种协议层,然后等待服务器的监听套接口。一旦服务器接收到了连接请求,它将接受或者拒绝这个请求。如果服务器接受了连接请求,它将创建一个新的套接口。一旦服务器使用一个套接口来监听连接请求,它就不能使用同样的套接口来支持连接。当连接建立起来以后,连接的两端都可以发送和接收数据。最后,当不再需要此连接时,可以关闭此连接。
使用B S D套接口的确切含义在于套接口所使用的地址族。设置一个T C P/I P连接就和设置一个业余无线电X .25连接有很大的不同。和V F S一样,L i n u x从BSD 套接口协议层中抽象出了套接口界面,此界面负责和各种不同的应用程序之间进行通信。内核初始化时,内核中的各个不同的地址族将会在BSD 套接口界面中登记。稍后当应用程序创建和使用BSD 套接口时,就将会在BSD 套接口和它支持的地址族之间建立一个连接。此连接是通过交叉关联的数据结构和地址族表建立的。例如,当一个应用程序创建一个新的套接口时,将产生一个可以被BSD 套接口使用的与特定的地址族有关的套接口创建子过程。
设置系统内核时,一系列的地址族和协议将会保存在协议向量中。每一个协议都由它的名字代表,例如,I N E T和其初始化进程的地址。当系统启动并初始化套接口界面时,将会调用每一个协议的初始化进程。对于套接口地址族来说,这意味着它们注册的一系列有关协议操作。这是一系列的子程序,每一个都执行一个和特定的地址族有关的操作。已经注册的和协议相关的操作保存在p o p s向量中,而此向量由一系列指向数据结构p r o t o_o p s的指针组成。
数据结构p r o t o_o p s包括地址族的类型以及指向与特定地址族有关的套接口操作程序的指针。P o p s向量用地址族标识符作为索引。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。