2014年6月21日 星期六

二樓的介紹(Data Link Layer)

一樓主要是各種硬體設備,三樓主要是資料的轉送和路由,大多以軟體(作業系統)來實作,而二樓就是要連結這兩部份的樓層,也是軟體和硬體相遇的地方。

二樓許多功能會實作在網卡裡面,而部份功能也會實作在驅動程式和作業系統中,作為軟體和硬體之間橋接的角色。

為了搭配發展快速的廣域無線硬體設備(例如手機及其基地台技術),二樓也會因此提出更新的協定與規格,所以相較於樓上三樓與四樓的鄰居而言,二樓的無線成員汰換速度是還滿快的。一樓和七樓的朋友們變化速度最快,種類也最多,二樓需要跟上一樓的腳步,而這一切都跟商業行為有關。

就抽象模型來看,二樓和四樓頗有相似之處,因為四樓要做的是程序間的通訊,在四樓的通訊模型中,只有端點對端點 (End-to-End) 的存在,因此四樓的演算法只需要專心考慮端點對端點之間的通訊往來。二樓也類似,因為二樓負責的也是端點對端點的通訊,而且不只是抽象模型如此,在實體模型上更是如此,例如二樓就是負責從電腦 Ethernet 網路卡,透過網路線,到第一個連結的網路設備(例如交換器)之間的連結通訊,又例如從電腦 802.11 無線網路卡,透過空氣中的無線信號,到第一個無線基地台之間的連結通訊。

你可以理解,二樓與四樓同樣都是端點對端點的通訊模型。大概最大的差別就是,四樓的模型中,必須考慮端點對端點之間,會有許多未知的因素發生;而二樓就是實體模型也是端點對端點,所以模型中需要考慮的東西可以單純許多。另外一個差別就是,二樓因為牽涉到一樓的硬體,也就牽涉到許多商業銷售的考慮,一定要便宜,而且又能大量生產,隨插即用等等,所以二樓的一些演算法,許多都會考慮到從硬體實作的方式,以及盡量簡化的方式。

二樓主要提供的服務可能有以下:
  • Framing
  • Error Detection/Correction
  • Reliable Delivery
  • Link Access
  • Flow Control

另外,二樓中還有個 Full-duplex 以及 Half-duplex 的觀念,duplex 代表通訊是雙向的,兩方都可以,問題只在於是否允許同時而已。Full-duplex 和 Half-duplex 依序代表允許雙向同時通訊,以及同一時間內,只有單方向可以通訊。

以下我們將就上述的服務,以及一些二樓常見的協定來介紹。

Framing

通常一樓的硬體傳輸的方式,不論是以數位或類比訊號傳送,抽象上都可以看作是連續的數位訊號流 (bit stream),而二樓需要面對的,就是將上層一個又一個的封包,放進這樣的數位訊號流中。通常的作法是把封包放入符合硬體設計的一個單位裡面,這樣的單位我們通常稱呼為 Frame。在 Ethernet 裡,一個 Frame 的最大上限是 1500 bytes,最小是 46 bytes。

但是在數位訊號流中,訊號是連續的,要刻意製造出間隔,才能夠達到看起來有一個又一個 Frame 的效果。常用的作法有兩種,以下只介紹觀念:

1. Character Count
2. Flag with Byte/Bit Stuffing

Character Count 類似在表頭前面加上封包長度的觀念,告訴接收方:「我這後面有多少個字 (Characters) 要送過來,你可以預備一下。」

Flag with Byte/Bit Stuffing 就是透過使用一些特殊固定的 bit pattern 為 Flag,告訴接收方說,接下來開始是什麼樣的資料。麻煩的是,如果同樣的 pattern 出現在所包裝的資料本身之中的話,可能造成接收方誤判,這時候我們就會透過類似 Escape 的機制來解決。像在寫程式的時候,字串中遇到特殊字元會需要透過反斜線 \ 來「跳脫」該特殊字元,只要訊號流中出現特殊的 Flag,就使用 Byte/Bit Stuffing 來跳脫,這樣就可以區別出來,哪些是真正的 Flag,而哪些其實是資料。

大多數的二樓協定都有支援 Framing 服務。

Error Detection/Correction

Error Detection 常見的作法有三種:
1. Parity Bits
2. Checksum
3. Cyclic Redundancy Code (CRC)

其中 Parity Bits 作法就是在資料串流之外,加上數量固定的 bits,使其中 bit 1 的數量為奇數或偶數,通訊雙方先講好,要嘛奇數,要嘛偶數,然後傳輸後,如果收到非預先講定的 bit 1 奇偶數,則代表傳輸過程中有錯。

透過二維的 Parity Bits 可以作到錯誤更正 (Error Correction)。漢明碼 (Hamming Code) 也可運作錯誤更正。

Checksum 的作法之前三樓和四樓都提過,三樓是只針對 IP Header 做,四樓是整個封包做,它們都是透過 16 位元的 1s Compliment 機制來達成目的。

CRC 類似 Checksum 的概念,只是算法不同,比較適合硬體來執行。作法是先訂出一個固定的產生器 G,然後決定好 CRC 的長度 r,r 通常為 8, 16, 或 32,將資料 D 經過算式 R = (D * 2^r)/G 運算,求解出 CRC 的 R 值,接收方檢查的時候重作一次,拿傳送方的 R 值來對照,就知道是否有錯誤發生了。

大多數二樓的協定,是使用 CRC 來偵測錯誤。另外,除非是重新傳送的花費太大的情況,否則鮮少有支援修正錯誤 (Correction) 的服務,大多數都是偵測到錯誤之後選擇重新傳送或甚至直接丟棄。

Reliable Delivery

通常在有線的環境裡,錯誤比較少會發生;反過來說,無線的環境則很容易發生錯誤,此外還可能有干擾、Hidden Terminal 以及 Fading 的問題,所以無線的協定常常會支援 Reliable Delivery 的服務,類似我們提過四樓的 Reliable Data Transfer 機制(請參考本網站四樓的介紹),用詞不同是習慣用語,以此和四樓做一個區別,但是骨子裡機制是類似的。

通常只有無線的協定有支援 Reliable Delivery,例如 802.11 區域無線網路協定。因為避免上層網路不斷地重新傳送,造成更大的額外負擔。至於有線網路,則鮮少支援 Reliable Delivery 服務。

Link Access

