我們知道,網路是基於資料包的形式進行通訊的,如下圖所示,那不同的主機,可能相隔十萬八千里,但是也可以互相訪問,那他們之間又是怎麼進行通訊的呢?接下來讓我來捋一捋大致的過程吧!
網路是分層的,可分為基於TCP/IP的五層協議和基於ISO/OSI的七層協議,如下圖所示,不同層之間有著對應的網路協議
網路為什麼要分層?
因為,是個複雜的程式都要分層。當然網路包的格式很複雜,這個程式也很複雜。複雜的程式都要分層,這是程式設計的要求。比如,複雜的電商還會分資料庫層、快取層、Compose層、Controller層和接入層,每一層專注做本層的事情。每一層都存在相對於的協議,如在應用層有最常用http協議,傳輸層有TCP、UDP協議,網路層有IP協議,資料鏈路層有MAC協議。為什麼會有協議?協議類似於一種公認的約定,如果沒有這種公認的約定,那一臺機器將資料包傳送給另一臺機器後,那臺機器應該是挺懵逼的,這都是啥?
資料包如何到達目的地
首先我們從瀏覽器輸入一個連結訪問頁面開始,當我們輸入https://www.baidu.com
這一行字串在瀏覽器後,會返回以下內容,就是百度的頁面,那為什麼會返回以下的頁面呢?
首先瀏覽器會對域名進行對應的解析,會解析出https
和www.baidu.com
,這裡先不講解https協議,解析完成後,我們的電腦要往哪裡去請求資料呢?這時候需要用到DNS服務,去查詢www.baidu.com
對應的真實IP地址在哪,如果本地快取DNS快取則直接可以獲取
DNS
DNS是Domain Name System,即域名系統,是網際網路的一項服務,它作為將域名和IP地址相互對映的一個分散式資料庫。
當發生DNS服務之前,我們的電腦會檢查本地是否存在快取,若存在則直接獲取對應的IP,若不存在,則會傳送請求到DNS,首先會訪問根DNS,根據請求的域名為.com,會為你指路,返回.com頂級域DNS伺服器的IP地址,讓你去訪問這個地址獲取對應的地址,然後到.com的DNS伺服器上去訪問,此時.com讓你去baidu.com
區域的權威伺服器上,讓你去區域權威伺服器上去獲取對應的地址,最終,我們到達baidu.com
區域的權威伺服器上,終於得到了對應的IP地址,如下圖所示,一級一級的去查詢,最終在區域權威伺服器上得到了你想要的內容。
http協議
超文字傳輸協議(Hyper Text Transfer Protocol,HTTP)是一個簡單的請求-響應協議,它通常執行在TCP之上。它指定了客戶端可能傳送給伺服器什麼樣的訊息以及得到什麼樣的響應。請求和響應訊息的頭以ASCII形式給出;而訊息內容則具有一個類似MIME的格式。
獲取了對應的IP,這時候需要封裝http對應請求行,請求頭和請求主體,在瀏覽器上,我們可以檢視到對應的資訊
TCP協議
http協議是執行在TCP協議之上的。TCP(Transmission Control Protocol)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,對於TCP的特點,可以概況為以下點
- 順序問題 ,穩重不亂;
- 丟包問題,承諾靠譜;
- 連線維護,有始有終;
- 流量控制,把握分寸;
- 擁塞控制,知進知退。
我們可以通過wireshark對資料包進行抓包,以下我們可以檢視到TCP協議對應的內容,協議會包含源埠號、目標埠號、序號、確認序號、連線標誌位、視窗大小和對應的資料等。當然tcp的具體特性,這裡不展開講,具體的細節可以自己檢視相關資料。
IP協議
IP是Internet Protocol(網際互連協議)的縮寫,是TCP/IP體系中的網路層協議。
TCP 模組在執行連線、收發、斷開等各階段操作時,都需要委託 IP 模組將資料封裝成網路包傳送給通訊物件。
在wireshark工具上,我們可以檢視到IP協議的內容,其中包含了源地址IP和目標地址IP,還有一些其他的資訊如首部校驗和、協議資訊、標誌資訊、資料等資訊。
MAC協議
接下來,我們來到資料鏈路層,在 MAC 包頭裡需要傳送方 MAC 地址和接收方目標 MAC 地址,用於兩點之間的傳輸。
以下是wireshark工具上,檢視的MAC協議的內容,包含了傳送方的MAC地址和接收方的MAC地址。
MAC地址相當於網路世界的身份證,每臺主機的MAC地址都是唯一的,到了這裡,我們需要新增傳送方的MAC地址,這個好辦。直接從自己的機器獲取即可,可是對於目標主機的MAC地址,我們該如何獲取呢?這時候就需要ARP協議了。
ARP協議
地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取實體地址的一個TCP/IP協議。
為了獲取目標的MAC地址,ARP協議會在乙太網中以廣播的形式,對乙太網的所有裝置進行呼叫,這個IP是誰的呀?當存在裝置響應後,我們就可以獲取目標的MAC地址。
網路卡
IP 生成的網路包只是存放在記憶體中的一串二進位制數字資訊,沒有辦法直接傳送給對方。因此,我們需要將數字資訊轉換為電訊號,才能在網線上傳輸,也就是說,這才是真正的資料傳送過程。
經過一系列不可描述的操作,最終網路卡會將包轉化為電訊號,通過網線傳送出去。
閘道器
在任何一臺機器上,當要訪問另一個IP地址的時候,都會先判斷,這個目標IP地址,和當前機器的IP地址,是否在同一個網段。在這裡我們返回百度的網址,很明顯不是在同一網段上面,那接下來該怎麼辦呢?
這時候我們需要將請求傳送到預設閘道器上。如何發往預設閘道器呢?閘道器不是和源IP地址是一個網段的麼?這個過程就和發往同一個網段的其他機器是一樣的:將源地址和目標IP地址放入IP頭中,通過ARP獲得閘道器的MAC地址,將源MAC和閘道器的MAC放入MAC頭中,傳送出去。閘道器所在的埠,例如192.168.1.1/24將網路包收進來,然後接下來怎麼做,就完全看閘道器的了。
MAC地址是一個區域網內才有效的地址。因而,MAC地址只要過閘道器,就必定會 改變,因為已經換了區域網。兩者主要的區別在於IP地址是否改變。不改變IP地址的閘道器,我們稱為轉發閘道器;改變IP地址的閘道器,我們稱為NAT閘道器。(細節太多,就不一一介紹了)
小結
綜上所述,資料包通過一層層協議的封裝,在網線中進行傳輸,如下圖所示,類似套娃的形式,上層協議必要依賴於下層協議,下層協議可以沒有上層協議,但上層協議不能沒有下層協議。
參考
本作品採用《CC 協議》,轉載必須註明作者和本文連結