探索瀏覽器(四) 委託協議棧發送消息

1.數據收發操作


見圖 1.17,收發數據的兩台電腦之間連接了一條數據通道。將數據通道想像成一條管道,數據可輸入管道達到另一端,且這個管道是雙向的。
總體來說收發過程分成四個階段:
(1)創建套接字(創建套接字階段)
(2)將管道連接到伺服器端的套接字上(連接階段)
(3)收發數據(通訊階段)
(4)斷開管道並刪除套接字(斷開階段)
管道在連接時由客戶端發起,斷開時由雙方。
圖片.png

2.創建套接字階段


類似於訪問 DNS 伺服器一樣,我們也需要調用 Socket 庫特定程式組件。訪問 DNS 伺服器時,我們調用一個叫 gethostbyname 的程式組件(解析器),那麼這次我們會按一定順序調用 Socket 組件(圖 1.18):
① 首先創建套接字,我們調用 Socket 庫的 socket 程式組件即可,同調用解析器過程一樣。
② 創建完後,協議棧返回描述符用來識別不同的套接字,即每一個數據收發操作都有不同的套接字。
③ 接下進入連接階段,見第三節。
圖片.png

3.連接階段:把管道接上去


現在需要把客戶端的套接字和伺服器端的套接字連接起來。通過 Socket 庫中的 connect 組件可完成,它需要指定描述符、伺服器 IP 地址和埠號這三個參數。
① 描述符
② 伺服器 IP 地址:之前通過 DNS 伺服器已經解析到了。
③ 埠號:由於客戶端和伺服器可以有多個套接字,僅憑 IP 地址無法識別是哪個套接字,所以再加上套接字即可完成。

【補充:描述符和埠號區別】
(1)描述符:應用程式用來識別本機套接字的機制(例如客戶端可以有多個應用程式創建套接字,並連接不同的伺服器。用描述符來識別屬於本程式的套接字) (2)IP 地址和埠號:客戶端和伺服器之間用來識別對方套接字的機制(不同伺服器有規定的埠號,如 Web 伺服器規則為 80 埠,而客戶端調用協議棧發放數據時,協議棧會隨機分配一個埠號)

eg.為什麼多個客戶端可以連接同一個伺服器埠
參考://blog.csdn.net/qq_25665807/article/details/77884936

4.通訊階段:傳遞消息


當套接字連接起來後,套接字即可完成傳遞操作:
① 首先用戶輸入網址生成的 HTTP 請求消息(發送數據)
② 調用 write 時候,需要指定些描述符和發送數據,然後委託協議棧將數據發送到伺服器
③ 接下來,伺服器收到樹,並返回給客戶端響應消息。
④ 客戶端通過 Socket 庫中的 read 程式組件委託協議棧接受響應消息,並存放在緩衝區內。

5.斷開階段:收發數據結束


收發數據結束,Socket 庫的 close 組件將斷開,最終管道斷開。
在 HTTP1.0 工作中, 文檔和圖片都作為單獨的對象來處理,每獲取一次數據,就要執行一次連接、發送請求消息、接收響應消息、斷開的過程。因此一個網頁包含很多圖片,就必須沖斷多次連接、收發數據、斷開操作,非常麻煩。而在 HTTP1.1 協議中,當所有數據都請求完成後,瀏覽器會主動觸發斷開連接的操作。