分享
 
 
 

linux bible 第十章 网络

王朝system·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

第十章 网络

网络和Linux是密切相关的。从某种意义来说Linux是一个针对Internet

WWW的产品。它的开发者和用户用Web来交换信息思想、程序代码,而Linux自身

常常被用来支持各种组织机构的网络需求。这一章讲的是Linux如何支持如TCP/IP

等网络协议的。

TCP/IP协议最初是为支持ARPANET(一个美国政府资助的研究性网络)上计

算机通讯而设计的。ARPANET提出了一些网络概念如包交换和协议分层(一个

协议使用另一个协议提供的服务)。ARPANET于1988年隐退,但是它的继承人

(NSF1 NET和Internet)却变得更大了。现在我们所熟知的万维网World Wide

Web就是从ARPANET演变过来的,它自身支持TCP/IP协议。Unix TM被广泛应

用于ARPANET,它的第一个网络版本是4.3 BSD。Linux的网络实现是以4.3 BSD

为模型的,它支持BSDsockets(及一些扩展)和所有的TCP/IP网络。选这

个编程接口是因为它很流行,并且有助于应用程序从Linux平台移植到其它Unix

TM 平台。

10.1 TCP/IP网络简介

这一部分简单介绍一下TCP/IP网络的主要原理,而不是进行详细地讲述。

在IP网络中,每台机器都有一个IP地址,一个32位的数字,它唯一地标识这

台机器。WWW是一个非常巨大并且迅速增长的网络,每台连在上面的机器都必

须有一个独立的IP地址。IP地址由四个用点分开的数字表示,如16.42.0.9。

这个IP地址实际上分成两个部分:网络地址和主机地址,每部分的长度是可

以变化的(有好几类IP地址)。以16.42.0.9为例,网络地址是16.42,主机

地址是0.9。主机地址又进一步分为子网地址和主机地址。还是以16.42.0.9

为例,子网地址是16.42.0,主机地址是16.42.0.9。这样的子划分可以允许

某部门划分他们自己的子网络。例如,如果16.42是ACME计算机公司的网络地

址,则16.42.0可能是子网0,16.42.1可能是子网1。这些子网可以是分别建

立的,可能租用电话线或用微波进行相互间通讯。IP地址由网络管理员分配,

用IP子网可以很好地管理网络。IP子网的管理员可以自由分配子网内的IP地址。

通常,IP地址是比较难记的,而名称则容易多了,象linux.acme.com就

比16.42.0.9要好记一些。但是必须有一些机器来将网络名称转变为IP地址。

这些名称被静态地定义在/etc/hosts文件中或者Linux能请求域名服务器(DNS)

来解析它。这种情况下,本地主机必须知道一个或一个以上的DNS服务器并且

这些服务器要将其名称指定到/etc/resolv.conf 中。

当你想要与另一台计算机连接时,比如说你想阅读一个Web页,你的IP地

址就会被用来与那台机器交换数据。这些数据被包含在一些IP包中,每个IP

包都有一个IP头用来包含源机器的IP地址和目的机器的IP地址,校验和以及

其它的有用信息。IP包的校验和用来让IP包的接收端判断IP包是否在传输过

程中发生错误,譬如说由于电话线路的问题而引起的错误。应用程序想要传输

的数据可能被分成很多个容易处理的小包。IP数据包的大小是根据传输媒体

的变化而不同的;以太网包通常比PPP包要大一些。目的主机在将数据送给接

收端应用程序前需要将这些包重新拚装起来。如果你从一个比较慢的站点访问

一个有大量图象的Web页,就会看到数据的分割与重组。

同一子网内的主机之间可以直接发送IP包,而其它的IP包将被送到一个特

定的主机:网关。网关(或路由器)是用来连接多个IP子网的,它们会转发送

从子网内来的IP包。例如,如果子网16.42.1.0和16.42.0.0之间通过一个网关

相连,那么任何从子网0发往子网1的包必须由网关指引,网关可以帮这些包找

到正确的路线。本地主机建立路由表用以为IP包找到正确的机器。每一个目的

IP都有一个条目在路由表中,用以告诉Linux将IP包送到哪一台主机。这些路由

表是随网络的拓扑结构变化而动态变化的。

IP协议是一个传输层的协议,其它协议可以用它来传输数据。传输控制协

议(TCP)是一个可靠的端对端的协议,它用IP来传送和接收它自己的包。正如

IP包有它自己的头一样,TCP也有它自己的头。TCP是一个面向连接的协议,两个

网络应用程序通过一个虚连接相连,即使它们之间可能隔着很多子网、网关、路

由器。TCP可靠地传送和接收两应用程序间的数据,并保证数据不会丢失。当用

IP来传输TCP包时,IP包的数据段就是TCP包。每一个通讯主机的IP层负责传送和

接收IP包。用户数据报协议(UDP)也用IP层来传输它的包,不象TCP,UDP不是

一个可靠的协议,但它提供了一种数据报服务。有多个协议可以使用IP层,接收

