背景
這一系列的文章主要是為一般的、非專業開發崗位(如移動端)的工程師準備,一方面可以對網路的基本知識有基本的瞭解,另一方面不至於面試中被問到相關問題時束手無策。知識以 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 協議。
資料鏈路層的意義在於,如果沒有資料鏈路層,資料只能以流的形式存在與通訊介質中,不知道該傳送往哪裡,過長的資料流可能無法在通訊介質中傳輸。