這是二樓最複雜的服務之一,也就是解決面對不同的傳播媒介,究竟我們如何傳輸資料的問題。這牽涉到相當多的通訊技術,我不是通訊專長,只能就理論概念簡介而已。

二樓所面對的媒介,通常可以分為兩種:
  • Broadcast Link
  • Point-to-Point Link

我用的「媒介」二字,在二樓的英文是「link」,它並非單純的實體媒介 (這裡比較接近的詞是 medium),它是牽涉到實體媒介的本質,以及抽象概念上我們如何通訊。

解決以上傳播問題的協定,我們通常叫它們 Medium Access Control protocol(s),而在二樓用的端點位址,我們就叫 Medium Access Control address(es),也就是 MAC 地址

以下我們針對這兩種 Links 來分別討論。

Point-to-Point Link & PPP

Point-to-Point Link 比較單純,但是使用者相當多啊!一般家用使用者,常常會透過 ADSL 或 VDSL 來連線,作法上就是在家裡安裝一台 ADSL Modem,Modem 一端連接乙太網路,另一端連結從外面牽進來的電話線,乙太網路可以再連結電腦,或者家中的其他網路設備,電話線則連到供應商的線路設備。

關鍵在於連出去是透過電話線

Point-to-Point Link 所使用的 PPP (Point-to-Point Protocol) 就是走這個電話線,你從乙太網路連過去走的是 PPPoE (PPP over Ethernet),到 ADSL modem,再將訊號轉換成為可透過電話線傳輸的頻率,然後連到 ISP 機房的 Modem,反轉換成乙太網路訊號後,再連到路由器。Modem 如何轉換訊號與切換頻譜,是一樓的通訊技術。以前用 56 Kbps 撥接式 Modem 也是使用 PPP,如今 ADSL Modem 不用撥接了,頻譜轉換的技術也高明許多,允許速度快非常多的傳輸。

簡言之,PPP 就是一個端點對端點的二樓協定,它是虛擬的獨占線路,一邊端點是使用者的電腦設備,另一邊是 ISP 的路由器,連線一旦建立起來,抽象上來說不需要考慮會有其他人共享這條傳輸線的情形,所以廣播、多點傳輸、碰撞或干擾這些議題都不需要考慮。

Broadcast Link

Broadcast Link 代表該傳播介質可能同時有好幾個人在使用,例如無線訊號傳播於空氣中,或者是 802.3 乙太網路訊號透過集線器連結等等,最需要解決的是所謂 Multiple Access 問題,也就是彼此訊號碰撞,互相干擾的問題。當同時有許多人想要傳輸資料的時候,要依循什麼樣的機制來存取該傳輸管道,才不會讓信號打架,彼此干擾混淆,以至於無法辨認與接收。解決這類問題的協定,我們通常叫 Multiple Access Protocols,大致有以下三類:
  1. Taking Turns
  2. Channel Partitioning
  3. Random Access

Broadcast Link - Taking Turns

我們從 Taking Turns 開始看。Taking Turns 機制主要是讓所有共享傳播介質的使用端,輪流取得完整的使用權。有點像是一張桌子上圍了一群人,但是夾菜的筷子只有一雙,所以大家輪流。輪流的演算法通常有兩種類型:
  • Polling
  • Token Ring

Polling 用的方式是這一群人中,有一個大家長,負責輪流依序通知每個人傳輸的時間,當你被通知到的時候,你擁有傳輸某最大資料量上限的權利,傳完之後,這位家長再依特定順序通知下一個人。

Polling 的好處是可以完全避免訊號干擾問題,因為都統一由家長協調,且一次只有一個人可以傳輸資料。缺點就是如果家長掛掉了,整個機制就掛了。此外,第二個缺點就是一定會有一個 Polling Delay,也就是不管某人要不要使用傳輸管道,輪到它的時候,家長都還是得通知它,所以即便一群人當中只有一個人想吃飯,但是只要你在飯桌上,就還是會問一問你的意思,這個時間延遲我們叫 Polling Delay。

Bluetooth 使用的就是 Polling 的機制。

另外一種是 Token Ring,和 Polling 做區隔,通常沒有家長了,大家是同等的地位,然後一群人當中有一個代表權利象徵的物品,我們叫它 Token。

大家依序輪流拿到這個 Token,拿到 Token 就擁有傳輸資料的特權,傳遞 Token 的隊形排成環狀,所以這個方法叫做 Token Ring。Token Ring 的方式優點與 Polling 一樣,可以完全避免訊號互相干擾問題,且 Token Ring 也沒有 Polling Delay,但是拿到 Token 的某人,如果發生故障,則整個機制會崩解掉。802.5 就是 Token Ring 機制,現今使用 Token Ring 的產品相當稀少。

Broadcast Link - Channel Partitioning

Channel Partitioning 的主要演算法有三種,基本上手機通訊的機制都是使用 Channel Partitioning 的方式,以下分別介紹這三種,實務上常常是這三種互相結合變化產生出來的規格。

Channel Partitioning 的優點就是完全不會打架,訊號彼此不會互相干擾,理論上。

以下是常見的三種機制,我們只介紹觀念。
  • Frequency-Division Multiplexing (FDM)
  • Time-Division Multiplexing (TDM)
  • Code Division Multiple Access (CDMA)

Frequency-Division Multiplexing (FDM)

FDM 是切割頻譜成不同的範圍,使用者可以在不同的頻率範圍傳輸資料,優點是因為在不同的頻率段,所以彼此可以同時傳輸,又不會互相干擾

Time-Division Multiplexing (TDM)

TDM 則是將單位時間切割為許多小單位,稱為 Time Slots,每個使用者都在屬於自己的 Time Slots 裡頭才能傳輸資料,優點也是不會互相干擾,雖然算不上是「同時」傳輸,但是稍微等一下,每回合都會有你可以送資料的時候。

FDM 和 TDM 的缺點都是效率,可以想見,假設今天只有一個使用者,該使用者仍然無法使用全部的頻寬,或者全部的時間單位,按照 FDM 和 TDM 的機制,切割好後每個使用者只能夠使用分配到的部份,因此即便此時此刻其他頻寬或時間資源都沒人用,也不能拿來給你用。反過來看,這兩種都是非常公平的機制,對每個使用者一視同仁,不會有誰可以一直強佔著的情況發生。

Code Division Multiple Access (CDMA)

