網路是怎樣連線的-第二章-建立套接字
2.1 建立套接字
2.1.1 協議棧的內部結構
協議棧的內部如圖 2.1 所示,分為幾個部分,分別承擔不同的功能。
這張圖中的上下關係是有一定規則的,上面的部分會向下面的部分委派工作,下面的部分接受委派的工作並實際執行。
上下關係只是一個總體的規則,其中也有一部分上下關係不明確,或者上下關係相反的情況。
網路應用程式
圖中最上面的部分是網路應用程式,它們會將收發資料等工作委派給下層的部分來完成。
Socket庫
應用程式的下面是 Socket 庫,其中包括解析器,解析器用來向 DNS伺服器發出查詢。
作業系統
再下面就是作業系統內部了,其中包括協議棧。
協議棧的上半部分有兩塊,分別是負責用 TCP 協議收發資料的部分和負責用 UDP 協議收發資料的部分,它們會接受應用程式的委託執行收發資料的操作。
瀏覽器、郵件等一般應用程式收發資料時用 TCP;
DNS 查詢等收發較短的控制資料時用 UDP。
IP協議切分網路包
下面一半是用 IP 協議控制網路包收發操作的部分。
在網際網路上傳送資料時,資料會被切分成一個一個的網路包,而將網路包傳送給通訊物件的操作就是由 IP 來負責的。
此外,IP 中還包括 ICMP 協議和 ARP 協議。
ICMP 用於告知網路包傳送過程中產生的錯誤以及各種控制訊息。
ARP 用於根據 IP 地址查詢相應的乙太網 MAC 地址。
網路包
網路中的資料會被切分成幾十位元組到幾千位元組的小塊,每一個小資料塊被稱為一個包。
網絡卡驅動
IP 下面的網絡卡驅動程式負責控制網絡卡硬體。
而最下面的網絡卡則負責完成實際的收發操作,也就是對網線中的訊號執行傳送和接收的操作。
2.1.2 套接字的實體就是通訊控制資訊
套接字的實體是什麼
在協議棧內部有一塊用於存放控制資訊的記憶體空間,這裡記錄了用於控制通訊操作的控制資訊,例如通訊物件的 IP 地址、埠號、通訊操作的進行狀態等。
本來套接字就只是一個概念而已,並不存在實體,如果一定要賦予它一個實體,我們可以說這些控制資訊就是套接字的實體,或者說存放控制資訊的記憶體空間就是套接字的實體。
套接字對於協議棧的作用
協議棧在執行操作時需要參閱這些控制資訊。
例如,在傳送資料時,需要看一看套接字中的通訊物件 IP 地址和埠號,以便向指定的 IP 地址和埠傳送資料。
在傳送資料之後,協議棧需要等待對方返回收到資料的響應資訊,但資料也可能在中途丟失,永遠也等不到對方的響應。在等待一定時間之後需要重新發送丟失的資料。
此時就需要協議棧能夠知道執行傳送資料操作後過了多長時間。為此,套接字中必須要記錄是否已經收到響應,以及傳送資料後經過了多長時間,才能根據這些資訊按照需要執行重發操作。
套接字中記錄了用於控制通訊操作的各種控制資訊,協議棧則需要根據這些資訊判斷下一步的行動,這就是套接字的作用。
2.1.3 呼叫 socket 時的操作
瀏覽器通過 Socket 庫向協議棧發出委託的一系列操作,如圖2.3所示。
應用程式申請建立套接字
首先是建立套接字的階段如圖 2.3 ①所示,應用程式呼叫 socket 申請建立套接字,協議棧根據應用程式的申請執行建立套接字的操作。
在這個過程中,協議棧首先會分配用於存放一個套接字所需的記憶體空間。
套接字剛剛建立時,資料收發操作還沒有開始,因此需要在套接字的記憶體空間中寫入表示這一初始狀態的控制資訊。到這裡,建立套接字的操作就完成了。
將套接字的描述符返回給應用程式
接下來,需要將表示這個套接字的描述符告知應用程式。描述符相當於用來區分協議棧中的多個套接字的號碼牌。
收到描述符之後,應用程式在向協議棧進行收發資料委託時就需要提供這個描述符。
由於套接字中記錄了通訊雙方的資訊以及通訊處於怎樣的狀態,所以只要通過描述符確定了相應的套接字,協議棧就能夠獲取所有的相關資訊,這樣一來,應用程式就不需要每次都告訴協議棧應該和誰進行通訊了。