背景
這一系列的文章主要是為一般的、非專業開發崗位(如移動端)的工程師準備,一方面可以對網絡的基本知識有基本的了解,另一方面不至于面試中被問到相關問題時束手無策。知識以 TCP/IP 協議簇為主,也會有應用層和數據鏈路層的簡單介紹。
文章內容不會很難,也不會過多討論各種算法,目標是以最快的速度達到最深的理解。內容肯定比直接百度搜索“TCP/IP協議”,然后隨便看一篇文章要豐富得多,但也不足以讓讀者憑此就能勝任網絡開發的工作。
誠然,面試以 TCP/UDP/HTTP 等協議為主,IP 協議都涉及甚少,更遑論數據鏈路層等。但我希望可以從原理上理解那些問題,而不是臨時抱佛腳,背了一些答案然后在面試后忘干凈。不要為面試而準備面試,為了完善自己的知識體系而準備。如果你覺得這正是你需要的,Let's Begin!
OSI七層模型和協議
在這一節中,我們不談這些層和協議的具體作用,目前只要知道 OSI 模型中,網絡被分為七層,由底層向高層依次是:物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層和應用層。
協議是一個 Big 很高,出現很頻繁的詞。其實它很好理解,它實際上是一種通信雙方共同遵守的規范。比如我需要把性別和年齡傳遞給另外一臺主機,那么我可以定義一個"A 協議",協議規定數據的前 4 個字節表示性別,后四個字節表示年齡。這樣對方主機接收時就知道前 4 個字節是性別,而不會錯把它當成年齡來處理。
整個互聯網世界能夠運行,完全得益于各個軟件、硬件廠商嚴格遵守現有的協議。以 IP 協議為例,你可以隨便修改它,然后自己弄出一個 IP2 協議,只不過沒有人認可、遵守這個協議,所以它毫無用武之地。
物理層
物理層處于 OSI 七層模型的最底端,它的主要任務是將比特流與電子信號進行轉換。
在計算機的世界中,一切都由 0 和 1 組成。你看到的這篇文章,在通過網絡傳輸到你電腦的過程中,自然也是以 0 和 1 的形式存在。但是網絡傳輸的介質(比如光纖,雙絞線,電波等)中顯然是不存在 0 和 1 的。比如在光線中,數據通過光的形式傳遞。0 和 1 以光的亮滅表示,其中的轉換由物理層完成。
如果沒有物理層,由 0 和 1 構成的比特流就無法在物理介質中傳播。
數據鏈路層
數據鏈路層處于 OSI 七層模型的第二層,它定義了通過通信介質相互連接的設備之間,數據傳輸的規范。
在數據鏈路層中,數據不再以 0、1 序列的形式存在,它們被分割為一個一個的“幀”,然后再進行傳輸。
數據鏈路層中有兩個重要的概念:MAC 地址和分組交換。
MAC地址
MAC 地址是被燒錄到網卡 ROM 中的一串數字,長度為 48 比特,它在世界范圍內唯一(不考慮虛擬機自定義 MAC 地址)。由于 MAC 地址的唯一性,它可以被用來區分不同的節點,一旦指定了 MAC 地址,就不可能出現不知道往哪個設備傳輸數據的情況。
分組交換
分組交換是指將較大的數據分割為若干個較小的數據,然后依次發送。使用分組交換的原因是不同的數據鏈路有各自的最大傳輸單元(MTU: Maximum Transmission Unit)。不同的數據鏈路就好比不同的運輸渠道,一輛卡車(對應通信介質)的載重量為 5 噸。那么通過卡車運送 20 噸的貨物就需要把這些貨物分成四部分,每份重 5 噸。如果運輸機的載重量是 30 噸,那么這些貨物不需要分割,直接一架運輸機就可以拉走。
以以太網(一種數據鏈路)為例,它的MTU是 1500 字節,也就是通過以太網傳輸的數據,必須分割為若干幀,每個幀的數據長度不超過 1500 字節。如果上層傳來的數據超過這個長度,數據鏈路層需要分割后再發送。
以太網幀
我們用以太網舉例,介紹一下以太網幀的格式。
以太網幀的開頭是“前導碼(Preamble)”,長度為 8 字節,這一段沒什么用,重點在于以太網幀的本體。
本體由首部,數據和 FCS 三部分組成:

類型部分存儲了上層協議的編號,比如上層是 IP 協議,則編號為 0800。
FCS 表示幀校驗序列(Frame Check Sequence),用于判斷幀是否在傳輸過程中有損壞(比如電子噪聲干擾)。FCS 保存著發送幀除以某個多項式的余數,接收到的幀也做相同計算,如果得到的值與 FCS 相同則表示沒有出錯。
交換機
交換機是一種在數據鏈路層工作的網絡設備,它有多個端口,可以連接不同的設備。交換機根據每個幀中的目標 MAC 地址決定向哪個端口發送數據,此時它需要參考“轉發表”
轉發表并非手動設置,而是交換機自動學習得到的。當某個設備向交換機發送幀時,交換機將幀的源 MAC 地址和接口對應起來,作為一條記錄添加到轉發表中。
下圖描述了交換機自學過程的原理

關于數據鏈路層,最重要的一點還是它的定義:“通過通信介質相互連接的設備之間,數據傳輸的規范”。這說明數據鏈路層的協議適用于處于同一種數據鏈路兩端的節點。如果不能理解這一點,就無法理解網絡層和 IP 協議。
數據鏈路層的意義在于,如果沒有數據鏈路層,數據只能以流的形式存在與通信介質中,不知道該發送往哪里,過長的數據流可能無法在通信介質中傳輸。
原文鏈接:http://www.jianshu.com/p/f16d7f3c8d5f
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。