最後一種 CDMA 是一種神奇的機制,也是運算最繁複的機制。概念上就是每個使用者給予其不同的編碼 (Code),其編碼頻率比資料傳輸的頻率要高出許多,例如使用者要傳送 bit 1 資料,使用者的編碼就將這個 bit 1 編碼為一組 01 字串,你可以想像從一個 bit 到一組 01 字串,取決於字串的長度,編碼的頻率就比資料傳輸的頻率高出多少倍,字串長度為 N,則高出 N 倍。

厲害的地方是,每個使用者使用的編碼 (Code) 不同,以至於經過編碼後的資料傳輸出來,彼此不會互相抵銷干擾,接收端可以同時接收每個使用者所傳輸出來的資料。關鍵在於 Code 的選擇與產生,只要 Code 選擇的夠好,編碼出來的資料就會有唯一性,所以每個使用者所傳出來的資料就不會干擾。有點像是每個使用者使用不同的語言,有人用中文,用人用法文,有人用俄語,然後接收方只專心的聽其想聽的那種語言。這種神奇的方式,解決 TDM 與 FDM 的效率問題。關鍵在於 Code 的選擇與計算,取決於 Codes 的數量,使用者數量也因此受限制。

2G 手機的 GSM 系統是使用 TDM + FDM,而像亞太電信的低功率手機則是使用 CDMA,規格叫做 CDMA 2000。

3G 的 UMTS 系統則是使用 TDM + FDM + CDMA 三種機制綜合的方式,規格叫 DS-WCDMA (Direct Sequence Wideband CDMA),名字裡雖有 CDMA,骨子裡其實機制是三種混合。

手機到了 4G LTE 以後又恢復 TDM + FDM,而且很酷的是,全 IP (Internet Protocol)。被 LTE 幹掉的 WiMAX 也是 TDM + FDM 兩種機制混合。

手機的二樓通訊是持續不斷的戰國時代,數不清的專有名詞與規格,晚點我們會再來看手機的部份。

Broadcast Link - Random Access

Broadcast Link 的最後一種常見的通訊機制為 Random Access,顧名思義就是允許每個使用者可以隨機的存取傳輸管道,打架了再來解決。

Random Access 常見的機制有兩種,一種是 802.3 Ethernet 乙太網路使用的,也就是我們一般常見的有線網路,而另一種則是 802.11 Wireless LAN 無線區域網路所使用的。依序為以下兩種:
  • Carrier Sense Multiple Access (CSMA) with Collision Detection (CSMA/CD)
  • CSMA with Collision Avoidance (CSMA/CA)

CSMA/CD

我們先來介紹 Carrier Sense Multiple Access (CSMA)。

CSMA 顧名思義就是擁有對所使用的傳播媒介 (Carrier) 的感知能力 (Sense)。當要傳輸任何資料之前,先感知一下,確定沒有人在傳輸資料,才開始傳輸,這就是 CSMA。

而 CSMA 加上 Collision Detection 的功能則是,當我已經傳輸到一半,我又感知到有人跟我一樣在傳輸的話,我就中止我的傳輸,並且等待一段隨機長度的時間區間,而後繼續回到一開始的感知過程。

比較容易有的疑問是,如果我已經可以正確感知,確定沒有人在傳資料,然後我才開始傳輸,為何還會發生和我同時間一樣在傳輸資料的人呢?難道我感知錯了嗎?還是那個人太白目,傳之前沒有感知一下我呢?

原因在於介質傳播的延遲 (Propagation Delay),可能我感知到沒人,所以開始傳輸了,而別人也在感知,但是我傳輸到它那邊的速度受介質傳播的延遲影響,還沒到,所以它以為沒人傳輸,因此也開始傳輸。傳到後來,我們才感知到對方的動作,這個時候 Collision Detection 的機制就會要我立刻停下來,並且等待一段隨機長度的時間,再繼續傳輸。等待隨機的時間是期待你我雙方等的時間不一樣,以至於會有個人先傳,後來不會再搶資源。

這就是 CSMA/CD,也就是 Ethernet 的機制。

CSMA/CA

另外一種是 Collision Avoidance (CA),運用於 802.11 區域無線網路,機制的主要目的是要避免碰撞,不像 Ethernet 一樣是偵測碰撞

主要原因是無線信號容易有干擾,且各傳送端送出的訊號強度不一,又有 hidden terminal 和 fading 的問題,再加上無線信號要同時傳送與接收比較困難,造價比較昂貴,因此 802.11 的區域無線所採用的是 Collision Avoidance 而非 Collision Detection,畢竟偵測不到太弱或受干擾的訊號,打造可以在傳輸同時接收以偵測的硬體也比較困難。

Hidden Terminal 問題就是假設有三點 A, B, C 彼此通訊,A 要傳資料給 B,C 也要傳資料給 B,而因為障礙物的關係,以至於 A 與 C 之間的訊號被障礙物阻隔起來,彼此偵測不到對方,因此彼此就為對方的 hidden terminal,這裡的 terminal 指的是傳收訊號的端點。

Fading 問題就是假設有三點 A, B, C 彼此通訊,A 要傳資料給 B,C 也要傳資料給 B,但是 A, B, C 三點彼此的地理位置就剛好按順序是 A, B, C,你可以想像假設它們在一直線上,而 A 與 C 之間的距離最長,這個長度剛好使得它們兩者彼此偵測不到對方的訊號,也就是訊號在傳到對方那裡之前,就已經衰弱 (fading) 掉了,因此彼此無法偵測。

CSMA/CA 的機制就是一開始傳送方偵測是否有人在傳輸資料,如果沒有,就隨機等待一段時間,這段時間我們叫 Distributed Inter-Frame Space (DIFS),等待完之後,如果還是沒偵測到有人在使用,就隨即送出完整的資料 frame。對無線區域網路而言,無法一邊傳輸一邊還偵測是否發生碰撞,不像 Ethernet,所以一旦送出的按鈕一按下,整個過程就不會停下來,直到送完整個 frame 為止。第二,接收方在收到資料後,會隨機等待一段時間,接收方所等待的時間,我們叫做 Short Inter-Frame Space (SIFS),等待完後,會回送一個 Acknowledgement frame 給傳送方,期待告知已成功接收資料。最後,傳送方在收到 ACK 之後,便確定資料已經正確送出了。

