之前探索了了生成HTTP請求消息、委託操作系統發送消息等步驟。接下來將研究操作系統中的
協議棧是如何處理數據發送請求的。這裡先簡單介紹下主要內容。創建套接字
從應用程序收到委託後,協議棧通過TCP協議收發操作的數據可以分成4個階段。首先是創建套接字,在這個階段,我們將介紹協議棧的內部結構、套接字的字體,以及創建套接字的過程。
目的就是為了解套接字是到底是什麼樣的一個東西。
協議棧是根據套接字中記錄的控制信息來工作的。 創建套接字時,首先分配一個套接字所需的內存空間,然後向其中寫入初始狀態。
連接服務器
接下來是客戶端套接字向服務器套接字進行連接的階段。
“連接”具體是進行怎樣的操作,在這個過程中協議到底是如何工作的。以及客戶端與服務器是如何進行交互的。
通信操作中使用的控制信息分為兩類 (1)頭部中記錄的信息 (2)套接字(協議棧中的內存空間)中記錄的信息 連接操作的第一步是在TCP模塊處創建表示連接控制信息的頭部 通過TCP頭部中的發送方和接收方端口號可以找到要連接的套接字
收發數據
兩端的套接字完成連接之後,就進入收發消息的階段。
在這個階段,協議棧會將從應用程序收到的數據切成小塊併發送給服務器,考慮到通信過程中可能會出錯導致網絡包丟失,協議棧還需要確認切分出的每個包是否已經送到服務器,對於沒有送達的包要重新發送一次。
通過“序號”和“ACK號”可以確認接收方是否收到了網絡包。
從服務器斷開連接並刪除套接字
斷開操作的本質是當消息收發完成後客戶端和服務器相互確認的過程,但這個過程並不只是相互確認並刪除套接字那麼簡單。
如果接收緩衝區中還有剩餘的已接收數據,則這些數據會被傳遞給應用程序。
IP與以太網的包收發操作
協議棧會與網卡進行配合,將數據切分成小塊並封裝成網絡包,再將網絡包轉換成電信號或者光信號發送出去。
無論要收發的包是控制包還是數據包,IP對各種類型的包的收發操作都是相同的。 IP模塊根據路由表Gateway欄的內容判斷應該把包發送給誰。 查詢MAC地址需要使用ARP. 網卡中保存的MAC地址會由網卡驅動程序讀取並分配給MAC模塊。
用UDP協議收發數據的操作
TCP協議有很方便的功能,比如網絡包出錯丟失時可以重發,因此很多應用程序都是使用TCP協議來收發數據的,但這些方便的功能也可有幫倒忙的時候,在這種情況下我們還有另一種叫UDP的協議。