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