網絡連接總超時?從四層模型上解析網絡是怎麼連接的

身在信息時代,幾乎人人都需使用設備訪問網絡上的資源。在這個過程中,建立網絡連接所實現的連通性,是計算機網絡最基本功能。今天,我們就來分享一個關於計算機網絡的知識點 —— 網絡到底是怎麼連接的?

瀏覽器生成消息且發送

發送一個消息的總體流程如下

生成HTTP請求消息

舉個栗子,當我們在瀏覽器輸入https://www.jdl.cn/img/service.843585b7.png網絡地址的時候,瀏覽器首先會對URL進行解析:

  • https:表示訪問數據源的機制,也就是協議

  • www.jdl.cn: web服務器名稱

  • img :表示目錄名

  • service.843585b7.png:表示文件名 然後就要生成HTTP消息了,它大概長這樣

這些字段具體內容是什麼可以參考這篇文章:五千來字小作文,是的,我們是有個HTTP。

DNS域名解析爲IP地址

瀏覽器生成了這個HTTP消息後,它要往哪裏發送呢?當然是服務器啦,所以就要解析這個域名對應的是哪臺服務器,IP地址是什麼,因爲IP地址不好記,所以纔有了對應的域名,便於我們人類記憶。

  1. 瀏覽器會檢查緩存有沒有這個域名對應的ip地址

  2. 操作系統會檢查緩存(就是我們平常說的hosts文件)

  3. 操作系統會發送給本地區的DNS服務器,讓它幫忙解析下 DNS服務器接受來自客戶端的查詢,包括以下三個內容:

  • 域名: 服務器,郵件服務器的名稱

  • Class: 在最早設計DNS時,DNS在互聯網以外的其他網絡中的應用也被考慮到了,而Class就是用來識別網絡信息的,不過如今除了互聯網就沒有其他網絡了,因此Class的值永遠代表互聯網的IN

  • 記錄類型: 表示域名對應何種記錄類型

  • A記錄時,域名直接對應IP地址

  • CNAME時,此域名對應其他域名

  • MX時,表示域名對應的是郵件服務器 對於不同的記錄類型,響應數據也不一樣

域名的層次結構

  • 越靠右層次越高,從右向左一級一級的劃分 : 例如 www.jdl.cn 就是cn->jdl->www;

  • 具有這種層次結構的域名信息都會註冊到DNS服務器中,而每個域都是作爲一個整體來處理的 客戶端和DNS服務器交互流程大概如下;

  • 上級DNS服務器中要註冊其下級域的DNS服務器IP地址,然後上級DNS服務器IP地址要註冊到更上一級的DNS服務器中,此次類推;

  • 根域的DNS服務器信息保存到互聯網中所有的DNS服務器中,這樣的話,所有的DNS服務器都會找到根域,然後一級一級的往下找,直到找到自己想要的那個域名;

  • 分配給根域的IP地址僅有13個,就是頂級域名(com,cn等)對應的ip地址。

  • 具體交互就是下面這樣

但是一臺服務器存不下這麼多,所以一般都是DNS服務器大接力來尋找這個IP地址,圖如下:

客戶端找到最近的DNS服務器,查找www.jdl.cn的信息,可是最近的DNS服務器沒有這個信息,就轉發到了根域服務器下,經過判斷髮現是cn的頂級域名的,於是根域DNS服務器會返回它所管理的cn域中的DNS服務器的IP地址,接下來,最近的這個DNS服務器又回去訪問com域名的服務器,以此類推,最終會找到 www.jdl.cn這個服務器的IP地址。

委託協議棧發送消息

知道了IP地址後,就可以委託操作系統內部的協議棧向這個目標IP地址發送消息了。

  • 協議棧的內部結構;

  • 瀏覽器、郵件等一般應用程序收發數據時用TCP;

  • DNS查詢等收發較短的控制數據用UDP。

網絡分層

  • OSI七層模型

開放式系統互聯通信參考模型(英語:Open System Interconnection Reference Model,縮寫爲 OSI),簡稱爲OSI模型(OSI model),一種概念模型,由國際標準化組織提出,一個試圖使各種計算機在世界範圍內互連爲網絡的標準框架。定義於ISO/IEC 7498-1。

  • TCP/IP四次模型

  • 應用層: HTTP、DNS、FTP;

  • 傳輸層: TCP、UDP;

  • 網絡層: IP;

  • 網絡接口層。

TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/網際協議)TCP/IP協議不僅僅指的是TCP 和IP兩個協議,而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議簇, 只是因爲在TCP/IP協議中TCP協議和IP協議最具代表性,所以被稱爲TCP/IP協議。

客戶端服務器傳遞數據流程

  • 一個數據包從客戶端到服務端中間經過每一層都需要加工處理;

  • 客戶端這邊需要不斷的給數據包添加頭部;

  • 服務端這邊需要不斷的拆分這個數據包。

三次握手

當兩臺計算機要傳遞數據的時候,一定要先連接,得經過TCP三次握手吧(僅僅指指走TCP協議需要連接的),我們平常都說TCP連接要經過三次握手,我們就來看一下到底什麼是TCP三次握手,如圖所示

  • 客戶端要發送的時候,主動從closed狀態打開,服務器啓動後就一直處於監聽LISTEN狀態

  • 客戶端發送 SYN = 1,seq = x 給服務端,客戶端處於SYN_SEND狀態。

  • 服務端收到後給客戶端發送 SYN = 1,ACK =1, seq = y,ack = x+1。此時服務端處於SYN_RCVD狀態

  • 客戶端收到後發送ACK =1, seq = x+1,ack = y+1給服務器,此時客戶端狀態是ESTAB-LISHED

  • 服務端收到後狀態變爲ESTAB-LISHED

  • 三次握手通過後,就代表客戶端和服務端可以傳遞數據包進行交互啦

  • 我們說到SYN,ACK,seq,ack這些又是什麼呢?這些其實是TCP數據包裏的屬性,我們接着往下看(在傳輸層中有解釋)

應用層

HTTP數據包拆分

  • 一般HTTP請求消息不會太長,一個網絡包就能裝的下

  • 發送緩衝區中的數據如果超過MSS的長度,就會被以MSS長度進行拆分放進單獨的網絡包中

  • MTU(Maximum Transmission Unit): 一個網絡包的最大長度,以太網中一般是1500字節

  • MSS(Maximum Segment Size): 除去頭部之後,一個網絡包所容納的TCP數據的最大長度

傳輸層

上面應用層的這個網絡包再加上TCP頭部。

TCP報文格式

  • 源端口號(16位): 發送網絡包的端口號

  • 目的端口號(16位): 網絡包的接受方的端口號

  • 序號(發送數據的順序編號)(32位): 發送方告知接收方已經收到了所有數據的第幾個字節

  • 確認序號(接收數據的順序編號)(32位): 接收方告知發送方接收方已經收到了所有數據的第幾個字節

  • 頭部長度(4位): 表示數據的起始部分,數據偏移量

  • 保留(6位): 該字段爲保留,現在未使用

  • 控制位(6位): 該字段中的每個比特位分別表示以下通信控制的含義

  • URG: 表示緊急指針字段有效

  • ACK: 表示接收數據序號字段有效,一般表示數據已被接收方收到

  • PSH: 表示通過flush操作發送的數據

  • RST: 強制斷開連接,用於異常中斷的情況

  • SYN: 發送方和接收方相互確認序號,表示連接操作

  • FIN: 表示斷開操作

  • 窗口大小(16位): 接收方告知發送方窗口大小(即無需等待確認可一起發送的數據)

  • 校驗和(16位): 用來檢查是否出現錯誤

  • 緊急指針(16位): 表示應急處理的數據位置

  • 可選字段(可變長度): 除了上面的固定頭部字段外,還可以添加可選字段,但除了連接操作外,很少使用可選字段

還記得三次握手提到過的各種序號嗎,就是這個報文裏的屬性

網絡層

然後上面這個網絡包再加上IP頭部

