在之前提到,Link Layer的用途在於接收與傳送以下內容:
- 與 IP 之間的 IP datagrams
- 與 ARP 之間的 ARP request & reply
- 與 RARP 之間的 RARP request & reply
在此部分的重點內容大致分為 SLIP、PPP、MTU,以下就一個一個來仔細介紹。
Ethernet 與 IEEE 802 標準
Ethernet 原本是在 1982 年被提出,用於 10MByte/sec 的 LAN 上,所使用的存取方式稱為 CSMA/CD(Carrier Sense, Multiple Access with Collision Detection);幾年後,IEEE 提出的 802.3 協定,取代了原本的 Ethernet,另外更提出了許多其他一系列的 802.x 協定,定義了其他網路型態的標準,常見的如下:
- 802.3 (CSMA/CD)
- 802.4 (Token Bus)
- 802.5 (Token Ring)
- 802.2 (LLC)
LLC(Logical Link Control)較為特殊,為上述三者共通的部分
從上述的說明可以瞭解,在 IEEE802 標準裡面﹐將 Link Layer 劃分為兩層:Media Access Control 和 Logical Link Control,以下用張圖(資料來源:Study Area)來說明這些標準之間的關係:
由於 Ethernet 被後來 IEEE 所制訂出來的標準(802.2 + 802.3)所取代,其中兩者在資料的封裝(encapsulation)上有所差異,不過也是有其相容之處,因此以下用一張圖來說明:
- 在前兩個 6 bytes 長度的部分(destination addr 與 source addr),兩種封裝方式都是相同的,儲存的皆是 NIC 的 MAC address。
- 在第 7~8 個 byte 則有不同(長度為 2 bytes),說明如下:
- IEEE 802
欄位名稱為「length」,用來標示後續的資料內容到欄位 CRC 之前的資料長度。 - Ethernet
欄位名稱為「type」,標示後續的資料的種類為何。
- IEEE 802
- 第 15 個 byte 開始到 CRC 欄位前的資料,也是分別進行說明:
- IEEE 802
在 length 欄位之後,緊接著欄位分別如下:
- DSAP(Destination Service Access Point):長度 1 byte,設定為 0xAA
- SSAP(Source Service Access Point:長度 1 byte,設定為 0xAA
- ctrl:長度 1 byte,設定為 0x03
- org code:長度為 3 btyes,設定為 0x000000
- type:與 Ethernet 中的 byte 欄位是相同作用
- data:長度為 38~1492
- DSAP(Destination Service Access Point):長度 1 byte,設定為 0xAA
- Ethernet
在 type 欄位之後,接著即是長度為 46~1500 bytes 的資料
- IEEE 802
- 最後長度 4 bytes 的 CRC 欄位
作為對後續傳送過來的 frame 進行錯誤偵測之用
最後,還需要注意的是,兩種不同封裝方式的 frame,都要其最小長度的限制,其中 Ethernet 為 46 bytes,IEEE 802 為 38 bytes;若資料不足到這些 bytes 長度,則會自動補空白資料進來。
【備註】Ethernet 封裝的方式定義在 RFC 894;而 IEEE 802 封裝的方式則定義在 RFC 1042。
SLIP (Serial Line IP)
此協定是用於使用 Serial Line(RS-232)作為網路傳輸媒介時使用,常見於一般的撥接 modem。
SLIP 的作用在於用較為簡單的方式將 IP datagram 封裝,並透過 Serial Line 傳輸,封裝的方式定義於 RFC 1055,以下用一張圖介紹封裝 SLIP 的過程:
- 每個 IP datagram 的最後加上一個 END 字元為 0xc0
- 若在 IP datagram 中有 END 字元(0xc0)存在,則會被替換為 SLIP ESC 字元(0xdb)加上 0xdc
- 若在 IP datagram 中有 SLIP ESC 字元(0xdb)存在,則會被替換為 SLIP ESC 字元(0xdb)加上 0xdd
當然,SLIP 也是有其缺點的,例如:
- 傳送資料的兩端必須知道對方的 IP address,因為在封裝中並不會加入這些資訊
- 沒有 type 欄位說明 frame 的型態為何,因此若透過 Serial Line 傳輸的資料,都會被認為使用 SLIP 協定,因此無法同時使用其他協定
- 沒有 checksum 的機制,因此必須仰賴上層進行錯誤檢查
一般來說,Serial Line 常被用來傳送小型的 TCP 封包,但假設資料很小,長度為 1 byte,為了成功傳送,卻必須多加入 20 bytes 的 IP header 以及 20 bytes 的 TCP header,如此一來就會產生 40 bytes 的 overhead,對網路傳輸來說的確是不怎麼有效率。
因此新的 SLIP 協定被提出,稱為 CSLIP(Compressed SLIP),可將長達 40 bytes 的 header 資訊縮短為 3 或 5 btyes,所使用的方式是同時維護多個 TCP 連線的狀態,並讓資料傳送兩端記住 header 不會變動的部分,僅針對會變動的部分進行傳輸,透過此方式,便大大降低了 overhead 的情形。
而 CSLIP 詳細的運作方式,都記錄在 RFC 1144 中。
PPP (Point-to-Point Protocol)
PPP,是一個點對點(Point-to-Point)的協定,通常用於兩端點間直接建立連結的情況(注意! 此協定還是用在 serial link 上),此協定改善了 SLIP 所有的缺點。而 PPP 包含了三個部分:
- 在 serial link 上封裝 IP datagram 的方式,並支援同步與非同步的連結
- LCP(Link Control Protocol),用來建立、設定、測試 Data-Link connection,允許兩端點間以不同的方式進行交談
- 多個 NCP(Network Control Protocol),用來處理來自上層(Network Layer)的不同協定,例如:IP、DECnet、AppleTalk....等等
接著要介紹 PPP frame 的格式,以下用一張圖來說明:
一開始為固定的 3 個 byte,分別是 flag(0x7E)、addr(0xFF)、control(0x03)。
接著是 protocol 欄位,類似 Ethernet 中的 type 欄位,用來表示下一個 information 欄位中的內容為何,有可能是 IP datagram(0x0021)、Link Control Data(0xC021)、Network Control Data(0x8021)。
再來是長度為 2 bytes 的 CRC 欄位,用來檢查錯誤之用。
而由於 PPP 使用 0x7e 作為 flag 欄位,因此在 information 欄位中若是有出現 0x7e,就必須進行額外的處理:
- 同步連結
在同步連結中,所此用的方式稱為 bit stuffing - 非同步連結
- 在非同步連結中,使用 0x7d 作為跳脫字元(escape character),並將 0x7E 的第 6 個 bit 的 1 換為 0,因此 0x7E 會被轉換為 0x7d 0x5e。
- 但若是資料是 0x7d 呢? 也是同樣方式,因此會變成 0x7d 0x5d。
- 而若是 byte 資料小於 0x20(ASCII 控制字元),也會將其以跳脫的方式來處理,因此 0x01 會轉換為 0x7d 0x21。
最後,要說明運作在 SLIP 之上的 PPP 協定,擁有以下幾個優點:
- 在單一 serial line 中支援多種協定,並非只有 IP datagram
- 多個 CRC 錯誤檢查
- 可使用 IP network control protocol 在兩端點間進行動態的交談
- 可對 TCP 與 IP header 進行壓縮
- Link Control Protocol 可允許兩端點間以不同的方式進行 Data-Link 層級的交談
MTU (Maximun Transmission Unit)
從上面封裝的圖可以看出,每一個封裝後的 frame,不論是在 Ethernet 或是在 IEEE 802 的環境中,都會有其大小的限制,在 data 的部分最大值分別是 1500 btyes(Ethernet) 以及 1492 bytes(IEEE 802),此即稱為 MTU(Maximun Transmission Unit),基本上,不同類型的網路有其不同的 MTU 值。
若 IP 有個大於 Link Layer MTU 值的 datagram 要傳送,就會進行 IP fragmentation,將 datagram 進行切割,讓資料不會超過 MTU 的大小;而各類型網路的 MTU 值可參考 RFC 1191,以下列一張簡圖:
另外還有一個必須提到的重點,稱為「Path MTU」。
假設在同一個網路下的兩端點要互傳資料,必須注意到 MTU 大小;但一般的情況下,兩端點往往不在同一個網路中,而必須經過許多不同的網路才能互傳資料,而這些路徑上所使用的網路又不太可能是完全與自己是相同的型態,因此 MTU 的設定必須要符合所有網路型態的要求才可正確傳送! 因此....MTU 必須修改成傳送路徑上所有不同網路中最小的 MTU 值,此即稱為 Path MTU。
一般來說,兩端點間的 MTU 並非完全不變的,因為一來一回的 routing 不見得是相同,因此可以適時的進行調整以取得最佳的傳送效果,而調整 Path MTU 的方式,稱為「Path MTU Discovery」,可以參考 RFC 1191 得到更多詳細資料。
在第 7~8 個 byte 則有不同(長度為 2 bytes),說明如下:
回覆刪除-> 在第 ** 13-14 ** 個 byte 則有不同(長度為 2 bytes),說明如下:
type:與 Ethernet 中的 byte 欄位是相同作用
-> type:與 Ethernet 中的 ** type ** 欄位是相同作用