協議森林02 廣播

2021-06-27 15:11:15 字數 4034 閱讀 4034

「小喇叭開始廣播啦」,如果你知道這個,你一定是老一輩的人。「小喇叭」是五十年代到八十年代的兒童廣播節目。在節目一開始,都會有一段這樣的播音:「小朋友,小喇叭開始廣播了!」 聽到這裡,收音機前的小朋友就興奮起來,準備好聽節目了:這一期的內容是乙太網(ethernet)協議與wifi。

我們在郵差與郵局中說到,乙太網和wifi是連線層的兩種協議。在連線層,資訊以幀(frame)為單位傳輸。幀像信封一樣將資料(payload)包裹起來,並註明收信位址和送信位址。連線層實現了「本地社群」的通訊。我們先來看看乙太網的幀。

幀本身是一段有限的0/1序列。它可以分為頭部、資料(payload)和尾部三部分:

preamble

sfddst

srctype

payload (data)

padfcs

extension

幀按照上面的順序從頭到尾依次被傳送/接收。我們下面進一步解釋各個區域。

幀的最初7個byte被稱為序言(preamble)。它的每個byte都是0xaa(這裡是十六進製制,也就是二進位制的10101010)。通常,我們都會預定好以一定的頻率傳送0/1序列(比如每秒10bit)。如果接收裝置以其他頻率接收(比如每秒5bit),那麼就會錯漏掉應該接收的0/1資訊。但是,由於網絡卡的不同,傳送方和接收方即使預訂的頻率相同,兩者也可能由於物理原因發生偏差。這就好像兩個人約好的10點見,結果乙個人表快,乙個人表慢一樣。序言是為了讓接收裝置調整接收頻率,以便與傳送裝置的頻率一致,這個過程就叫做時鐘復原(recover the clock)。

(就像在收聽廣播之前,調整轉鈕,直到聲音清晰。網絡卡會在接收序言的過程中不斷微調自己的接收頻率,直到自己「聽到」是...1010...)

時鐘調整好之後,我們等待幀的起始訊號(sfd, start frame delimiter)。sfd是固定的值0xab。這個0xab就好像「小喇叭開始廣播啦」一樣,提醒我們好節目就要上演了。

preamble和sfd

緊隨sfd之後的是6 byte的目的地(dst, destination)和6 byte的發出地(src, source)。這就是我們在郵差和郵局中的介紹一樣,為信封寫上目的地和發出地。要注意,這裡寫在信封上的是對位址的「本地描述」,也就是mac位址。mac位址是物理裝置自帶的序號,只能在同乙個乙太網中被識別 (正如郵差只熟悉自己的社群一樣)。

頭部的最後乙個區域是type,用以說明資料部分的型別。(比如0x0800為ipv4,0x0806為arp)

資料一般包含有符合更高層協議的資料,比如ip包。連線層協議本身並不在乎資料是什麼,它只負責傳輸。注意,資料尾部可能填充有一串0(pad區域)。原因是資料需要超過一定的最小長度。

跟隨在資料之後的是校驗序列(fcs, frame check sequence)。校驗序列是為了檢驗資料的傳輸是否發生錯誤。在物理層,我們通過一些物理訊號來表示0/1序列(比如高壓/低壓,高頻率/低頻率等),但這些物理訊號可能在傳輸過程中受到影響,以致於發生錯誤。如何來發現我們的資料是正確的呢?

乙個方法是將資料傳送兩遍,然後對比一下是否一樣。但這樣就大大降低了網路的效率。fcs採用了crc(cyclic redundancy check)演算法。這就好像是一家飯店的老闆僱傭了乙個收銀員,但他又擔心收銀員黑錢。可是每天營業額很大,老闆即使坐在旁邊看,也不能用記住收到的總數。所以他採取了乙個聰明的辦法:只記住收到錢的最後一位 (比如收到19元,老闆記住9)。當有新的進賬(比如13,尾數為3),他就將新的尾數和舊的尾數相加,再記住和的尾數(也就是2)。當收銀員交給老闆錢的時候,老闆只用看總額的最後一位是否和自己記的最後一位相同,就可以知道收銀員是否誠實了。如果說我們的資料是收銀的總額的話,我們的fcs就是老闆記錄的尾數。如果兩者不相符,我們就知道資料在傳輸的過程中出現錯誤,不能使用。

