第十章 網絡
網絡和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