解讀《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(載波監聽多路訪問
在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不是一個常數。這取決於當時所選的路由。比如,從小明到小紅家有好多條路可以走,小明並不一定每一次都走同一條路哦。