FreeBSD連載(33):DOD參考模型

1999年12月5日 18:11 王波

第4章 網路配置與使用

  60年代末,美國國防部(DOD)對建立分組交換的廣域網很感興趣,其基本想法是通過連接多個地域的分散網路 ,那麼局部地區的網路故障不影響其他部分網路的正常運行。主要是由於當時正處於冷戰的形勢下,他們要求建立能夠在部分 地區被襲擊的情況下,仍正常運行的軍事網路。

  研究機構ARPA開始了這個稱為ARPAnet的網路項目的研究,由於這個項目要求在不同的電腦之間進行通 信,而不同的電腦上會運行不同的操作系統,因此就存在不同系統之間如何按照同樣的規則進行交流的問題。因此最重要的 問題就是開發所有的系統都遵守的標準協議,讓它來實現應用程序對應用程序的通信,並獨立於具體的電腦平台。因此,他 們開發了獨立於特定電腦系統的標準協議,以實現各種電腦之間的通信。

  由於存在多種應用程序,因此協議也並非一個,而是一組協議。而TCP協議和IP協議就是他們開發的這些協議中 最重要的兩個,因此通常就以TCP/IP來稱呼整個協議族,稱為TCP/IP協議,這正是目前流行的Internet 使用的協議標準。

  TCP/IP的成功與BSD Unix分不開的,由於TCP/IP是平台獨立的,而當時大學的研究機構主要使 用BSD Unix,因而加州大學伯克利分校最先在BSD Unix中實現了TCP/IP。於是這一技術很快推廣到使 用BSD Unix的大學中,TCP/IP得到迅速推廣,越來越多的網路使用這個協議,越來越多的網路也通過這個協議 進行了互聯,逐漸形成了今天的Internet。

  • DOD參考模型

  參考模型是關於電腦之間如何進行通信的一種形象化表示方式,它將進行通信所需要的每一步驟按照層次的概念組 織起來。如果一個步驟處理的事情是負責物理線路的具體傳輸,就認為屬於模型中的低層,反過來,如果一個步驟是與具體的 應用程序打交道,就認為屬於模型中的高層,在高層和低層之間按照邏輯關系,還有一些中間層次。

  將通信過程劃分為不同層次的原因是因為通信過程是一個複雜的過程,對於用戶來講,能使用WWW瀏覽信息,能發 送電子郵件就能滿足需要,他們只關心這些應用程序,而不關心具體的通信過程﹔另外一些軟體駐留在後台處理通信過程中必 要的任務,如建立連接,發送數據等,而不關心數據是如何發送出去的﹔還有一些硬體專門用來負載信號的傳遞﹔這樣不同的 軟硬體有著層次分明的調用關系,自然就形成了層次的概念,而參考模型正是對這些層次進行區分和定義。

  在參考模型中,數據的物理傳送是由應用程序──屬於模型的最高層,向低層傳送,直至具體傳輸數據的傳輸協議層 ,由這個層將數據通過物理介質──如電纜、光纜、微波等傳送到目的電腦。當數據到達目的電腦時,它沿模型向上傳遞 ,最終到達目的電腦中的應用程序。這個過程就是傳送數據的物理過程。

  可以使用一個簡單例子來解釋這個通信過程。例如朋友之間互相傳遞信函是另一種較容易理解的通信過程,這個過程 中有寄信者、收信者、郵遞員、郵車等等。由寄信者將信交給郵遞員,郵遞員處理信件之後將信通過郵車發到對方的城市,對 方城市的郵遞員再將信交給收信者。這樣就可以將這個過程按層次劃分,寄信者和收信者可以看作一個層次,他們使用郵政服 務,可以看成應用層﹔所有層次的郵政員工是一個層次,進行具體的處理通信工作,可以稱為通信層﹔而郵車可以看成另一個 層次,處理具體發送郵件工作,稱為傳輸層﹔這只是一個簡單例子,具體網路通信過程則要複雜的多。

  從上圖可以看出,雖然物理數據的傳送是先從上到下,再從下到上回到另一台電腦的應用程序中,如果不考慮低層 是如何進行具體處理的,就可以將通信看成在每一層與另一個電腦中的相應層之間進行的。這樣在每層與另一台電腦相應 層之間就存在邏輯上的連接通信和傳遞數據的能力。如果還使用前面的寄信的例子來說明的話,就是寄信者只考慮收信者,收 信者也只考慮寄信者,而不管郵遞員是如何處理信件的,在邏輯上就是朋友之間的通信關系。

  這樣用邏輯通信的方式將數據傳送歸結到各層中的協議上,每一個協議只定義了完成通信的一個任務,成功的完成整 個通信過程要求多個協議協同進行,這些協議將分屬參考模型的不同層次,而且每個協議只與對方相應的協議通信,而不需考 慮整個通信過程,這樣複雜的通信過程就得到了簡化,從而能更容易實現。

  按照對網路的不同理解,可以有不同的參考模型,將通信分為不同的層次結構,其中影響最大的就是國際標準化組織 開發的OSI標準七層模型和TCP/IP中使用DOD四層模型。

  DOD模型的四層分別為:

    • 應用層(Application)
    • 主機到主機層(Host to Host)
    • 網路互連層(Internet)
    • 網路訪問層(Network Access)

  • 網路訪問層

  TCP/IP並沒有定義任何網路訪問層的協議,這個層的協議大部分是由其他通信組織定義的,這反而使TCP/IP 能適合幾乎全部硬體平台。網路訪問層和硬體相關,負責基本的通信,這一層最常見硬體的是以太網和使用普通電話線的 撥號連接。對於以太網,這一層定義了介質訪問控制地址(MAC地址),用於標識不同的電腦。有了網路訪問層,電腦 之間就有了物理連接,電腦之間就為相互交換數據提供了條件。

  在FreeBSD下,網路硬體是以網路界面(Interface)的形式存在的,如果電腦的網卡被正確探測 到的話,則就有一個相應的網路界面。例如第一個3C905網卡的網路界面是xl0,第一個Ne2000兼容網卡網路界 面是ed0,使用核心級PPP驅動的ppp網路界面為ppp0等。這些網路界面都對應於核心中的硬體驅動程序,只有在 硬體被檢測到之後,這些網路界面才能被正常使用。除此之外,還有一個本地環路網路界面lo0,這使得即使沒有任何網路 界面的硬體存在,也能使用FreeBSD運行網路程序為本機提供網路服務。

  • 網際層(Internet層)

  Internet層負責確定一台電腦能在網路上的位置,並找出通向它的路徑,然後才能夠相互交換數據。這種 路徑選擇功能既複雜又重要,因此實現這個功能的IP協議是整個TCP/IP協議組中的最基本協議。

  • IP地址

  IP協議給每個電腦都分配了一個唯一的IP地址,這個地址是一個分為四部分的32位長的數,每個部分為8位 ,使用點將其分開,例如192.168.1.64,這樣IP地址就表示的比較清晰﹔每個IP地址被劃分為兩個部分,一 個為網路地址(Network Address),用於表示電腦所在的子網路,一個為節點地址(Node Addr ess),用於標識電腦在子網路中的位置﹔網路地址和節點地址通過網路掩碼(netmask)進行區分,對應網路掩 碼二進制位為一的IP地址部分為網路部分,其他的為節點部分。

  例如網路掩碼255.255.255.0(16進制形式為0xffffff00)將192.168.1.64 的網路部分分為192.168.1和64兩部分,因此其網路地址為192.168.1.0,節點部分為0.0.0.6 4。這個IP地址在FreeBSD下可以寫作192.168.1.64/255.255.255.0或者192.16 8.1.64/24,後面一種形式和前一個是等價的,表示子網掩碼的二進制位中前面為1的位共有24位,即255.2 55.255.0。

  同一個網路中的網路地址應該相同,但節點地址應該不同,因而子網掩碼可以決定這個網路中可以擁有的TCP/I P主機的數量,即節點地址的範圍減2,其中節點地址二進制位全為0的地址為網路地址,表示這個網路本身,而節點地址二 進制位全為0的地址為廣播地址,用於在網路中發送廣播包。

  在IP協議中,為了便於管理,為不同種類的IP地址定義了預設的網路掩碼,而定義的具備不同網路掩碼的IP地 址就組成不同的網路類別。

  A類網路:1.0.0.0到127.0.0.0,預設網路掩碼為255.0.0.0,每個網路可以容納16, 777,214台電腦﹔

  B類網路:128.0.0.0到191.0.0.0,預設網路掩碼為255.255.0.0,每個網路可以容 納65,534台電腦﹔

  C類網路:192.0.0.0到223.0.0.0,預設網路掩碼為255.255.255.0,每個網路只 能容納254台電腦﹔

  其他的IP地址屬於D、E、F類地址,被IP協議保留用在了mutlicast等其他方面。

  這樣劃分的目的是為了讓IP地址可以同時滿足要求不同IP地址數量的大型網路和小型網路的需要。然而隨著In ternet的發展,IP地址開始變得緊張起來,目前已經提出了IPv6標準,以擴展IP地址的範圍,解決地址緊張的 問題。目前絕大多數網路還沒有支持IPv6,因此完全轉向IPv6還是一個漫長的過程,這也是FreeBSD不將比較 成熟的FreeBSD IPv6計劃──KAME,包括入FreeBSD發行版本的原因之一。目前主要使用另一種IP 地址轉換技術(NAT, Network Address Translete)來解決IP地址緊張的問題。

  • 路由

  有了IP地址,電腦就能確定在它在網路上的位置。當一台電腦要和另外電腦通信時,它首先必須知道對方的 IP地址,如果該IP的網路地址和它相同,兩台電腦就處在同一個子網上,能通過網路訪問層進行通信。直接通過IP地 址請求獲得對方的MAC地址,以通過網路訪問層進行通信,這需要通過另一個協議──ARP協議,從IP地址獲得對方的 MAC地址。

  如果兩台電腦不在同一個網路內,就需要一些特殊的電腦──路由器的幫助,才能將IP數據包發送到對方計算 機上。當兩台電腦不在同一個網路內時,電腦將查看自己的路由表,找出通往對方的合適路由器的IP地址,將IP數據 包發送給這台路由器,由各級路由器負責將IP包發送到目的地。因此一台電腦要想和子網外的電腦通信,至少要知道一 台路由器,由這台路由器負責將數據發送到子網外,通常稱這台路由器為預設網關(default Gateway)。

  那麼,路由器就必須了解到通往其他子網的通路,這些路徑可以通過route命令由管理員手工加進去,也可以通 過路由器之間相互交換數據,使路由器學習到更多的路由信息。路由器之間交換路由數據的協議主要有RIP、OSPF、B GP等協議。FreeBSD也能很好的支持這些路由交換功能,因此FreeBSD也是用做軟體路由器的最佳選擇。

  • DNS與名字解析

  通常IP地址不易記憶,實際使用中是通過使用主機名來標記一台電腦,而主機名可以自動轉換為IP地址,再進 行實際的連接。主機名與IP地址的對應關系可以配置在主機名配置檔案/etc/hosts中,但在網路上更普遍的是通 過DNS協議,將對應關系保存在網路上多台名字伺服器(DNS server)中,這樣就能通過名字伺服器來維護自己 組織機構的名字解析數據。

  由於網路上不同的電腦屬於不同的網路和組織機構,因此電腦的名字可以分為區分組織的域名(Domain Name)和在組織內區分電腦的主機名,形成一種多級的結構。例如一台電腦的名字為wb.example.com .cn,其中wb為主機名,example.com.cn為域名,其中example代表工作的單位,com是類別代 碼,代表這個單位是公司機構,cn是國別代碼,代表這個機構位於中國。

  • 主機-主機層

  這一層負責維護不同電腦上的兩個進程的通信,它的主要作用就是將應用程序與網路的複雜性相隔離,應用層只需 發出請求,而不必顧及任務是如何完成的。這一層包括兩個協議:傳輸控制協議TCP和數據報協議UDP。

  TCP協議是一種面向連接、有分組順序控制和差錯控制的安全準確的協議,因此必須在網路上傳送額外的維護信息 ,網路開銷大,但也是最常用的網路協議。TCP協議在不同機器之間建立了虛擬連接,它使用一個16位的端口地址(po rt number)來區分不同連接。應用程序必須使用一個或幾個端口地址用來提供網路服務,因此對於常用的網路服務 ,其使用的端口地址就是固定的。FreeBSD下在/etc/services就定義了一些常用的端口地址。

  UDP協議不建立連接,因此也不保証數據正確完整,相對來講網路開銷小,然而對於不可靠的網路連接,數據完整 性無法保証。UDP也使用端口地址發送和接受屬於不同應用程序的數據。

  • 應用層

  應用層就是為了讓應用程序在不同的電腦上運行並相互通信而實現的多種協議,每種協議都對應一類應用程序。並 且隨著Internet上的應用程序的不斷增加,應用協議的種類也越來越多。在/etc/services檔案中定義 的每一行就對應一個固定端口,就可能對應於一種應用程序類型。除此之外還有很多非標準應用程序,當然一個系統中並不會 同時運行所有種類的應用程序。

  大部分TCP/IP應用程序是屬於客戶機/伺服器類型的,這種類型的應用程序包含兩個部分,其中伺服器程序通 常運行在伺服器系統的後台,稱為守護程序(daemon)。守護進程運行在後台,隨時接受客戶連接以提供服務﹔客戶軟 件就是應用程序的用戶接口,用戶通過它使用伺服器上的資源。

  由於希望在需要的時候伺服器能立即提供服務,這樣就需要啟動大量並不常用的守護進程運行在系統中,就浪費了系 統資源。因此Unix使用一個超級守護程序inetd來監控這些不常用到的服務請求。只有在inetd接到客戶程序的 連接請求後,才啟動相應的應用服務程序進行處理,這樣系統中就不必運行過多的守護進程了,從而節約系統資源。inet d的配置檔案為/etc/inetd.conf,管理員必須配置這個檔案,以便指定系統提供那種服務。

#

# Internet server configuration database
#
# @(#)inetd.conf 5.4 (Berkeley) 6/30/90
#
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
telnet stream tcp nowait root /usr/libexec/telnetd telnetd
shell stream tcp nowait root /usr/libexec/rshd rshd
login stream tcp nowait root /usr/libexec/rlogind rlogind
finger stream tcp nowait nobody /usr/libexec/fingerd fingerd -s
#exec stream tcp nowait root /usr/libexec/rexecd rexecd
#uucpd stream tcp nowait root /usr/libexec/uucpd uucpd
#nntp stream tcp nowait usenet /usr/libexec/nntpd nntpd
comsat dgram udp wait root /usr/libexec/comsat comsat
ntalk dgram udp wait root /usr/libexec/ntalkd ntalkd
#tftp dgram udp wait nobody /usr/libexec/tftpd tftpd /tftpboot

  inetd.conf中的第一列為使用的端口地址,通常在/etc/services中進行定義,第二列和第 三列為連接種類,stream為tcp連接,dgram為udp,第四列可以為非daemon方式啟動的進程配置為n owait,為以daemon方式啟動的進程設置為wait。然後為執行程序的用戶,要執行的程序位置和要執行的程序 命令及其參數。