來源:程序猿
之前寫了那麽多(duō)網絡的文(wén)章,竟然發現對「網絡協議分(fēn)層」做詳細介紹,這次就把這一塊補上。
要摸清網絡,那麽第一步肯定是要清楚網絡協議的分(fēn)層結構,看分(fēn)層結構相當于從上帝視角來看網絡,這樣後續針對每一個層深入學(xué)習就不會摸不着頭腦。
對于同一台設備上的進程間通信,有(yǒu)很(hěn)多(duō)種方式,比如有(yǒu)管道、消息隊列、共享内存、信号等方式,而對于不同設備上的進程間通信,就需要網絡通信,而設備是多(duō)樣性的,所以要兼容多(duō)種多(duō)樣的設備,就協商(shāng)出了一套通用(yòng)的網絡協議。
這個網絡協議是分(fēn)層的,每一層都有(yǒu)各自的作(zuò)用(yòng)和職責,接下來就分(fēn)别對每一層進行介紹。
應用(yòng)層
最上層的,也是我們能(néng)直接接觸到的就是應用(yòng)層(Application Layer),我們電(diàn)腦或手機使用(yòng)的應用(yòng)軟件都是在應用(yòng)層實現。那麽,當兩個不同設備的應用(yòng)需要通信的時候,應用(yòng)就把應用(yòng)數據傳給下一層,也就是傳輸層。
所以,應用(yòng)層隻需要專注于為(wèi)用(yòng)戶提供應用(yòng)功能(néng),不用(yòng)去關心數據是如何傳輸的,就類似于,我們寄快遞的時候,隻需要把包裹交給快遞員,由他(tā)負責運輸快遞,我們不需要關心快速是如何被運輸的。
而且應用(yòng)層是工(gōng)作(zuò)在操作(zuò)系統中(zhōng)的用(yòng)戶态,傳輸層及以下則工(gōng)作(zuò)在内核态。
傳輸層
應用(yòng)層的數據包會傳給傳輸層,傳輸層(Transport Layer)是為(wèi)應用(yòng)層提供網絡支持的。
在傳輸層會有(yǒu)兩個傳輸協議,分(fēn)别是 TCP 和 UDP。
TCP 的全稱叫傳輸層控制協議(Transmission Control Protocol),大部分(fēn)應用(yòng)使用(yòng)的正是 TCP 傳輸層協議,比如 HTTP 應用(yòng)層協議。TCP 相比 UDP 多(duō)了很(hěn)多(duō)特性,比如流量控制、超時重傳、擁塞控制等,這些都是為(wèi)了保證數據包能(néng)可(kě)靠地傳輸給對方。
UDP 就相對很(hěn)簡單,簡單到隻負責發送數據包,不保證數據包是否能(néng)抵達對方,但它實時性相對更好,傳輸效率也高。當然,UDP 也可(kě)以實現可(kě)靠傳輸,把 TCP 的特性在應用(yòng)層上實現就可(kě)以,不過要實現一個商(shāng)用(yòng)的可(kě)靠 UDP 傳輸協議,也不是一件簡單的事情。
應用(yòng)需要傳輸的數據可(kě)能(néng)會非常大,如果直接傳輸就不好控制,因此當傳輸層的數據包大小(xiǎo)超過 MSS(TCP 最大報文(wén)段長(cháng)度) ,就要将數據包分(fēn)塊,這樣即使中(zhōng)途有(yǒu)一個分(fēn)塊丢失或損壞了,隻需要重新(xīn)這一個分(fēn)塊,而不用(yòng)重新(xīn)發送整個數據包。在 TCP 協議中(zhōng),我們把每個分(fēn)塊稱為(wèi)一個 TCP 段(TCP Segment)。
當設備作(zuò)為(wèi)接收方時,傳輸層則要負責把數據包傳給應用(yòng),但是一台設備上可(kě)能(néng)會有(yǒu)很(hěn)多(duō)應用(yòng)在接收或者傳輸數據,因此需要用(yòng)一個編号将應用(yòng)區(qū)分(fēn)開來,這個編号就是端口。
比如 80 端口通常是 Web 服務(wù)器用(yòng)的,22 端口通常是遠(yuǎn)程登錄服務(wù)器用(yòng)的。而對于浏覽器(客戶端)中(zhōng)的每個标簽欄都是一個獨立的進程,操作(zuò)系統會為(wèi)這些進程分(fēn)配臨時的端口号。
由于傳輸層的報文(wén)中(zhōng)會攜帶端口号,因此接收方可(kě)以識别出該報文(wén)是發送給哪個應用(yòng)。
網絡層
傳輸層可(kě)能(néng)大家剛接觸的時候,會認為(wèi)它負責将數據從一個設備傳輸到另一個設備,事實上它并不負責。
實際場景中(zhōng)的網絡環節是錯綜複雜的,中(zhōng)間有(yǒu)各種各樣的線(xiàn)路和分(fēn)叉路口,如果一個設備的數據要傳輸給另一個設備,就需要在各種各樣的路徑和節點進行選擇,而傳輸層的設計理(lǐ)念是簡單、高效、專注,如果傳輸層還負責這一塊功能(néng)就有(yǒu)點違背設計原則了。
也就是說,我們不希望傳輸層協議處理(lǐ)太多(duō)的事情,隻需要服務(wù)好應用(yòng)即可(kě),讓其作(zuò)為(wèi)應用(yòng)間數據傳輸的媒介,幫助實現應用(yòng)到應用(yòng)的通信,而實際的傳輸功能(néng)就交給下一層,也就是網絡層(Internet Layer)。
網絡層負責将數據從一個設備傳輸到另一個設備,世界上那麽多(duō)設備,又(yòu)該如何找到對方呢(ne)?因此,網絡層需要有(yǒu)區(qū)分(fēn)設備的編号。
我們一般用(yòng) IP 地址給設備進行編号,對于 IPv4 協議, IP 地址共 32 位,分(fēn)成了四段,每段是 8 位。隻有(yǒu)一個單純的 IP 地址雖然做到了區(qū)分(fēn)設備,但是尋址起來就特别麻煩,全世界那麽多(duō)台設備,難道一個一個去匹配?這顯然不科(kē)學(xué)。
因此,需要将 IP 地址分(fēn)成兩種意義:
-
一個是網絡号,負責标識該 IP 地址是屬于哪個子網的;
-
一個是主機号,負責标識同一子網下的不同主機;
怎麽分(fēn)的呢(ne)?這需要配合子網掩碼才能(néng)算出 IP 地址 的網絡号和主機号。那麽在尋址的過程中(zhōng),先匹配到相同的網絡号,才會去找對應的主機。
除了尋址能(néng)力, IP 協議還有(yǒu)另一個重要的能(néng)力就是路由。實際場景中(zhōng),兩台設備并不是用(yòng)一條網線(xiàn)連接起來的,而是通過很(hěn)多(duō)網關、路由器、交換機等衆多(duō)網絡設備連接起來的,那麽就會形成很(hěn)多(duō)條網絡的路徑,因此當數據包到達一個網絡節點,就需要通過算法決定下一步走哪條路徑。
所以,IP 協議的尋址作(zuò)用(yòng)是告訴我們去往下一個目的地該朝哪個方向走,路由則是根據「下一個目的地」選擇路徑。尋址更像在導航,路由更像在操作(zuò)方向盤。
數據鏈路層
實際場景中(zhōng),網絡并不是一個整體(tǐ),比如你家和我家就不屬于一個網絡,所以數據不僅可(kě)以在同一個網絡中(zhōng)設備間進行傳輸,也可(kě)以跨網絡進行傳輸。
一旦數據需要跨網絡傳輸,就需要有(yǒu)一個設備同時在兩個網絡當中(zhōng),這個設備一般是路由器,路由器可(kě)以通過路由表計算出下一個要去的 IP 地址。
那問題來了,路由器怎麽知道這個 IP 地址是哪個設備的呢(ne)?
于是,就需要有(yǒu)一個專門的層來标識網絡中(zhōng)的設備,讓數據在一個鏈路中(zhōng)傳輸,這就是數據鏈路層(Data Link Layer),它主要為(wèi)網絡層提供鏈路級别傳輸的服務(wù)。
每一台設備的網卡都會有(yǒu)一個 MAC 地址,它就是用(yòng)來唯一标識設備的。路由器計算出了下一個目的地 IP 地址,再通過 ARP 協議找到該目的地的 MAC 地址,這樣就知道這個 IP 地址是哪個設備的了。
物(wù)理(lǐ)層
當數據準備要從設備發送到網絡時,需要把數據包轉換成電(diàn)信号,讓其可(kě)以在物(wù)理(lǐ)介質(zhì)中(zhōng)傳輸,這一層就是物(wù)理(lǐ)層(Physical Layer),它主要是為(wèi)數據鏈路層提供二進制傳輸的服務(wù)。
總結
綜上所述,網絡協議通常是由上到下,分(fēn)成 5 層,分(fēn)别是應用(yòng)層、傳輸層、網絡層、數據鏈路層和物(wù)理(lǐ)層。