IP包的时候必需知道该IP包中的数据是哪个上层协议的,因此IP包头中有个一字

节包含着协议标识符。例如,当TCP请求IP层传输一个IP包时,IP包的包头中用标

识符指明该包包含一个TCP包,IP接收层用该标识符决定由哪一协议来接收数据,

这个例子中是TCP层。当应用程序通过TCP/IP进行通讯时,它们不仅要指定目标的

IP地址,而且还要指定应用的端口地址。一个端口地址唯一地标识一个应用,标

准的网络应用使用标准的端口地址;如,Web服务使用80端口。这些已登记的端

口地址可在 /etc/services 中看到。

这一层的协议不仅仅是TCP、UDP和IP。IP协议层本身用很多种物理媒介将IP

包从一个主机传到其它主机。这些媒介可以加入它们自己的协议头。以太网层就

是一个例子,但PPP和SLIP不是这样。一个以太网络允许很个主机同时连接到同

一根物理电缆。传输中的每一个以太网帧可以被所有主机看见,因此每一以太网

设备有个唯一的地址。任何传送给该地址的以太网帧被有该地址的以太网设备接

收,而其它主机则忽略该帧。这个唯一的地址内置于每一以太网设备中,通常是

在网卡出厂时就写在SROM2中了。以太网地址有6个字节长,如:

08-00-2b-00-49-A4。一些以太网地址是保留给多点传送用的,送往这些地址的

以太网帧将被网上所有的主机接收。以太网帧可以携带很多种协议(作为数据),

如IP包,并且也包括它们头中的协议标识符。这使得以太网层能正确地接收IP包

并将它们传给IP层。

为了能通过象以太网这样的多连接协议传送IP包,IP层必须找到每一IP主机

的以太网地址。IP地址仅仅是一个地址概念,以太网设备有它们自身的物理地址。

从另一方面说,IP地址是可以被网络管理员根据需要来分配和再分配的,而网络

硬件只对含有它们自己的物理地址或多点传送地址的以太网帧作出响应。Linux用

地址解析协议(ARP)来允许机器将IP地址转变成真正的硬件地址,如以太网地址。

如果一个主机想知道某一IP地址对应的硬件地址,它就用一个多点传送地址将一个

包含了该IP地址的ARP请求包发给网上所有节点,拥有该IP地址的的目标主机则响

应一个包含物理硬件地址的ARP应答。ARP不仅仅局限于以太网设备,它能够用来在

其它一些物理媒介上解析IP地址,如FDDI。那些不支持ARP的网络设备会被标记出

来,Linux将不会用ARP。还有一个提供相反功能的反向地址解析协议(RARP),用

来将物理网络地址转变为IP地址。这一协议常常被网关用来响应包含远程网络IP地

址的ARP请求。

10.2 Linux TCP/IP 网络层

正如网络协议本身,图 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

有一些套接字类型支持面向连接的服务类型。并非所有的地址族能支持

所有的服务类型。LinuxBSD 套接字支持下列套接字类型:

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连接与

设置amateurradio X.25连接有很大不同。象虚拟文件系统一样,Linux从BSD

socket层抽象出socket接口,应用程序和BSD socket由每个地址族的特定软件

来支持。内核初始化时,地址族被置入内核中并将自己注册到BSD socket接口。

之后,当应用程序建立用使用BDS sockets时,在BSDsocket与它支持的地址族

之间将产生一个联接。这一联接是由交叉链接数据结构和地址族表特定支持程

序产生。例如,每当应用程序建立一个新的socket,就会有一个BSD socket接

口用的地址族特定 socket建立程序。

构造内核时,一些地址族和协议被置入 protocols向量。每个由它的名称

来表征,例如,“INET”和它的初始程序地址。当套接口启动时被初始化时,

要调用每一协议和初始程序。对socket地址族来说,这会导致它们注册一套协

议操作。这是一套例程,其中的每一例程执行一个特定的针对那一地址族的操

作。已注册的协议操作被存在pops 向量,一个指向 proto_ops 数据结构的向

量中。

proto_ops结构由地址族类型和一系列指向与特定地址族对应的socket操

作例程的指针组成。pops向量通过地址族标识符来索引,如Internet地址族

标识符(AF_INET是2)。

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 结构相连。这一联接关系可以

看出。它用BSDsocket的 data 指针来连接 sock 结构与BSD socket结构。这意

味着后来的INETsocket调用能够很容易地重新找到 sock 结构。 sock结构的协

议操作指针也在初始化时建立,它依赖与被请求的协议。如果请求的是TCP,那么

sock 结构的协议操作指针将指向TCP连接所必需的TCP协议操作集。

10.4.1 建立BSD socket

系统建立一个新的socket时,通过标识符来确定它的地址族,socket类型和协议。

首先,从 pops向量中搜索与被请求的地址族相匹配的地址族。它可能是一

个作为核心模块来实现的一个特定的地址族,这样,在其能继续工作前,kerneld

守护进程必须加载这一模块。分配一个新的 socket 结构来代表BSD sock

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有