1. 程式人生 > >解讀《TCP/IP詳解》(卷1):02章:鏈路層

解讀《TCP/IP詳解》(卷1):02章:鏈路層

2.1引言

        在TCP/IP協議族中,鏈路層主要有三個目的:

(1)為IP模組傳送和接收IP資料報。

(2)為ARP模組傳送ARP請求和接收ARP應答。

(3)為RARP傳送RARP請求和接收RARP應答。

        TCP/IP支援多種不同的鏈路層協議,具體取決於網路所使用的硬體,本文討論乙太網鏈路層協議,序列介面鏈路層協議(SLIP和PPP)以及迴環(127.0.0.1)驅動程式。

2.2乙太網和IEEE 802封裝

乙太網(Ethernet)指的是由Xerox公司建立並由Xerox、Intel和DEC公司聯合開發的基帶區域網規範,是當今現有區域網採用的最通用的通訊協議標準。乙太網絡使用CSMA/CD(載波監聽多路訪問

及衝突檢測)技術,並以10M/S的速率執行在多種型別的電纜上。後來IEEE 802委員會公佈了一個稍有不同的標準集。

        在TCP/IP世界中,乙太網IP資料報的封裝格式是在RFC 894中定義的,IEEE 802網路的IP資料報格式封裝格式是在RFC 1042中定義的。主機需求RFC要求每臺Internet主機都與一個10M/s的乙太網電纜相連:

(1)必須能傳送和接收 RFC 894(乙太網)封裝格式的分組。

(2)應該能接收與RFC 894混合的RFC 1042(IEEE 802)封裝格式的分組。

(3)也許能夠傳送採用RFC 1042格式的分組。如果主機能同時傳送兩種型別的分組資料,那麼傳送的分組必須是可以設定的,而且預設必須是RFC 894分組。

這裡我們可以看出乙太網的封裝格式還是最普遍被人們接受的。

        兩種幀格式都採用48位(6位元組)的目的地址和源地址,802.3允許16位地址,但一般也是48位。這就是我們通常所說的硬體地址(MAC地址)。接下來的兩個位元組在兩種幀格式中互不相同。802中,長度欄位是指它後續資料的位元組長度,不包括CRC(迴圈冗餘)校驗碼。而乙太網中這兩個位元組是定義了後續資料型別的型別欄位。802中的型別欄位則由後續的SNAP(子網接入協議)的首部給出。幸運的是,802的有效長度指和乙太網的型別值無一相同,這就可以對兩種幀格式進行區分。

上圖為IEEE 802.2/802.3(RFC 1042)與乙太網封裝格式圖

其中:

LLC:邏輯鏈路控制 這是802網路共有的

DSAP:目的服務訪問點 值0xaa

SSAP:源服務訪問點 值0xaa

乙太網和802.3都有幀的最小長度要求。802.3規定資料部分至少38位元組,而乙太網而要求46位元組。如不能滿足,則在不足的空間插入填充(pad)位元組。

------------------------------

        另外,RFC 893 描述了一種尾部封裝,這種封裝格式已經遭到反對。它的內容是將乙太網資料幀的IP首部與TCP首部移到尾部CRC之前。

2.3 SLIP(序列線路IP)

 SLIP

        SLIP(Serial Line Internet Protocol,序列線路網際協議),主要在Unix遠端訪問伺服器中使用,現今仍然用於連線某些ISP。因為SLIP協議是面向低速序列線路的,可以用於專用線路,也可以用於撥號線路,Modem的傳輸速率在1200bps到19200bps。RFC1055中有詳細描述。

幀格式的規則:

(1)IP資料報以一個被稱作END(0xc0)的特殊字元結束。同時為防止資料到來前的噪聲,通常在開始處也會傳一個END,用來標識資料的起始部分。

(2)若IP報文中某個字元為END,那麼要連續傳輸兩個位元組0xdb,0xdc來代替。(好比,程式語言中要列印特殊含義的字元的時候要加轉義字元)

(3)若IP報文中某個字元為ESC,那麼要連續傳輸兩個位元組0xdb,0xdd來代替。

SLIP的缺陷:

(1)每一端必須知道對方的IP地址,不能把本端的IP地址通知給另一端

(2)資料幀中沒有型別欄位。如果一條序列線路用於SLIP,那麼它不能同時使用其他協議。

(3)SLIP中沒有類似於乙太網的CRC校驗欄位,這樣糾錯能力差。

CSLIP

        傳統的序列線路速率較低,為了傳輸1個位元組的資料需要20個位元組的IP首部和20個位元組的TCP首部。因此,人們提出CSLP(壓縮SLIP),他將前面提到的40個位元組壓縮到3到5個位元組,且能夠在兩端維持多大16個TCP連線,並且知道其中每個連線的首部中的某個欄位一般不會發生變化。對於那些發生變化的欄位,大多數只是一些小的數字和的改變。被壓縮的首部大大縮短了互動響應時間。

2.4 PPP(點對點協議)

        PPP協議修改了SLIP協議中的所有缺陷:

包括三個部分:

(1)在序列鏈路上封裝了IP資料報的方法。PPP既支援資料位8為和無奇偶檢驗的非同步模式,還支援面向位元的同步連結。