有fcs在盯著

上面的比喻實際上是用營業總額不斷的除以10,獲得最終的尾數。crc演算法也相類似。n位crc演算法取乙個n bit的因子,比如下面的1011。資料序列結尾增加n-1個0。因子與資料序列的不斷進行xor運算,直到得到n-1位的餘數,也就是100。該餘數各位取反(011),然後儲存在fcs的位置。

11010011101100000<

--- 資料序列末尾增加3位0

1011<

--- 因子

01100011101100000<

--- xor結果

1011<

--- 因子

00111011101100000

1011

00010111101100000

1011

00000001101100000

1011

00000000110100000

1011

00000000011000000

1011

00000000001110000

1011

00000000000101000

1011

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

00000000000000100<

--- 3位餘數

上面例子用的是4位crc。在ethernet中使用的因子為32位的,以達到更好的檢測效果。

乙太網使用集線器或者交換器將幀從發出地傳送到目的地。一台集線器或交換器上有多個埠,每個埠都可以連線一台計算機(或其他裝置)。

集線器像乙個廣播電台。一台電腦將幀傳送到集線器,集線器會將幀**到所有其他的埠。每台計算機檢查自己的mac位址是不是符合dst。如果不是,則保持沉默。集線器是比較早期的乙太網裝置。它有明顯的缺陷:

1) 任意兩台電腦的通訊在同乙個乙太網上是公開的。所有連線在同乙個集線器上的裝置都能收聽到別人在傳輸什麼,這樣很不安全。可以通過對資訊加密提高安全性。

2) 不允許多路同時通訊

。如果兩台電腦同時向集線器發信,集線器會向所有裝置發出「衝突」資訊,提醒發生衝突。可以在裝置上增加衝突檢測演算法(collision detection):一旦裝置發現有衝突,則隨機等待一段時間再重新傳送。

交換器克服集線器的缺陷。交換器記錄有各個裝置的mac位址。當幀傳送到交換器時,交換器會檢查dst,然後將幀只傳送到對應埠。交換器允許多路同時通訊。由於交換器的優越性,交換器基本上取代了集線器。但比較老的乙太網還有可能在使用集線器。

wifi的工作方式與集線器連線下的乙太網類似。乙個wifi裝置會向所有的wifi裝置傳送幀,其它的wifi裝置檢查自己是否符合dst。由於wifi採取無線電訊號,所以很難像交換器一樣定向傳送,所以wifi的安全性很值得關注。wifi採用加密的方法來實現資訊的安全性。

(早期的wep加密方法非常脆弱,建議使用wpa或者wpa2加密方法。隱藏wifi裝置id的方法不是很有用。)

總結我們深入了連線層協議的一些細節。連線層是物理與邏輯的介面,它的設計兼顧了物理需求(比如時鐘復原,crc)和邏輯需求(比如位址、資料)。由於連線層處於網路邏輯的底層,有許多基於連線層的攻擊手法,這需要我們對連線層的工作方式有一定的了解,以設計出更好的網路安全策略。

網路 協議森林

網際網路是為了通訊,通訊又依賴於協議。我們交談時,要符合語法和用語規範。機器之間的通話也要符合協議。否則,雞同鴨講,無法相互理解。協議森林 是我的一系列關於網路協議的文章,總結了多個網路協議。網路協議屬於技術,但深受政策與歷史的影響。ethernet,ip,udp,tcp,http,dns.這些協議...

協議森林13 9527 DNS協議

在周星馳的電影 唐伯虎點秋香 中,周星馳飾演的主角一進入華府,就被強制增加了乙個代號9527。從此,華府的人開始稱呼主角為9527,而不是他的姓名。網域名稱 domain name 是ip位址的代號。網域名稱通常是由字元構成的。對於人類來說,字元構成的網域名稱,比如www.yahoo.com,要比純...

協議森林07 傀儡 UDP協議

我們已經講解了物理層 連線層和網路層。最開始的連線層協議種類繁多 ethernet wifi arp等等 到了網路層,我們只剩下乙個ip協議 ipv4和ipv6是替代關係 進入到傳輸層 transport layer 協議的種類又開始繁多起來 比如tcp udp sctp等 這就好像下面的大樹,根部...