本文**:
在閱讀「tcp-ip協議詳解」系列文章之前,建議閱讀以下兩篇文章,以便對網際網路協議有個快速的全域性了解和把握!「小喇叭開始廣播啦」,如果你知道這個,你一定是老一輩的人。「小喇叭」是五十年代到八十年代的兒童廣播節目。在節目一開始,都會有一段這樣的播音:「小朋友,小喇叭開始廣播了!」 聽到這裡,收音機前的小朋友就興奮起來,準備好聽節目了:這一期的內容是乙太網(ethernet)協議與wifi。網際網路協議入門(一)
網際網路協議入門(二)
我們在網路協議概觀中說到,乙太網和wifi是連線層的兩種協議。在連線層,資訊以幀(frame)為單位傳輸。幀像信封一樣將資料(payload)包裹起來,並註明收信位址和送信位址。連線層實現了「本地社群」的通訊。我們先來看看乙太網的幀。
幀本身是一段有限的0/1序列。它可以分為頭部、資料(payload)和尾部三部分:
幀按照上面的順序從頭到尾依次被傳送/接收。我們下面進一步解釋各個區域。
幀的最初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,用以說明資料部分的型別。(比如0×0800為ipv4,0×0806為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的位置。
11010011101100 00000000000000000 1001011
01100011101100 000
1011
00111011101100 000
1011
00010111101100 000
1011
00000001101100 000
1011
00000000110100 000
1011
00000000011000 000
1011
00000000001110 000
1011
00000000000101 000
上面例子用的是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)和邏輯需求(比如位址、資料)。由於連線層處於網路邏輯的底層,有許多基於連線層的攻擊手法,這需要我們對連線層的工作方式有一定的了解,以設計出更好的網路安全策略。
文/ vamei todo…
TCP IP(一) 乙太網幀協議
乙太網幀說明 乙太網幀大小必須在64 1518位元組 不包含前導碼和定界符 即包括目的位址 6b 源位址 6b 型別 2b 資料 fcs 4b 在內,其中資料段大小在46 1500位元組之間。乙太網幀結構 乙太網由前導碼 7b 定界符 1b 目的位址 6b 源位址 6b 型別 2b 資料 fcs 4...
TCP IP協議棧 乙太網 VLAN
1.tcp ip分層和tcp ip協議棧 osi七層模型注重的是模型本身,這個模型對討論和研究計算機網路是非常有益的。但是,大家更喜歡用tcp ip協議來分層,它注重的是協議。tcp ip分層後,將各種協議對應到這些分層,那麼就稱tcp ip協議棧。osi七層協議 tcp ip分層和tcp ip協議...
乙太網協議
乙太網協議 用於10mbps的乙太網,作者以下所說的乙太網均指10m乙太網,而不是100m,1000m的乙太網 乙太網協議有兩種,一種是ieee802.2 ieee802.3,還有一種是乙太網的封裝格式。現代的作業系統均能同時支援這兩種型別的協議格式。因此對我們來說只需要了解其中的一種就夠了,特別是...