身在信息時代,幾乎人人都需使用設備訪問網絡上的資源。在這個過程中,建立網絡連接所實現的連通性,是計算機網絡最基本功能。今天,我們就來分享一個關於計算機網絡的知識點 —— 網絡到底是怎麼連接的?
瀏覽器生成消息且發送
發送一個消息的總體流程如下
生成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地址不好記,所以纔有了對應的域名,便於我們人類記憶。
-
瀏覽器會檢查緩存有沒有這個域名對應的ip地址
-
操作系統會檢查緩存(就是我們平常說的hosts文件)
-
操作系統會發送給本地區的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數據的最大長度;
-
然後這數據包,沿着網卡出去,到集線器,路由器一頓傳輸(中間涉及到電信號轉換等等),到達服務端那邊,再一層一層的扒皮(前往中說過,一層一層的拆分數據包)。
斷開連接
四次揮手
兩臺計算機最後連接結束後要斷開連接,進行 四次揮手 :
其實 三次握手 , 四次揮手 還有好多好多知識點要說,像什麼爲什麼握手需要三次,而揮手需要四次啦這些問題,之後我們會單獨開一篇內容和大家再深入地講一講,記得掃描下方二維碼關注我們喲!
推薦閱讀
歡迎點擊【京東科技】,瞭解開發者社區
更多精彩技術實踐與獨家乾貨解析
歡迎關注【京東科技開發者】公衆號