链路层 ---《TCP/IP协议》卷一
第2章 鏈路層
2.1 引言
鏈路層主要有三個目的:
- 為IP模塊發送和接收IP數據報。
- 為ARP模塊發送ARP請求和接收ARP應答。
- 為RARP發送RARP請求和接收RARP應答。
將詳細討論:
- 以太網鏈路層協議。
- 兩個串行接口鏈路層協議(SLIP 和 PPP)。
- 環回(loopback)驅動程序。
- 以太網和SLIP是本書中大多數例子使用的鏈路層。
2.2 以太網和IEEE802封裝
以太網:它采用一種CSMA/CD(帶沖突檢測的載波監聽多路接入機制),它的速率為10Mb/s,地址為48bit。
802.3針對整個CSMA/CD網絡,802.4針對令牌總線網絡,802.5針對令牌環網絡;這三者的共同特性由802.2標準來定義,那就是802網絡共有的邏輯鏈路控制(LLC)。(不幸的是,802(802.2和802.3)的封裝格式與以太網的封裝格式是不同)
以太網和IEEE 802的 RFC 要求每一臺 Internet 主機都與一個 10Mb/s 的以太網電纜相連接。
- 必須能發送和接收采用 RFC 894(以太網) 封裝格式的分組。
- 應該能接收與 RFC 894 混合的 RFC 1042(IEEE802) 封裝格式的分組。
- 也許能夠發送采用 RFC 1042 格式封裝的分組。如果主機能同時發送兩種類型的分組數據,那么發送的分組必須是可以設置的,而且默認條件下必須是RFC 894分組。
下面給出802.3和以太網封裝格式: 
  
 (看完這個,表示懵逼了一會。802.3針對整個CSMA/CD網絡了,為什么還會有以太網封裝格式?答案很簡單,802.3是以太網的標準封裝格式。所以,我們可以將重心放在802.3封裝格式上。)
802.3封裝格式具體說明,特別詳細
2.3 尾部封裝(過時)
RFC 893[Leffler and Karels 1984]描述了另一種用于以太網的封裝格式,稱作尾部封裝(trailer encapsulation)。這是一個早期 BSD 系統在 DEC VAX 機上運行時的試驗格式,它通過調整 IP數據報中字段的次序來提高性能。在以太網數據幀中,開始的那部分是變長的字段(IP首部和TCP首部)。把它們移到尾部(在 CRC 之前),這樣當把數據復制到內核時,就可以把數據幀中的數據部分映射到一個硬件頁面,節省內存到內存的復制過程。 TCP 數據報的長度是512字節的整數倍,正好可以用內核中的頁表來處理。兩臺主機通過協商使用 ARP 擴展協議對數據幀進行尾部封裝。這些數據幀需定義不同的以太網幀類型值。
現在,尾部封裝已遭到反對。
2.4 SLIP:串行線路IP
SLIP的全稱是Serial Line IP。SLIP適用于家庭中,因為每臺計算機機會都會有RS-232串行端口和高速調制解調器接入Internet。
SLIP報文封裝: 
 
SLIP 協議定義的幀格式:
- IP數據報以一個稱作 END(0xc0)的特殊字符結束。同時,為了防止數據報到來之前的線路噪聲被當成數據報內容,大多數實現在數據報的開始處也傳一個 END 字符(如果有線路噪聲,那么 END 字符將結束這份錯誤的報文。這樣當前的報文得以正確地傳輸,而前一個錯誤報文交給上層后,會發現其內容毫無意義而被丟棄)。
- 如果 IP 報文中某個字符為 END,那么就要連續傳輸兩個字節 0xdb 和 0xdc 來取代它。0xdb 這個特殊字符被稱作 SLIP 的 ESC 字符,但是它的值與 ASCII 碼的 ESC 字符(0x1b)不同。
- 如果 IP 報文中某個字符為 SLIP 的 ESC 字符,那么就要連續傳輸兩個字節 0xdb 和 0xdd 來 
 取代它。
SLIP協議的缺陷:
- 每一端必須知道對方的 IP 地址。沒有辦法把本端的 IP 地址通知給另一端。
- 數據幀中沒有類型字段(類似于以太網中的類型字段)。如果一條串行線路用于 SLIP,那么它不能同時使用其他協議。
- SLIP 沒有在數據幀中加上檢驗和(類似于以太網中的 CRC 字段)。如果 SLIP 傳輸的報文被線路噪聲影響而發生錯誤,只能通過上層協議來發現(另一種方法是,新型的調制解調器可以檢測并糾正錯誤報文)。這樣,上層協議提供某種形式的 CRC 就顯得很重要。
因此,隨著調制解調器的速率和可靠性的提高,SLIP越來越流行。
2.5 壓縮的SLIP
由于串行線路的速率比較低(19200b/s或更低),而且通信經常是交互式的,因此在SLIP線路上有許多小的TCP分組進行交換。為了傳送1個字節的數據需要20個字節的IP首部和20個字節的TCP首部,總數超過40個字節。
認識到這些性能上的缺陷,人們提出一個被稱作 CSLIP(即壓縮SLIP) 的新協議,它在 RFC1144[Jacobson 1990a] 中被詳細描述。CSLIP一般能把上面的40個字節壓縮到3或5個字節,它能在CSLIP的每一端維持多達16個TCP連接,并且知道其中每個連接的首部中某些字段一般不會發生變化。對于那些發生變化的字段,大多數只是一些小的數字和改變。這些被壓縮的首部大大縮短了交互響應時間。
2.6 PPP:點對點協議(支持IP等各種上層協議)
PPP,點對點協議修改了SLIP協議中的所有缺陷。
- 在串行鏈路上封裝IP數據報的方法。PPP既支持數據為8位和無奇偶校驗的異步模式,還支持面向比特的同步鏈接。
- 建立、配置及測試數據鏈路的鏈路控制協議(LCP)。它允許通信雙方進行協商,以確定不同的選項。
- 針對不同網絡層協議的網絡控制協議(NCP)體系。當前RFC定義的網絡層有IP、OSI網絡層、DECnet以及AppleTalk。例如:IP NCP允許雙方商定是否對報文首部進行壓縮,類似于CSLIP(注:縮寫詞NCP也用來指TCP的前身)。
RFC 1548描述了報文封裝的方法和鏈路控制協議。RFC 1332描述了針對IP的網絡控制協議。
PPP 數據幀的格式看上去很像 ISO 的 HDLC(高層數據鏈路控制) 標準。
PPP數據幀格式: 
 