(2)建立、配置及測試LCP(資料鏈路的鏈路控制協議)。它允許通訊雙方進行協商,以及確定不同的選項。

(3)針對不同網路層協議的NCP(網路控制協議)體系。當前RFC定義的網路層有IP、OSI網路層、DECnet以及AppleTalk。例如,IP NCP允許雙方商定是否對報文首部進行壓縮,類似於CSLIP

        PPP資料幀的格式看上去很像ISO的HDLC(高層資料鏈路控制)。每一幀都以標誌0x7e開始和結束,緊接著是一個地址位元組,值始終是0xff,然後是一個值為0x03de控制位元組。接下來是協議欄位(類似於乙太網中的型別欄位):

其值為0x0021時,表示資訊欄位是一個IP資料報

其值為0xc021時,表示資訊欄位是鏈路控制資料

其值為0x8021時,表示資訊欄位是網路控制資料

        標誌位元組值是0x7e,因此如果資訊欄位中出現此字元時,PPP需要對其轉義。同樣特殊字元0x7d也需要進行轉義。

過程如下:

(1)當遇到0x7e時,需連續傳送兩個字元:0x7d和0x5e,以實現標誌字元的轉義。

(2)當遇到0x7d時,需連續傳送兩個字元:0x7d和0x5d,以實現轉義字元的轉義。

(3)預設的,如果字元的值小於0x20,一般都要進行轉義。由ASCLL表可以看出20(16進位制)以內的字元大都是控制字元,所以需要轉義。

HEX

字元

解釋

HEX

字元

解釋

00

NUL

空字元

10

DLE

資料鏈路轉義

01

SHO

標題開始

11

DC1

裝置控制1

02

STX

正文開始

12

DC2

裝置控制2

03

ETX

正文結束

13

DC3

裝置控制3

04

EOT

傳輸結束

14

DC4

裝置控制4

05

ENQ

請求

15

NAK

拒絕接收

06

ACK

收到通知

16

SYN

同步空閒

07

BEL

響鈴

17

ETB

傳輸塊結束

08

BS

退格

18

CAN

取消

09

HT

水平製表符

19

EM

介質中斷

0A

LF

換行符

1A

SUB

替補

0B

VT

垂直製表符

1B

ESC

溢位

0C

FF

換頁符

1C

FS

檔案分割符

0D

CR

回車符

1D

GS

分組符

0E

SO

不用切換

1E

RS

記錄分割符

0F

DI

啟用切換

1F

US

單元分割符

         PPP比SLIP只多了額外3個位元組,一個位元組留給協議欄位,另外兩個留個CRC欄位。

總體看,PPP比SLIP有如下優點:

(1) PPP 支援在單根序列線路上執行多種協議,不只是I P 協議

(2) 每一幀都有迴圈冗餘檢驗

(3)  通訊雙方可以進行 I P地址的動態協商(使用I P 網路控制協議)

(4)與C S L I P類似,對T C P和I P 報文首部進行壓縮

(5)  鏈路控制協議可以對多個數據鏈路選項進行設定

為這些優點付出的代價是在每一幀的首部增加 3個位元組。。雖然如今SLIP使用者依然比PPP使用者多,但最終SLIP將會被取代。

2.5迴環介面(127.0.0.1)

        迴環介面,又叫環回介面都是Loopback Interface的翻譯,不過我覺得環回有點拗口。關於這個127.0.0.1基本上學過網路程式設計的人都不會陌生。比如你用java寫一個c/s的程式,要用自己的PC又當Server又當Client。就需要這個迴環地址。同樣java中可以用localhost代替。A類網路號就是為了迴環介面預留的,大多數系統喜歡分配127.0.0.1,所以在你不裝網絡卡的時候用ping命令也是可以通的。.當你把ip資料報傳給這個介面的時候,就不能再任何網路上出現了。

        也許你會覺得,既然是自己給自己傳遞資料。那麼就不必先一層一層向下傳,再一層一層向上傳遞了。但是多數廠品還是會完成傳輸層和網路層的傳遞過程。迴環介面可以看作是網路層下面的另一個鏈路層。與其他鏈路層一樣,只不過他把資料又返回了IP輸入佇列中。

2.6MTU(最大傳遞單元)

        鏈路層對於傳輸的資料是有長度限制的。不同網路有所不同。

網路

MTU位元組

超通道

65535

10Mb/s令牌環(IBM)

17914

4Mb/s令牌環(IEEE 802.5)

4464

FDDI

4352

乙太網

1500

IEEE 802.2/802.3

1492

X.25

576

點到點(低時延)

296

        上面的點到點的鏈路層(SLIP和PPP)的MTU並非是值網路媒體的物理特性,只是一個邏輯限制,為了加快互動相應速度。

        如果兩臺主機在同一個網路,那麼該網路的MTU就不用說了,確定了。但是如果兩個主機在兩個不同的網路,進行通訊的時候中間又經過不同的網路,美每個網路都有不同的MTU,那麼該次通訊的MTU是多少呢?答案也很理解,就是其中的最小值。稱為“路徑MTU”。實際上,兩臺主機之間的路徑MTU不是一個常數。這取決於當時所選的路由。比如,從小明到小紅家有好多條路可以走,小明並不一定每一次都走同一條路哦。