因為無線區域網路干擾嚴重,掉封包的機率很大,因此它在二樓就提供了 Reliable Delivery 服務,如同我們前面所描述的,機制與四樓用的類似,也是透過 ACK 和 Timer 來確定資料傳輸正確。

剛剛提到 DIFS 和 SIFS,這兩段隨機的時間作用在於,想像一種情況,有三方甲乙丙,甲方已經佔住管道在傳輸資料,乙與丙都想傳輸,偵測到甲之後,等待它用完,等到它一用完,按照 CSMA/CD 的作法,乙和丙都會立刻傳輸,然後不久隨即偵測到對方的信號,因此停止傳輸,這就是 Collision Detection,在 Ethernet 上速度比無線快很多,發生碰撞沒什麼了不起,頂多重傳就是了。但是在無線裡頭,如果放任這種情況不管,加上干擾問題,信號的正確傳輸率會很低,因此 Collision Avoidance 的機制考慮到這一點,才在傳送前加上 DIFS 和 SIFS 這兩段隨機的等待時間,以提前避免掉這種問題。

另外區域無線也支援 Request To Send (RTS) 和 Clear To Send (CTS) 的機制,也就是使用者可以在送出某段比較長的資料 frame 之前,送給無線基地台一個 RTS 請求,基地台如果允許這樣的請求,就會廣播回一個 CTS 訊息給旗下所有使用者。送出請求者收到訊息,知道接下來有一段時間它可以獨占傳輸,所以就進行傳輸。其他使用者收到之後,知道接下來有一段特定時間它們必須閉嘴安靜。

實務上 RTS/CTS 機制通常是關閉不使用的。

Flow Control

總結一下,到此,我們已經介紹了幾種二樓常見的服務,包括 Framing、Error Detection/Correction、Reliable Delivery,以及 Link Access,最後一種理論上應該提供的服務為 Flow Control。

Flow Control 也類似四樓的機制,主要是判別傳送方是否會傳太快以至於塞爆接收方的緩衝區,請參考本站對於四樓的介紹。這與三樓 IPv6 的 Flow 是不同的概念。

Flow Control 常見的手法有兩種,一種是 Feedback-based,另一種是 Rate-based。Feedback-based 就是由接收端提供反饋訊息,告知傳送端我這裡的緩衝區有多少,這也是 TCP 用的方式。Rate-based 就是不管接收端如何,總而言之給傳送端一個上限,超過那個上限就得減速。

Software-Defined Networking (SDN)

我孤陋寡聞,不知道有哪些二樓協定實際上支援 Flow Control 服務。我只知道有一種新興的機制與協定,從 2008 年開始的,目前 (2014) 也還在發展中,叫做 Software-Defined Networking (SDN) 以及 OpenFlow。SDN 主要是控制 Switch (交換器),但因為其控制的層級,可以擴展到網路的三四樓,包括 IP 與四樓的通訊埠,所以不單只是侷限在二樓而已。我沒有實際操作過,只能就概念上來介紹。

SDN 將封包的 Forwarding 和 Control 就抽象層面分開來,使得程式可以控制二樓的資料流動,包括要從哪一個交換器的孔到哪一個孔等等,一般來說交換器封包 Forwarding 功能是隨插即用自主學習的,SDN 就是希望可以更多的控制這樣的資料流動,以面對雲端運算時代所需要的彈性與突發性的龐大流量,這龐大流量常常跟地理位置相關,所以如果可以透過程式中央集權控制交換器上的資料流,就可以提供更有效率的服務。

這跟 Flow Control 有何關係?Well...因為我對 SDN 很不熟,從它畫出來的餅來看,用它來作到 Flow Control 應該是有機會的,畢竟我都可以用程式來控制二樓資料流了嘛。

以上,我們就將二樓常見的服務介紹完畢了。接下來我們要探索一下二樓的 Addressing、Switch 裝置 (交換器)、VLAN,以及一些實際的二樓協定,包括 Ethernet、WLAN、和一些手機通訊協定。

MAC Address(es)

TCP/IP 網路在二樓所使用的位址稱作 MAC address (MAC = Medium Access Control),以 6 bytes 為單位,通常表示法為 XX:XX:XX:XX:XX:XX 或者是 XX-XX-XX-XX-XX-XX,例如:10:dd:b1:c8:a1:be,用 : 或 - 隔開,每個區間用 16 進位表示法代表一個 byte。

特別的是在二樓的廣播位址,會以 FF:FF:FF:FF:FF:FF 來表示,代表此 frame 將廣播給這個網路的所有人。

我們再一次來探討一個簡單的問題,就是在二樓的視野裡,什麼叫做「這個網路」。簡單來說,因為二樓的範圍是從一個實體端點設備(例如 PC),到另一個實體端點(例如路由器)之間的連線,有可能有數台電腦設備與一台路由器,都透過一台交換器彼此連在一起,形成一個實體網狀的區域網路,那這幾台電腦設備以及該路由器(不包括那台交換器,因為它是隱形的!),就形成了一個二樓視野裡的「網路」,當其中一台電腦想要廣播給該網路的所有人時,就可以透過 FF:FF:FF:FF:FF:FF 來傳遞。

所以當我們看到「廣播」這個詞的時候,需要注意它指的是哪一個樓層的廣播,不同樓層意義不同。

剛我們看到「網路」這個詞的時候,也該注意它指的是哪一個樓層的視野,不同樓層代表不同意義。通常我們說「區域網路」常常指的是二樓範圍的網路。雖然原先區域網路是從地理範圍來定義的,例如一間辦公室、一棟大樓、或者一間學校等,擁有封閉性質的一個網路,不一定侷限在二樓,而是指現實生活中擁有封閉性質的一個相對小地理範圍的網路。

交換器是個平凡又神奇的設備,神奇之處在於,它對於端點電腦來說,是完全隱形的,但是又可以將各個端點電腦連結交會於二樓,而同時呢,它又平凡的隨處都買得到,價錢也相當便宜(至少家用的機種)。我們晚一點會介紹它。

MAC address 的前三 bytes 是跟著硬體供應商的。MAC address 是每張網卡都有一個,而且理論上,每張網卡的 MAC address 都不同,因為前三個 bytes 區別了不同網卡供應商,同一家供應商透過後面的三個 bytes (24 位元,允許一千六百多萬的組合) 來讓每張網卡有不同的 MAC address。你可以看見其實組合並不多,但是因為 MAC address 不會離開二樓的個別網路,所以不影響。因為不會存在一個二樓網路同時擁有一千多萬台電腦,如果有的話,它光是傳遞 ARP 訊息就會暴掉了,ARP 是我們等一下要看的協定。

