這一系列的文章主要是爲通常的、非專業開發崗位(如移動端)的工程師準備,一方面能夠對網絡的基本知識有基本的瞭解,另外一方面不至於面試中被問到相關問題時一籌莫展。知識以 TCP/IP 協議簇爲主,也會有應用層和數據鏈路層的簡單介紹。面試
文章內容不會很難,也不會過多討論各類算法,目標是以最快的速度達到最深的理解。內容確定比直接百度搜索「TCP/IP協議」,而後隨便看一篇文章要豐富得多,但也不足以讓讀者憑此就能勝任網絡開發的工做。算法
誠然,面試以 TCP/UDP/HTTP 等協議爲主,IP 協議都涉及甚少,更遑論數據鏈路層等。但我但願能夠從原理上理解那些問題,而不是臨時抱佛腳,背了一些答案而後在面試後忘乾淨。不要爲面試而準備面試,爲了完善本身的知識體系而準備。若是你以爲這正是你須要的,Let's Begin!網絡
在這一節中,咱們不談這些層和協議的具體做用,目前只要知道 OSI 模型中,網絡被分爲七層,由底層向高層依次是:物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層和應用層。學習
協議是一個 Big 很高,出現很頻繁的詞。其實它很好理解,它其實是一種通訊雙方共同遵照的規範。好比我須要把性別和年齡傳遞給另一臺主機,那麼我能夠定義一個"A 協議",協議規定數據的前 4 個字節表示性別,後四個字節表示年齡。這樣對方主機接收時就知道前 4 個字節是性別,而不會錯把它當成年齡來處理。cdn
整個互聯網世界可以運行,徹底得益於各個軟件、硬件廠商嚴格遵照現有的協議。以 IP 協議爲例,你能夠隨便修改它,而後本身弄出一個 IP2 協議,只不過沒有人承認、遵照這個協議,因此它毫無用武之地。blog
物理層處於 OSI 七層模型的最底端,它的主要任務是將比特流與電子信號進行轉換。接口
在計算機的世界中,一切都由 0 和 1 組成。你看到的這篇文章,在經過網絡傳輸到你電腦的過程當中,天然也是以 0 和 1 的形式存在。可是網絡傳輸的介質(好比光纖,雙絞線,電波等)中顯然是不存在 0 和 1 的。好比在光線中,數據經過光的形式傳遞。0 和 1 以光的亮滅表示,其中的轉換由物理層完成。開發
若是沒有物理層,由 0 和 1 構成的比特流就沒法在物理介質中傳播。虛擬機
數據鏈路層處於 OSI 七層模型的第二層,它定義了經過通訊介質相互鏈接的設備之間,數據傳輸的規範。it
在數據鏈路層中,數據再也不以 0、1 序列的形式存在,它們被分割爲一個一個的「幀」,而後再進行傳輸。
數據鏈路層中有兩個重要的概念: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 協議。
數據鏈路層的意義在於,若是沒有數據鏈路層,數據只能以流的形式存在與通訊介質中,不知道該發送往哪裏,過長的數據流可能沒法在通訊介質中傳輸。