IP報文格式

  • 版本號(4比特): IP協議版本號,目前是版本4

  • 頭部長度(4比特): IP頭部的長度,可選字段可導致頭部長度的變化,因此這裏需要指定頭部的長度

  • 服務類型(TOS)(8比特): 表示包傳輸優先級。最初的協議規格里對這個參數的定義很模糊,最近DIFFServ規則重新定義了這個字段的用法

  • 總長度(16比特): 表示IP消息的總長度

  • ID號(16比特): 用於識別包的編號,一般爲的序列號。如果一個包被IP分片,則所有分片都擁有相同的ID

  • 標誌(Flag)(3比特): 該字段有3個比特,其中2個比特有效,分別代表是否允許分片,以及當前分片是否爲分片包

  • 分片偏移量(13比特): 表示當前包的內容爲整個IP消息的第幾個字節開始的內容

  • 生存時間(TTL)(8比特): 表示包的生存時間,這是爲了避免網絡出現迴環時一個包永遠在網絡中打轉。每經過一個路由器,這個值就會減一,減到0的是hi這個包就會被丟棄

  • 協議號(8比特): 協議號表示協議的類型(以下均爲16進制)

  • TCP: 06

  • UDP: 17

  • ICMP: 01

  • 頭部校驗和(16比特): 用於檢查錯誤,現在已經不在使用

  • 發送方IP地址(32比特): 網絡包發送方的IP地址

  • 接收方IP地址(32比特): 網絡包接收方的IP地址

  • 可選字段(可變長度): 除了上面的固定頭部字段外,還可以添加可選字段,但除了連接操作外,很少使用可選字段

然後這個網絡包再加上MAC頭部

MAC數據包

  • 接收方MAC地址(48比特): 網絡包接收方的MAC地址,在局域網中使用這一地址來傳輸網絡包

  • 發送方MAC地址(48比特): 網絡包發送方的MAC地址,接收方通過它來判斷是誰發送了這個網絡包

  • 以太類型(16比特): 使用的協議類型。下面是一些常見的類型,一般在TCP/IP通信中只是用0800和0806這兩種。

  • 0000-05DC: IEEE 802.3

  • 0800 : IP協議

  • 0806 : ARP協議

  • 86DD : IPV6

MAC地址 VS  IP地址

  • IP頭部前面還會加上MAC頭部

  • 爲什麼需要MAC數據包呢?因爲在以太網的世界中,TCP/IP這個思路是行不通的。

  • 以太網在判斷網絡包目的地時和TCP/IP的方式不同,因此必須採用想匹配的方式才能在以太網中將包發往目的地,而MAC地址就是幹這個的

  • 發送方MAC地址:MAC地址是寫在網卡生產時寫入ROM裏的,只需要將這個值讀取出來寫入MA頭部就好了

發送方的MAC地址還比較容易獲取到,但是接收方的MAC地址就不太容易獲取到了

ARP廣播

  • ARP :Addresss  Resolution  Protocal 地址解析協議

  • 根據IP地址查詢 接收方MAC地址 的時候會用到ARP廣播

  • 在同一個子網中,利用廣播對所有設備提問 XXX這個ip地址是誰的,其他設備發現自己的ip地址是這個xxx的話,那麼他就會把它的MAC地址告訴提問者,這樣就會檢測到接收方的MAC地址了,如果發現自己的ip地址不是這個XXX,那麼則會丟棄這個消息並不去理會。

  • 如果每次都去廣播的話,那麼網絡中就會增加很多ARP包,所以爲了提高效率,我們有ARP緩存在內存中。查詢之前先去查詢ARP緩存。

  • 當目的地的IP地址對應的MAC地址變了的話,那麼這個MAC緩存就會出問題,所以爲了避免這種問題發生,這個緩存幾分鐘後會被刪除,非常簡單粗暴。

  • 靜態ARP: 手工維護,不會自動失效

  • 動態ARP: 會過段時間自動失效(文中說的就是它)

IP 模塊負責添加如下兩個頭部:

  • MAC頭部: 以太網用的頭部,包含MAC地址

  • IP頭部: IP用的頭部,包含IP地址

總體數據包

這個時候的數據包變成了這個樣子:

  • MTU(Maximum Transmission Unit): 一個網絡包的最大長度,以太網中一般是1500字節;

  • MSS(Maximum Segment Size): 除去頭部之後,一個網絡包所容納的TCP數據的最大長度;

  • 然後這數據包,沿着網卡出去,到集線器,路由器一頓傳輸(中間涉及到電信號轉換等等),到達服務端那邊,再一層一層的扒皮(前往中說過,一層一層的拆分數據包)。

斷開連接

四次揮手

兩臺計算機最後連接結束後要斷開連接,進行 四次揮手

其實 三次握手四次揮手 還有好多好多知識點要說,像什麼爲什麼握手需要三次,而揮手需要四次啦這些問題,之後我們會單獨開一篇內容和大家再深入地講一講,記得掃描下方二維碼關注我們喲!

推薦閱讀

歡迎點擊【京東科技】,瞭解開發者社區

更多精彩技術實踐與獨家乾貨解析

歡迎關注【京東科技開發者】公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章