- 每一幀都以標志字符 0x7e 開始和結束。緊接著是一個地址字節,值始終是 0xff,然后是一個值為 0x03 的控制字節;
- 協議字段;
- CRC循環冗余校驗碼。
由于標志字符的值是 0x7e,因此當該字符出現在信息字段中時, PPP 需要對它進行轉義。
- 當遇到字符 0x7e 時,需連續傳送兩個字符:0x7d 和 0x5e,以實現標志字符的轉義;
- 當遇到轉義字符 0x7d 時,需連續傳送兩個字符:0x7d 和 0x5d,以實現轉義字符的轉義;
- 默認情況下,如果字符的值小于 0x20(比如,一個 ASCII 控制字符),一般都要進行轉義。
PPP 比 SLIP 具有下面這些優點:
- PPP 支持在單根串行線路上運行多種協議,不只是 IP 協議;
- 每一幀都有循環冗余檢驗;
- 通信雙方可以進行 IP 地址的動態協商(使用IP 網絡控制協議);
- 與 CSLIP 類似,對 TCP 和 IP 報文首部進行壓縮;
- 鏈路控制協議可以對多個數據鏈路選項進行設置。
這些優點付出的代價是在每一幀的首部增加3個字節,當建立鏈路時要發送幾幀協商數據,以及更為復雜的實現。
PPP最終將會取代SLIP。
2.7 環回接口
大多數的產品都支持環回接口(Loopback Interface),以允許運行在同一臺主機上的客戶程序和服務器程序通過 TCP/IP 進行通信。 A類網絡號 127 就是為環回接口預留的。根據慣例,大多數系統把 IP 地址 127.0.0.1 分配給這個接口,并命名為 localhost 。一個傳給環回接口的 IP 數據報不能在任何網絡上出現。
環回接口處理I P數據報的簡單過程: 
  
 關鍵點:
- 傳給環回地址(一般是 127.0.0.1)的任何數據均作為 IP 輸入;
- 傳給廣播地址或多播地址的數據報復制一份傳給環回接口,然后送到以太網上。這是因為廣播傳送和多播傳送的定義包含主機本身;
- 任何傳給該主機 IP 地址的數據均送到環回接口。
2.8 最大傳輸單元MTU
如果 IP 層有一個數據報要傳,而且數據的長度比鏈路層的 MTU 還大,那么 IP 層就需要進行分片(fragmentation),把數據報分成若干片,這樣每一片都小于 MTU 。
如圖,幾種常見的MTU: 
 
正如我們看到的,所學的以太網和IEEE 802.3還有點對點的MTU都被列出。不難發現,MTU是指數據幀的數據部分的長度。
2.9 路徑MTU
當在同一個網絡上的兩臺主機互相進行通信時,該網絡的 MTU是非常重要的。但是如果兩臺主機之間的通信要通過多個網絡,那么每個網絡的鏈路層就可能有不同的 MTU。重要的不是兩臺主機所在網絡的 MTU的值,重要的是兩臺通信主機路徑中的最小 MTU。它被稱作路徑 MTU。
2.10 串行線路吞吐量計算
如果線路速率是9600 b/s,而一個字節有 8 bit,加上一個起始比特和一個停止比特,那么線路的速率就是960 B/s(字節/秒)。
2.11 小結
- 鏈路層協議。我們比較了以太網和 IEEE 802.2/802.3 的封裝格式,以及 SLIP 和 PPP 的封裝格式。由于 SLIP 和 PPP 經常用于低速的鏈路,二者都提供了壓縮不常變化的公共字段的方法。這使交互性能得到提高。
- 大多數的實現都提供環回接口。訪問這個接口可以通過特殊的環回地址,一般為 127.0.0.1 。也可以通過發送 IP 數據報給主機所擁有的任一 IP 地址。當環回數據回到上層的協議棧中時,它已經過傳輸層和 IP 層完整的處理過程。
- 我們描述了很多鏈路都具有的一個重要特性,MTU,相關的一個概念是路徑 MTU。根據典型的串行線路 MTU,對 SLIP 和 CSLIP 鏈路的傳輸時延進行了計算。
練習
如果你的系統支持 netstat(1) 命令(參見 3.9 節),那么請用它確定系統上的接口及其 MTU 。netstat詳解
總結
以上是生活随笔為你收集整理的链路层 ---《TCP/IP协议》卷一的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: B端产品如何寻找竞品
- 下一篇: 二维数组中的查找---剑指Offer
