2007年6月11日 星期一

[TCP/IP Illustrated] Link Layer

簡介

在之前提到,Link Layer的用途在於接收與傳送以下內容:
  1. 與 IP 之間的 IP datagrams
  2. 與 ARP 之間的 ARP request & reply
  3. 與 RARP 之間的 RARP request & reply
此外,TCP/IP 之所以會幾乎成為 Internet 的標準,一個極大的原因是 Link Layer 可以支援許多不同種類的網路硬體,例如:Ethernet、Token Ring、FDDI、RS-232....等等。

在此部分的重點內容大致分為 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.2 + 802.3 便完整的取代了原本的 Ethernet。

從上述的說明可以瞭解,在 IEEE802 標準裡面﹐將 Link Layer 劃分為兩層:Media Access ControlLogical Link Control,以下用張圖(資料來源:Study Area)來說明這些標準之間的關係:


由於 Ethernet 被後來 IEEE 所制訂出來的標準(802.2 + 802.3)所取代,其中兩者在資料的封裝(encapsulation)上有所差異,不過也是有其相容之處,因此以下用一張圖來說明:

  1. 在前兩個 6 bytes 長度的部分(destination addr 與 source addr),兩種封裝方式都是相同的,儲存的皆是 NIC 的 MAC address。
  2. 在第 7~8 個 byte 則有不同(長度為 2 bytes),說明如下:
    • IEEE 802
      欄位名稱為「length」,用來標示後續的資料內容到欄位 CRC 之前的資料長度。
    • Ethernet
      欄位名稱為「type」,標示後續的資料的種類為何。
  3. 第 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
    • Ethernet
      在 type 欄位之後,接著即是長度為 46~1500 bytes 的資料
  4. 最後長度 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 的過程:

  1. 每個 IP datagram 的最後加上一個 END 字元為 0xc0
  2. 若在 IP datagram 中有 END 字元(0xc0)存在,則會被替換為 SLIP ESC 字元(0xdb)加上 0xdc
  3. 若在 IP datagram 中有 SLIP ESC 字元(0xdb)存在,則會被替換為 SLIP ESC 字元(0xdb)加上 0xdd

當然,SLIP 也是有其缺點的,例如:
  1. 傳送資料的兩端必須知道對方的 IP address,因為在封裝中並不會加入這些資訊
  2. 沒有 type 欄位說明 frame 的型態為何,因此若透過 Serial Line 傳輸的資料,都會被認為使用 SLIP 協定,因此無法同時使用其他協定
  3. 沒有 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 包含了三個部分:
  1. 在 serial link 上封裝 IP datagram 的方式,並支援同步與非同步的連結
  2. LCP(Link Control Protocol),用來建立、設定、測試 Data-Link connection,允許兩端點間以不同的方式進行交談
  3. 多個 NCP(Network Control Protocol),用來處理來自上層(Network Layer)的不同協定,例如:IP、DECnet、AppleTalk....等等
其中 PPP 封裝的方式以及 LCP 的相關資料,可參考 RFC 1548;而定義處理 IP 的 NCP 可以參考 RFC 1332

接著要介紹 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,就必須進行額外的處理:
  1. 同步連結
    在同步連結中,所此用的方式稱為 bit stuffing
  2. 非同步連結
    • 在非同步連結中,使用 0x7d 作為跳脫字元(escape character),並將 0x7E 的第 6 個 bit 的 1 換為 0,因此 0x7E 會被轉換為 0x7d 0x5e。
    • 但若是資料是 0x7d 呢? 也是同樣方式,因此會變成 0x7d 0x5d。
    • 而若是 byte 資料小於 0x20(ASCII 控制字元),也會將其以跳脫的方式來處理,因此 0x01 會轉換為 0x7d 0x21。
而進行如此麻煩轉換的目的,則是為了怕兩端的任何裝置將傳輸過來的資料誤認為 ASCII 控制字元。

最後,要說明運作在 SLIP 之上的 PPP 協定,擁有以下幾個優點:
  1. 在單一 serial line 中支援多種協定,並非只有 IP datagram
  2. 多個 CRC 錯誤檢查
  3. 可使用 IP network control protocol 在兩端點間進行動態的交談
  4. 可對 TCP 與 IP header 進行壓縮
  5. 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 得到更多詳細資料。

1 則留言:

  1. 在第 7~8 個 byte 則有不同(長度為 2 bytes),說明如下:
    -> 在第 ** 13-14 ** 個 byte 則有不同(長度為 2 bytes),說明如下:

    type:與 Ethernet 中的 byte 欄位是相同作用
    -> type:與 Ethernet 中的 ** type ** 欄位是相同作用

    回覆刪除