一個常見的問題是,既然有了 IP 位址,為什麼還需要 MAC 位址呢?原因很簡單,因為三樓不一定要是 IP,三樓可能是別的協定,就不一定使用 IP 位址。此外,通常電腦設備都會有機會,在某種狀態下,暫時沒有辦法取得任何 IP 位址,例如我們三樓看到的 DHCP 協定,在取得 IP 位址之前,設備還是需要可以傳輸資料,因此二樓的 MAC 位址有充分存在的必要。

作業系統有能力修改網卡的 MAC 地址,通常不是真的修改硬體內的記憶體,而是透過作業系統或驅動程式內的控制,讓網卡傳送出去的資料 frame 改成我們所設定的值。

因此,依靠 MAC 地址所作的安全協定有被破解的風險。

Address Resolution Protocol (ARP)

ARP 其實是介在二樓與三樓之間的協定,它幫助電腦取得目的地的 MAC 地址,以至於可以在區域網路內傳輸資料。它有點類似七樓的 DNS 服務,DNS 是將網域名稱對應到 IP 位址的服務,而 ARP 則是將 IP 位址對應到 MAC 位址的服務。

例如某台電腦的 IP 是 192.168.1.1,它想要傳輸資料到同一個網域的 192.168.1.2,但是它送出封包前,並不知道 192.168.1.2 的 MAC 位址是什麼,這個時候它就會透過 ARP 發送二樓的廣播封包,問所有人 192.168.1.2 的 MAC 位址是什麼。原則上只有 192.168.1.2 這一台電腦,在接收到這個廣播封包的時候會回答它,告訴它說自己的 MAC 位址是什麼,然後 192.168.1.1 就可以得到 MAC 位址資訊,下一個封包傳輸,就會直接在目的地寫上 192.168.1.2 的 MAC 位址。

ARP 服務本身並不提供任何安全保護,所以資料可以偽造,有名的區域網路中間人攻擊就常常利用 ARP 服務本身設計的弱點來攻擊。

簡言之,ARP 是串起 IP 位址和 MAC 位址之間的橋樑

值得一提的是,ARP 與 MAC 位址只運作於區域網路,舉例來說,當 192.168.1.1 要送出資料到外界的一台電腦,假設外界的 IP 是 1.1.1.1,通常 192.168.1.1 並不會詢問 1.1.1.1 的 MAC 地址,而是詢問此網域的閘道器的 MAC 地址,透過 ARP 問得之後,傳送給 1.1.1.1 的封包裡,目的地 IP 位址是  1.1.1.1,但是目的地 MAC 地址卻是閘道器的 MAC 地址,也因此閘道器可以扮演轉送的角色。

Switch (交換器)

通常二樓的交換器上面有好幾個孔,可以接入許多網路線。對所有接入網路線的電腦設備來說,交換器是隱形的,也就是說,端點電腦設備在通訊時,感受不到交換器的存在。

交換器有以下幾個特點:
1. 避免碰撞:乙太網路的特性就是會彼此碰撞,也因此才安排它們遵守 CSMA/CD 協定,但是交換器可以避免掉不同設備傳輸時所發生的碰撞。
2. 允許不同規格的線路:例如交換器可以同時允許 CAT-5 和 CAT-6 不同規格的網路線接入,當然這與交換器本身的支援程度有關,但是交換器這個角色讓不同規格線路彼此連接在一起這件事情變成了可能。
3. 提供管理功能:高階的交換器提供更多的管理功能,例如遠端監控或是 VLAN 等等,我們晚一點會來看 VLAN。近年來從思科 (Cisco) 等交換器大廠開始提出的 AON (Application Oriented Networking) 概念,即是透過交換器等網路設備,協助讓特定的應用層的服務運作得更有效率,例如協助讓即時影音的封包維持一定的流量水平。另外一個提出來的概念是 SDN (Software Defined Networking),也就是我們前面所介紹過的,也是多實作於交換器上面,使其提供更多的彈性與管理功能。

交換器運作的方式在於,其內部保留一個表格,常被稱為 switch table,表格有三個屬性,第一是 MAC 地址,第二是孔編號,第三是時間戳記,實作上可能會有所變化,但是概念上主要是這三種屬性。

當任何二樓 frame 通過流進入任何交換器的孔的時候,交換器就會更新該表格,將來源 MAC 地址、孔編號,以及時間戳記記錄下來。因此,交換器就可以知道:哪一個孔連到哪一個 MAC 地址(或者說哪一張網卡)。下次有別人要傳送資料的時候,交換器就根據目的 MAC 地址,對照它的表格,直接轉送封包進入該目的孔,避免和其他乙太線路發生碰撞,也因此可以大大提高區域網路內的效能。

以上這些學習的過程,交換器都是自動發生的,所以交換器可以說是隨插即用的好設備。

理論上交換器內部的 switch table 項目,會隨著時間間隔過程而自動消失 (aging),以確保表格的記憶體夠用,因為舊資料一段時間後如果沒有更新,就會被自動淘汰。當然,這也會跟每一種不同廠牌型號的交換器實作有關。

一般家用或低階的交換器通常沒有提供什麼安全防護,所以如果你不斷地餵給它錯誤的來源 MAC 地址,可以有機會把它內部的 switch table 塞爆,或者你也可以假裝你是別台電腦,只要一直傳那個電腦的 MAC 地址給你的連接孔,交換器也極有可能就把本來該傳給別孔的資料,傳到你這裡來,這種手法常被稱作 Port Stealing

交換器與路由器有幾項差別如下,首先是交換器的優點。

第一,交換器是隨插即用的:當然除了一些比較高階的管理功能以外,交換器的最基本功能是直接接電,插網路線就可以用了。

第二,交換器運作於網路第二層,所以不需要像路由器一樣去看三樓的資料,除非是一些比較進階的交換器功能,所以一般來說,如果同樣硬體設備等級,交換器的效能會好一些,因為要處理的東西比較少。

再來看交換器的缺點。

