做者:DeppWangphp
互聯網上的數據能從一臺設備發送到另外一臺設備,整個過程由互聯網協議( Internet Protocol Suite)實現的。html
對於互聯網協議,一直只知其一;不知其二。知道會分爲幾層,但爲何分層,分層有什麼好處,都不甚理解。經過阮一峯的這兩篇文章,大概有了一個初步認識,下面是我對互聯網協議的理解。服務器
<!--more-->網絡
<!--一直以來的疑惑:-->框架
<!--爲何說 Dubbo 基於 TCP 協議,Spring Cloud 基於 HTTP 協議?難道 Spring Cloud 就沒有使用應用層嗎?HTTP 協議沒有用到 TCP 協議嗎(沒有通過傳輸層嗎)?怎麼好像二者是並列的關係。爲何基於 TCP 協議的 Dubbo 就更快一些呢?-->curl
<!--一個打開網頁的請求如何從客戶端發送到服務端,並接受到請求的,其請求包是格式是怎樣的。-->工具
<!--對於手機來講,這幾層體如今哪裏?或者說是哪一個軟件實現這幾層的?-->post
1、五層模型
我也認爲將互聯網協議分爲五層,能夠更好的去理解它,從上往下分別是:應用層、傳輸層、網絡層、(數據)鏈路層(連接層)和物理層(實體層)。若是死記硬背,每每過幾天就忘了,因此須要瞭解其原理,當咱們理解了全文,讓咱們去說文章的名字,那還不是垂手可得嗎!學習
大多數文章或書籍都是從上往下來說解互聯網協議,可是我的感受老是沒有深刻其理,阮一峯自下而上的講解每一層的功能,讓人記憶深入。我也依葫蘆畫瓢,先自下而上分析一下每一層的功能,再結合 Wireshark 抓包工具,來稍稍看看互聯網協議的真面目。網站
1.1 層與協議
爲何叫某某層?爲何要分層?層是什麼?
我以爲層這個叫法很形象,一層一層,好像平行,各自獨立。維基百科的解釋是:「整個通訊網絡的任務,能夠劃分紅不一樣的功能區塊,即所謂的層級(layer)」,咱們能夠理解爲,每一層是實現了一個功能,有不一樣的分工。就跟寫代碼同樣,若是把全部功能放一塊兒,改一行代碼就可能影響所有,因此根據不一樣功能拆成不一樣的方法。我以爲叫什麼不重要,能夠叫應用塊、應用組,等等。主要知道,每一層是爲了完成一個功能就行。
咱們知道,每一層都有本身對應的協議(Protocol),好比,網絡層有 IP 協議。那何爲協議?跟這個層又有什麼關聯?維基百科上有這麼一句話:「網絡層功能由 IP 協議規定和實現,故又稱 IP 層」。咱們能夠看出,每一層的功能實際上是協議來規定和實現的。因此,協議能夠理解爲,有你們都遵照的規則(規定),並負責去實現這個規則。
2、物理層(Physcial Layer)
咱們電腦如今不用插網線就能上網(連 WIFI),可是路由器插網線了,在家裏,路由器通常又須要經過一根網線鏈接入戶光纖盒(又稱爲光貓),光纖盒又須要經過一根光纖鏈接到其餘設備。電腦鏈接 WiFi,電腦的數據發送到路由器,是經過無線電波。因此傳輸數據須要物理載體,相似網線、光纖、無線電波。咱們將傳輸數據的物理載體稱爲物理層(Physcial Layer)。爲何咱們訪問美國的網站就慢一些,由於美國網站的服務器在美國,數據經過海底光纜傳輸,耗時會久一些。這也是爲何不少公司要在不一樣城市部署服務器的緣由之一吧。
數據在物理載體中傳輸,傳輸的是什麼呢?是 0 和 1 組成的電信號,爲何是 0 和 1 組成的電信號呢?這個吧,姑且經過類比的方式來解釋,由於計算機只能識別 0 1 二進制,因此要傳輸 0 和 1 組成的電信號吧。
<!--問好臉:網速的快慢由每 1 秒能傳輸電信號的多少決定?-->
3、鏈路層(Link Layer)
物理層只是一個傳輸載體,沒有「自主意識」, 咱們須要藉助物理層上的鏈路層(Link Layer),鏈路層的功能:將數據從一處發送到另外一處,鏈路層在發送方和接收方都有,在發送方:鏈路層將數據轉換爲電信號,並將其發送出去;在接收方:鏈路層收到電信號,並將電信號轉換爲數據。鏈路層和物理層之間的關係能夠這樣表示:
在局域網內,將數據從一處發送到另外一處須要使用以太網(Ethernet)。局域網的通俗理解,鏈接同一個 WiFi (路由器 Router)的設備在同一個局域網內。
3.1 以太網
以太網是一種局域網技術,它能夠實現局域網內的設備通訊,咱們如今電腦通常連 WiFi,WiFi 能夠認爲是「無線以太網」。
咱們能夠理解爲,在局域網內,鏈路層的功能實際上是由以太網實現的(局域網外的鏈路層比較複雜,本文不討論)。 局域網內的鏈路層和以太網的關係能夠這樣表示(物理層做爲以太網的傳輸載體):
以太網須要規定電信號的格式,以便雙方解讀。以太網規定一組電信號爲一個數據包,叫幀(Frame),幀包含兩部分,標頭(Head)和數據(Data),標頭包含發送方地址、接收方地址等信息,數據則是數據包的具體內容。咱們通常將幀稱爲以太網數據包,或者以太幀,以太幀格式相似下面這樣:
每臺網絡設備都有本身的網卡,以太網是將數據從一塊網卡發送到另外一塊網卡,每塊網卡須要有本身的「身份證號」,叫 MAC 地址(iPhone 手機的 MAC 地址叫無線局域網地址),由 12 個十六進制數表示:
<img src="https://deppwang.oss-cn-beijing.aliyuncs.com/blog/2020-03-20-121841.jpg" style="zoom:50%;" />
MAC地址:(Media Access Control Address),直譯爲媒體存取控制位址,也稱爲局域網地址(LAN Address),以太網地址(Ethernet Address)或物理地址(Physical Address),它是一個用來確認網絡設備位置的地址。
因此以太網發送前須要知道接收方網卡的 MAC 地址,即標頭的接收方地址,但正常狀況下,不知道接收方 MAC 地址,須要使用 ARP 協議獲得(這個本文後面解釋)
假設已經知道了 MAC 地址,那麼在局域網內,以太網能夠根據 MAC 地址,將數據發送給對方。但若是對方沒有在一個局域網內,如何發送給對方呢?此時,就須要網絡層(Network Layer)出馬了!
以太網在 Windows 中的體現:
在 macOS 的體現: PPPoE(英語:Point-to-Point Protocol over Ethernet),以太網上的點對點協議。
4、網絡層(Network Layer)
首先,咱們要區分接收方是否在一個局域網,使用 MAC 地址不能區分,須要設備有另一個地址,能表明它所處的具體是哪一個網絡(局域網),咱們稱這個地址爲「網絡地址」。
網絡層的做用,就是根據網絡地址找到目的主機處於哪個局域網。實現這一功能的協議稱爲網絡協議,即 IP 協議 。網絡地址用於 IP 協議,因此網絡地址也能夠叫它 IP 地址。注意:咱們叫 IP 協議,是一種習慣,其實 IP(Internet Protocol) 自己就有協議的意思。
<!--若是設備連 WiFi,WiFi 是局域網,路由器會爲設備分配一個局域網 IP 地址,它只能在局域網內部使用,因此也叫內部(本地) IP。局域網有一個對外訪問互聯網的 IP,稱爲外部 IP,**一個局域網內的全部設備共用一個外部 IP 地址**。在百度輸入IP,顯示的 IP 就是外部 IP,在「設置->網絡」中看到的 IP 是內部 IP。咱們稱局域網爲內網,內是相對的概念,表明沒有外部 IP 就不能訪問。-->
若是設備連 WiFi,路由器會爲設備分配一個 IP 地址。
4.1 IP 協議
IP 協議:英語全稱爲:Internet Protocol,即網絡協議,也稱網際協議。
如今大部分使用的仍是 IP 協議第四版,簡稱 IPv4,IP 地址爲 32 位(4*8,二進制)。
有了 IP 地址,網絡層能夠經過 IP 地址來區分是否處於一個局域網。如何根據 IP 地址判斷設備是否處於同一個局域網?答案是利用子網掩碼。IP 地址分爲兩部分,網絡部分和主機部分,若是子網掩碼爲 255.255.255.0
(二進制表示:11111111.11111111.11111111.00000000
),表示前 24 位表明網絡部分,若是兩個 IP 地址前 24 位相同,則表明是在同一個局域網中。
4.2 IP 數據包
數據通過網絡層,IP 協議爲數據加上包含發送方 IP 地址和接收方 IP 地址的標頭,包裝爲 IP 數據包:
IP 數據包到達鏈路層時,直接做爲做爲以太幀的數據部分,嵌入以太幀。此時的以太幀的格式以下:
若是經過子網掩碼判斷接收方在一個局域網,就經過以太網發送,此時須要獲得其 MAC 地址,前面說,須要 ARP 協議獲得其 MAC 地址,何爲 ARP 協議?
4.3 ARP 協議
ARP 協議,英語全稱爲:Address Resolution Protocol,即地址解析協議,是一種經過 IP 地址獲得 MAC 地址的協議。默認狀況,發送方知道接收方的 IP 地址(經過 DNS 獲得,這個又後面解釋),因此發送方使用「廣播」(broadcasting)的方式給當前局域網全部主機發送一個以太幀,包含對方的 IP 地址,對方 MAC 地址設爲 ff:ff:ff:ff:ff:ff
,接收方根據接收者 IP 地址判斷本身是否爲接收者,是,就發送一個數據包告訴對方本身的 MAC 地址,不是,就丟棄這個包。
經過這種方式,發送方就能夠經過接收方的 IP 地址獲得 MAC 地址。
若是經過子網掩碼判斷接收方不在一個局域網,經過 APR 協議就得不到對方的 MAC 地址,那就要使用路由(Route)的方式發送了。
4.4 路由
路由,簡單來講,就是獲得路由器的 MAC 地址,數據先發送到路由器(Router),由路由器來發送下一個路由器,經過一系列路由中轉,最後發給目標主機。
<!--路由器往外發送時,使用的是外部 IP(互聯網 IP)。使用外部 IP 才能和互聯網通訊,外部 IP 是名片-->
其實就像發送快遞同樣,在快遞上寫上收件人的地址,由快遞點發送給下一個中轉站,再中轉,最後收件人收到快遞。
一個簡單的路由器,須要實現 IP 協議和鏈路層協議。
若是把上面的過程說的仔細一點,以太網是將以太幀發送給路由器鏈路層,路由器鏈路層將數據包發送給路由器網絡層,路由器有一個路由表,網絡層在路由表找到跟當前路由器相連的、離目的主機最近的路由器,路由器經過 ARP 協議,獲得下一個路由器的 MAC 地址,讓路由器鏈路層根據 MAC 地址,發送給下一個路由器。經過一系列中轉,來到目的主機所在的路由器。使用一樣的方式,經過以太網將以太幀發送給目的主機。整個過程大概是這樣:
咱們常說,網絡層負責尋址和路由,尋址就是尋找最近的 IP 地址,路由就是找到最近的路由 MAC 地址(我這麼理解,不必定正確)。咱們能夠理解爲:整個通訊過程當中的網絡層負責尋址和路由,發送方的網絡層其實負責它本身的尋址和路由。
<!--前面說,局域網內的鏈路層是由以太網實現的。那麼局域網外的後鏈路層呢?是經過骨幹網等實現。-->
5、傳輸層(Transport Layer)
網絡層和鏈路層實現了互聯網任意兩臺主機之間的網絡通訊,此時還有兩個問題,一、設備不止一個程序,具體發送給哪個程序?二、沒有保證數據包能發送成功。
這時候就須要傳輸層(Transport Layer),傳輸層的功能是保證數據能可靠傳輸到對方主機的應用程序上。
應用是進程,每一個進程使用網卡時,須要有一個編號,這個編號就是端口。系統默認佔用 0 到 1023 的端口,系統會爲軟件隨機分配 1024 到 65535 之間的端口。 常見術語套接字(Socket)就是 IP 地址 + 端口的組合稱謂。
傳輸層要爲發送的數據包中增長髮送方和接收方的端口號。
傳輸層功能實現通常有兩種協議,1 是 TCP 協議,2 是 UDP 協議。
5.1 TCP 協議
TCP 協議,英語全稱爲:Transmission Control Protocol,即,傳輸控制協議
TCP 協議使用用三次握手來保證線路的可靠,失敗後,有失敗重傳機制,它是一個很複雜的協議,傳輸層的稱謂,也是來源於 TCP 這個 傳輸控制協議。
TCP 協議發送的數據包叫 TCP 數據包,它的標頭包含發送方端口和接收方端口,
它發送數據包給網絡層,網絡層將 TCP 數據包做爲 IP 數據包的數據部分,再發給鏈路層。此時以太幀格式以下:
由於以太幀有長度限制,TCP 協議沒有規定數據的長度,因此當 TCP 數據包過長時,以太幀裝不下,此時 TCP 數據包須要切分爲多個 TCP 數據包。咱們經常看到有的書籍說:傳輸層負責「請求報文」的分割。這就是傳輸層爲何要分割「請求報文」的緣故。
傳輸層保證數據的「可靠傳輸」,這句話經常被咱們誤解爲,是由傳輸層傳輸數據,如今咱們知道,傳輸數據的實際上是鏈路層,傳輸層其實只是失敗重傳(固然不止這一個功能,這裏這麼說是爲了方便理解)。因此這句話的重點在於可靠,不在傳輸。
5.2 UDP 協議
UDP 協議,英語全稱爲: User Datagram Protocol,即用戶數據包協議
傳輸層有一種簡單的協議,叫 UDP 協議,UDP 協議只是爲數據簡單的加上包含發送方端口和接收方端口的標頭,就將 UDP 數據包扔給網絡層,它不保證是否能成功的發送給接收方,它是一種不可靠的傳輸協議。由於簡單,減小了時間開銷,經常使用於對時間有較高要求的應用程序。
6、應用層(Application Layer)
鏈路層、網絡層、傳輸層實現了數據包能從主機應用發送到目的主機應用。正常狀況下,網絡上主要傳輸的數據是應用產生的。傳輸的數據各類各樣,有網絡請求,有電子郵件等等。數據須要由應用層(Application Layer)封裝,即規定數據的格式。
規定「網絡請求數據」格式的是 HTTP 協議。能夠說,HTTP 協議是應用層的一種實現。
6.1 HTTP 協議
HTTP 協議:英文全稱爲:HyperT**ext Transfer Protocol,即超文本轉移(傳輸)協議
當咱們打開百度首頁時,輸入的就是一個網址 www.baidu.com
,這是一個 GET 請求,HTTP 協議將請求封裝爲應用層數據包。這樣,百度的服務器應用層就能夠根據 HTTP 協議來解析數據包。
HTTP 請求的數據包通常稱爲請求報文,分爲報文首部和報文主題,報文首部即爲請求頭,請求頭格式以下:
包含的應用層數據包的以太幀格式以下:
6.2 DNS
DNS:英語全稱爲: Domain Name System,即域名系統
相似 www.baidu.com
這樣的網址域名,是爲了用戶方便記憶,網絡通訊時,須要將域名轉換爲 IP 地址,這是由 DNS 負責的,它也屬於應用層。
7、WireShark 抓包分析
當 Mac 連 WIFI 後,能夠在「設置->網絡」中看見下面這些內容:
此時電腦,有本身的 IP 地址、MAC 地址、還知道路由器的 IP 地址、DNS 服務器地址(由路由器負責域名解析,因此 DNS 地址其實就是 IP 地址)和當前的子網掩碼。還能夠看出,路由器動態分配 IP 地址是由 DHCP 實現的。
經過打開百度首頁,結合抓包工具 Wireshark 來看看網絡通訊過程當中的數據包的內容。
關於如何使用 Wireshark,請看 使用 wireshark 學習網絡協議。經過 ping www.baidu.com
獲得百度的 IP 地址爲 61.135.169.121
,在 Wireshark 中配置過濾條件後,經過使用命令 curl www.baidu.com
來模擬打開百度首頁:
此時在 Wireshark 中能夠看出,TCP 協議發送了以太幀,以太幀的格式是:Ethernet II 標頭 + IP 4 標頭 + TCP 標頭 + TCP 數據,TCP 標頭顯示源端口爲 53732,目的地端口爲 80;IP 標頭顯示源 IP 地址爲 192.168.31.206
,目的地 IP 地址爲 61.135.169.121
;以太網標頭顯示源 MAC 地址爲 f0:18:98:46:bf:65
,目的地 MAC 地址爲 28:6c:07:9d:e2:8e
(小米路由器地址)。幀的長度爲 78 字節,TCP 數據包的長度爲 44 個字節。
這與咱們前面說的相符合,目的主機不在同一個局域網,經過以太網發送以太幀給路由器,再由路由器負責路由發送。
前三個數據包爲 TCP 的 3 次握手,接着發送了 HTTP 數據包,HTTP 數據包包含了請求的內容:
整個過程:先使用 TCP 協議完成了 3 次握手,而後使用 HTTP 協議發送了 GET 請求,接收到了百度的 HTTP 響應,最後使用 TCP 協議完成了 4 次揮手。
8、總結
互聯網協議整個網絡通訊過程能夠用下面這張圖描述:
對於發送方的數據處理,這個過程像是一個俄羅斯套娃的過程:
若是用發快遞來類比一下:
應用層:將物體打包爲快遞 | 傳輸層:爲快遞填上收件人門牌號;若是快遞丟失從新發送 | 網絡層:爲快遞填上收件人小區地址;並根據收件人小區地址,找到下一個快遞中轉站的地址,最終找到整個線路 | 鏈路層:爲快遞填上下一個中轉地地址;並負責將快遞發往到下一個中轉站 | 物理層:運快遞的車
在互聯網協議中,由於 TCP/IP 協議最重要,因此互聯網協議也能夠叫作 「TCP/IP 協議族」。
此文只是我的對互聯網協議的淺顯理解,畢竟沒有深刻研究,可能有諸多不當處,歡迎留言指出。
最後我想說一句,阮一峯牛逼。有的知識點是知道怎麼回事,就是不能正確的表達出來,遣詞排句真的很須要功力,真的須要常年累月的積累。
<!--解疑如今來講說,爲何說 SpringCloud 基於 HTTP 協議,Dubbo 基於 TCP 協議。我是這麼理解的,由於 SpringClout 框架直接接受 HTTP 請求,而 Dubbo 讓數據沒有使用 HTTP 協議包裝數據包。直接將數據包裝爲 TCP 數據包。-->
9、延伸閱讀
原文出處:https://www.cnblogs.com/deppwang/p/12535144.html