第一,交換器預設只支援實體樹狀結構,也就是網路不能夠有迴圈。這個缺點可以透過 802.11D 協定 Spanning Tree Protocol (STP) 或者 Rapid STP (RSTP) 來解決,但是通常是比較高階的機種才有支援這兩種協定。這兩種協定基本上是透過交換器在一定的時間週期內掌握網路的拓譜結構,並且計算出 Spanning Tree,只有在樹上的線路才允許通透,否則都阻擋資料傳送,以至於可以偵測迴圈,並且將迴圈的孔阻擋下來。STP 大約可以在半分鐘以內發現迴圈並且成功阻擋,RSTP 大約可以在 10 秒內。

第二,如果交換器連結的電腦設備很多,ARP 封包也會相當多,因為 ARP 協定有一半的封包是區域網路的廣播封包,如果越多電腦都只靠交換器連結起來,都處於同一個區域網路之內,那 ARP 封包佔的比例會越高。這個缺點透過切割整個大網路成幾個 Virtual LAN (VLAN) 可以解決,但是通常比較高階的交換器才有支援 VLAN。

路由器的優缺點大概跟交換器相反。它的缺點就是它不是隨插即用,通常要許多的設定與維護工作,而且它運作於第三層,所以要處理的資料量比較多。它的優點就是它可以允許迴圈存在的網路拓譜 (topology),而且 ARP 封包也不會通過路由器,到達第三層以前就被卡死了。

Virtual Local Area Network (VLAN)

VLAN 是個好東西,但是通常要比較貴的交換器才有支援。VLAN 的主要好處有三,第一是 Traffic Isolation,第二是提供更多管理功能,第三是可以節省設備的數量、空間,或者總消耗電力(數量多,當然空間需求就大,當然也會消耗更多總電力)。

VLAN 可以指定交換器上的某些孔屬於某個區域網路,我們稱其為虛擬區域網路(所以這個技術的名字才叫做 VLAN),當這個虛擬區域網路中的某人要送出廣播封包的時候,只有被指定的那些孔才會收到,其他孔都不會,有點類似群組的概念,因此可以達到 Traffic Isolation 的功能,避免 ARP 封包這一類的區域廣播佔用過多的資源。

此外,這樣的區隔群組功能也可以達到網路安全中的 Confidentiality 的目的,因為被指定的孔,可以看作是某種形式的被授權,只有某些孔才能夠收到廣播訊息,並且可以在一個虛擬的區域網路內彼此連線。其他人要連過來,一定得透過路由器,甚至是防火牆才能夠連線。這樣的一種防止未授權存取某些資源的概念,我們說它是達到了 Confidentiality 的目的。

想像有一個樓層的辦公區間,因為業務層級不同,需要切割成三個區域網路,本來要透過三台實體交換器才能達成的目的,只要一台擁有 VLAN 功能的交換器就可以了,因此使用 VLAN 也可以節省設備的數量。不過支援 VLAN 的交換器通常比較貴,所以這一點見仁見智了。

VLAN 的另一個功能我們叫做 Trunking,就是連結兩台支援 VLAN 以上的情況下,可以各指定這兩台交換器中的某個孔為 Trunk Port,然後直接連接這兩個孔,就可以達到擴充交換器的效果了。兩台接在一起之後,等同於是一台孔數相加的交換器。Trunking 其實就是將該孔設定為屬於任何虛擬網路,因此每個虛擬網路會收到的廣播封包,那個孔都會收到。

VLAN 的實作上是透過在資料 frame 裡面加入 4 bytes tag,其中 2 bytes 用作 ID,另外 2 bytes 用作控制,這些都定義在 802.1Q 規格內。

Ethernet (乙太網路)

這是我們生活中最常見的網路線形式,通常你去賣場買到的網路線都是 Ethernet 格式,定義於 IEEE 802.3 規格內。

Ethernet 使用 CSMA/CD,如我們在前面所介紹的。

Ethernet 所使用的封包格式我們就不另外介紹了,通常只要知道這樣的資料 frame 裡面會帶著目的 MAC 地址,以及來源 MAC 地址。

Ethernet 的 Maximum Transmission Unit (MTU,最大傳輸單位) 是 1500 bytes,因此每個資料 frame 所帶資料的最大上限是 1500 bytes,最小是 46 bytes。

常有人用 Ethernet 的 MTU 減去 IPv4 的最小表頭 20 bytes,以及減去 TCP 的最小表頭 20 bytes,因此說 TCP 的 MSS (Maximum Segment Size) 應該設定為 1500 - 20 - 20 = 1460 bytes,MSS 是指 TCP 所帶的純粹資料大小,不包括 TCP 或 IP 表頭。

原則上沒什麼不好,只是需要知道減去的 IPv4 和 TCP 表頭都是最小值,這兩種表頭都允許 options 欄位,各別最大可到 60 bytes。如果是 IPv6,則表頭應該算是固定 40 bytes。此外,如果資料送出去又有 VLAN 加工,那還要再算上 VLAN 的 4 bytes。還有,如果有 IPv6 轉成 IPv4 的 Tunnelling,又要再加上 20 到 60 bytes 的 IPv4 表頭。最後,如果還有經過 VPN (Virtual Private Network) 的保護,嗯...,看是使用 IPsec 技術或者是 SSL 技術的 VPN,使用 IPsec 又要看是使用 AH/ESP 以及 Transport/Tunnel 模式,使用 SSL 要看軟體如何實作,不管如何,它們都會將新的表頭或表尾加諸在你原先的封包上。所以到底 MSS 該設定為多少呢?通常讓作業系統幫你決定就可以了。

WLAN (Wireless Local Area Network)

WLAN 就是我們常用的無線區域網路,我們也常叫它 Wi-Fi,定義在 IEEE 802.11 規格內。

WLAN 使用的是 CSMA/CA 協定,避免信號碰撞,如我們上面已經介紹過的。

WLAN 通常有 802.11b, 802.11a, 802.11g, 以及 802.11n 這幾種,通信頻率與速度皆有分別。最常用的 802.11b 和 802.11g 是操作在 2.4~2.485 GHz,分別可以支援 11 Mbps 和 54 Mbps。新興的 802.11n 透過多天線裝置來達到更高的傳輸速度,傳送端使用兩支以上的天線,接收端也使用兩支以上的天線,每對天線傳送不同的信號,以此增加通信容量 (Throughput),這手法叫做 Multiple-Input Multiple-Output (MIMO) 天線,可以達到 200 Mbps。當然,實際上這都受影響於無線基地台設備的好壞、使用者電腦的無線網卡優劣,以及空間中的距離和干擾狀態。

WLAN 有 Infrastructure 和 Ad hoc 兩種模式,Ad hoc 似乎挺有趣的,可惜我不熟悉,所以接下來只針對 Infrastructure 模式介紹。在 Infrastructure 模式中,會有一個 Access Point (WLAN 基地台) 設備,同一個 WLAN 下的使用者都是與該 AP 連接。而在 Ad hoc 模式則是沒有這樣的 AP 角色。

WLAN 中有幾個名詞,包括一個 WLAN 子網域包括 AP 以及透過無線連上它的電腦設備,我們都以 Station 稱呼它們,AP 又稱作 Base Station,而這樣組成的子網域我們叫它 Basic Service Set (BSS)

AP 通常會提供一個以上的無線名稱,我們叫它 Service Set Identifier (SSID),也就是你透過電腦右下角打開無線選單時,會看到的一串無線網路清單,清單上的名稱就是 SSID。如果透過手機連結無線網路,也會看到一組名稱清單,那也是 SSID 的清單。

常見的 802.11b/g 操作的頻段為 2.4 ~ 2.485 GHz,它將此 85 MHz 頻段分成 11 個頻道,而且連續的五個頻道內都有交疊,因此頻道 1 到 5 交疊,6 到 10 交疊,7 到 11 也交疊,依此類推,1, 6, 11 是唯一一組三個沒有交疊的傳輸頻道,因此這三個頻道在一個空間裡可以同時使用而不會互相干擾。

Station (例如手機或電腦) 要連線前,都必須與 AP 連接,這個動作我們叫 Associating。通常也是簡單的三次交通,確定連結完成。第一次是 AP 廣播出 Beacon frame,其中包含了 AP 的 SSID 和 MAC 地址,如果 Station 想連線,就送回給 AP 一個連接請求,如果請求通過,AP 再回送一個確認回應,就連接完成。

Station 也可以在沒有收到 Beacon 之前就主動廣播出 Probe frame,收到 Probe 的 AP,可以選擇回應該 Station,而回傳 Beacon frame,然後再來請求和確認,才能連接完成。

連接過程中,AP 可以透過一些認證機制來決定是否接受 Station 的請求,例如透過 MAC 地址驗證,或者透過 WEP/WPA/WPA2 的密碼,或者透過 RADIUS 這類的背後認證主機來協助驗證使用者帳密。

WLAN 的 frame 格式也比 Ethernet 複雜,因為它至少必須多支援 Reliable Delivery 功能,所以會有 ACK, SYN, Timer 這些機制,我們在此省略 WLAN 的格式介紹。

WLAN 與 Ethernet 格式轉換

值得一提的是,WLAN 的 frame 之內有三個 MAC 地址欄位,不像 Ethernet 只有兩個。這樣的考慮是因為 AP 與外部閘道器之間通常走 Ethernet 有線連接,或者是直接做成童一台機器,所以 AP 會做一個 WLAN 和 Ethernet 之間地址轉換橋接的工作。

舉例來說,想像我們要透過某 AP 送資料出去,第一個 MAC 地址欄位就填 AP 的 MAC,第二個就填我自己的來源 MAC,第三個則是填 AP 之後連接到外部的閘道器 MAC。frame 送到 AP 後,AP 會做一個轉換,將 WLAN frame 換成 Ethernet frame,把第二個 MAC(就是我自己的 MAC)放在來源 MAC,把第三個閘道器的 MAC 放在目的地  MAC。

如果是外部閘道器連回來給我,它會在 Ethernet frame 中,來源 MAC 填閘道器的,目的 MAC 填我的 MAC,傳到 AP 之後,AP 會轉換成 WLAN frame,然後第一個 MAC 填我的 MAC,第二個填 AP 的 MAC,第三個填閘道器的 MAC。

簡單來說,就是第一個和第二個都是我和 AP 兩個人的 MAC 地址換來換去,而第三個都是閘道器的 MAC。

手機通訊

這是長久以來的戰國時代,太多的專有名詞、太多的協定與規格、太多的產品線,造成了一個太令人混淆的通訊世界,而這一切都是在二樓發生的,所以二樓還真是龍蛇混雜的一層。

以下只介紹一些基本觀念,以及一些常見的技術協定,我沒有機會實際接觸手機通訊的產業鏈,因此以下只是就我認知的理論介紹而已,如果有錯還請指教。

2G 系統

有一些常見的名詞,英文的手機常用的是 cellphone 這個字,或者專業一些用 cellular phone,原因是每個基地台涵蓋的範圍,我們稱此地理範圍為 Cell,每個 Cell 都含有一個 Base Transceiver Station (BTS) 負責該範圍的訊號傳輸工作,BTS 可以看作是 Wi-Fi 裡的 AP 的角色,我們也常說它是基地台

BTS 後面會接上一個 Mobile Switching Center (MSC),MSC 有點像是一個提供管理功能的路由器的角色,它負責使用者的帳號與資費管理,也連接更外層的電話網路系統。一台 MSC 可能會連上數台 BTS,通常的架構是,BTS 負責第一線,數台 BTS 連接於後方一台 MSC,而幾台 MSC 又連上一台閘道 MSC (Gateway MSC),Gateway MSC 再連上外部電話網路系統,沒出去前都是「網內互打」,一出去外部就是網外電話了。

以上是 2G (Second Generation) 的 GSM (Global System for Mobile communications) 手機通訊架構,也就是純粹語音的架構。2G 的 GSM 系統使用的是 TDM/FDM 的混合架構,關於 TDM 與 FDM,請參考我們前面的介紹。

2G 還有另外一種系統,像是亞太電信的低功率手機,使用的是 CDMA 技術(CDMA 2000)。

在這之後開始有了手機上網的需求,因此 2.5G 以至於到 3G 開始在既有的架構上,加入了其他 TCP/IP 的數據服務。數據上網是從這裡開始的。

2.5G 系統

2.5G 開始提出了 GPRS (General Packet Radio Service) 的技術與規格,就是讓手機到 BTS 之間可以透過電波傳輸 IP 封包,GPRS 規格也在原有的 MSC 之外,加上了 SGSN (Serving GPRS Support Node) 以及 GGSN (Gateway GPRS Support Node) 這兩個角色,SGSN 就像 MSC,GGSN 就像 Gateway MSC,而原有的 MSC 和 Gateway MSC 保持不動。

當手機要做語音通訊的時候,手機連結 BTS,BTS 連結 MSC,MSC 連結 Gateway MSC,Gateway MSC 再連結到外部電話系統。

當手機要做數據通訊的時候,手機連結 BTS,BTS 連結 SGSN,SGSN 連結 GGSN,GGSN 連結網際網路。

以至於這個階段的手機,即使把 GPRS 的功能關掉,也還是可以使用語音通訊。

起先 GPRS 允許傳輸 125 Kbps 上限的通訊量,後來推出 EDGE (Enhanced Date Rates for Global Evolution) 協定,可以提升到 384 Kbps。

3G 系統

3G 以後提出 UMTS (Universal Mobile Telecommunications Service) 規格,當然同時間還有其他規格,但是大概這個算是最多人用的贏家,架構上把 BTS 換成 RNC (Radio Network Controller),並且不再使用 TDM/FDM 結合的機制,而是改用 TDM/FDM/CDMA 三種結合的機制,稱為 Direct Sequence Wideband CDMA (DS-WCDMA),最高的下載速度支援到 14 Mbps。

架構上除了把 BTS 換成 RNC 以外,其餘後方的 MSC/Gateway MSC 以及 SGSN/GGSN 延續 2.5G 的架構,繼續採用這種語音與數據平行運作的模式。

4G LTE

本文撰寫時 (2014/6),正逢 4G LTE 開始崛起,某些廠商也才剛開台沒多久,LTE (Long-Term Evolution) 打敗 WiMAX 成為主流的 4G 手機規格。

從 3G UMTS 到 4G LTE 有兩項很大的變革,依序是 RNC 後方 MSC/Gateway MSC 和 SGSN/GGSN 的架構部份,另外是使用者手上的手機到 RNC 之間的部份:
  • Evolved Packet Core
  • LTE Radio Access Network

Evolved Packet Core (EPC)

EPC 架構把原先 3G 後面語音與數據平行運作的架構整個取代掉,取而代之的是一個全 IP (Internet Protocol) 的環境,所有傳輸全部都用 IP 封包傳輸,理論上應該是 IPv6。

關鍵在於如何在全 IP 的環境提供高品質的語音通訊,因為 IP 在本質上是沒有提供任何服務,例如 Reliable Delivery、Flow Control 等等,常有人稱 IP 只提供 "best-effort service",也就是說「我盡可能幫你送封包,Do my best!」,也就是說什麼都不保證的意思。 實作上有三種可能的方案:
  • Voice over LTE (VoLTE)
  • Circuit-Switched Fallback (CSFB)
  • Simultaneous Voice & LTE (SVLTE)
VoLTE 就是單純只用 LTE 的全 IP 架構來傳輸語音通訊。CSFB 就是說,當偵測到使用者要進行語音通訊時,我在背後還是走老路子 (MSC/Gateway MSC) 來傳輸。SVLTE 就是要使用者 3G UMTS 和 4G LTE 兩種模式都打開(可能手機會比較耗電?),然後由手機這邊來處理,當要語音通訊時,就走回 3G,當要數據時,就走 4G,這和 CSFB 的差別在於是供應商來做,還是手機來做,CSFB 是供應商處理,SVLTE 則是手機處理。

到底供應商和手機會演化到什麼境地,可能需要繼續觀察下去才知道。

EPC 同時支援新的 LTE Radio Access Network,也支援舊有 2G/3G 的 Radio Access Network,Radio Access Network 就是手機連到 RNC 那一段,也就是手機通訊二樓的那一段。

LTE Radio Access Network

LTE Radio Access Network 是 4G 提出的新的二樓通訊協定,它用的方法是 OFDM (Orthogonal Frequency Division Multiplexing),它不完全是 FDM,而是 TDM/FDM 的混合體,它在頻率上採用 orthogonal 的特點,詳細原理我不懂,只知道有此性質的頻率信號彼此幾乎不會互相干擾。LTE 也採用前面提過 802.11n 使用的 MIMO 天線技術,使用多對天線使得整體傳輸量 (Throughput) 可以提昇。

此外 LTE 提出的方案也讓這一段可以透過一些供應商提出的排程方式來決定頻寬,例如讓某些用戶的頻寬比其他用戶大,這不只是以前在 3G 的限制流量而已,而是可以在手機連基地台這一段就透過頻譜和時間分配去限制你,以至於可以作到 VIP 的區隔服務。

4G LTE 帶來了全 IP 的時代,這牽涉到另一個話題,我們稱之為 Mobile IP。

Mobile IP

Mobile IP 主要是透過 ICMP 和 UDP 封包來實作。關鍵有幾個角色,一個是我,跑來跑去的使用者;另一個是你,坐在電腦前面,固定不動的使用者(至少這一段時間固定不動);還有手機網路供應商所提供的,在不同兩個地點的伺服器,我們分別說甲地是 Home Agent,乙地是 Foreign Agent。

假設我從甲地連上網了,取得了一個 IP,我們稱此 IP 為 Permanent IP,然後你我連線。再來,我在連線的情況下,開車跑到了乙地,乙地的 Foreign Agent 有個 IP,我們稱之為 Care-Of Address (COA),你我之間連線要繼續維持的作法有兩種,一種是直接,另一種是間接。Mobile IP 技術使用間接連線。

間接連線是這樣,你我之間連線,其實本來在甲地的時候就不是真實連線,而是你連到我在甲地的 Home Agent,Home Agent 連到我。當我跑到乙地的時候,你還是連到我原本的 Home Agent,乙地的 Foreign Agent 透過 ICMP 和 UDP 協助,找到我,也通知我的 Home Agent。所以我的 Home Agent 就把連線導到 Foreign Agent,Foreign Agent 再連到我。不過我連回去給你則是直接透過 Foreign Agent 再轉給你。

基本上 Mobile IP 就是透過 Home Agent 和 Foreign Agent 的協助,在中間忙來忙去,讓你我感覺好像我們的連線從沒斷過,而且即便我到處跑,我的 IP 也不會改變,這就是神奇的地方了。

到此,我們終於將二樓介紹完畢,雖然許多屬於概念性介紹,但是還稱得上完整,至少常見的技術我們都提到了。如同我最一開始所說,二樓為了跟上商業的腳步,成員非常繁雜而且變化快,尤其是手機通訊。而也越來越多的交換器,超過二樓的限制,提供到七樓應用層的服務。

沒有留言:

張貼留言