1.1 數(shù)據(jù)收發(fā)數(shù)據(jù)概覽
知道了IP地址,就可以委托操作系統(tǒng)內(nèi)部的協(xié)議棧向這個目標(biāo)IP地址,也就是要訪問的Web服務(wù)器發(fā)送消息。這一過程需要按照指定的順序來調(diào)用Socket庫中的程序組件。收發(fā)數(shù)據(jù)的兩臺計算機(jī)之間連接了一條數(shù)據(jù)通道,數(shù)據(jù)的流動是雙向的。要建立連接的通道,需要向建立通道兩端的數(shù)據(jù)出入口,這些出入口稱為套接字。

首先,服務(wù)器一方先創(chuàng)建套接字,然后等待客戶端向該套接字連接管道。當(dāng)服務(wù)器進(jìn)入等待狀態(tài)時,客戶端就可以連接管道??蛻舳艘矔?chuàng)建一個套接字,然后從該套接字延伸出管道,最后管道連接到服務(wù)器端的套接字上。連接是客戶端發(fā)起,但是斷開時可以由客戶端或者服務(wù)器任意一方發(fā)起。一方斷開,另一方也會隨之?dāng)嚅_,當(dāng)管道斷開后,套接字也會被刪除。
收發(fā)數(shù)據(jù)可以分為以下4個階段:
- 1 創(chuàng)建套接字(創(chuàng)建套接字階段)
- 2 將管道連接到服務(wù)器的套接字上(連接階段connect)
- 3 收發(fā)數(shù)據(jù)(通信階段write,read)
- 4 斷開管道并刪除套接字(斷開階段close)
?創(chuàng)建套接字階段:創(chuàng)建套接字是調(diào)用Socket庫中的socket程序組件,如同調(diào)用解析器向DNS服務(wù)器查詢IP一樣。創(chuàng)建完成后,協(xié)議棧會返回一個描述符,描述符是用來識別不同套接字的。計算機(jī)可以同時進(jìn)行多個數(shù)據(jù)的通信操作,比如打開兩個個瀏覽器窗口可能就是訪問兩臺Web服務(wù)器,也就是需要創(chuàng)建兩個不同的套接字。應(yīng)用程序是通過描述符來設(shè)別套接字的。
連接階段:通過調(diào)用Socket庫中connect的程序組件來完成。調(diào)用connect時,需要指定描述符、服務(wù)器IP地址和端口號3個參數(shù)。
IP地址是為了區(qū)分網(wǎng)絡(luò)中各個計算機(jī)而分配的數(shù)值。但是,連接操作的對象是某個具體的套接字,而端口號就是用來讓通信的另一方能夠識別出套接字的機(jī)制。描述符則是用來在一臺計算機(jī)內(nèi)部識別套接字的機(jī)制。當(dāng)同時指定IP地址和端口號時,就可以明確識別出某臺具體的計算機(jī)上的某個具體的套接字。服務(wù)器上所使用的端口號是根據(jù)應(yīng)用的種類事先規(guī)定好的,比如Web是80號端口,電子郵件是25號端口。
總結(jié):描述符:應(yīng)用程序用來識別套接字的機(jī)制。IP地址和端口號:客戶端和服務(wù)器之間用來識別對方套接字的機(jī)制。
通信階段:根據(jù)用戶輸入的網(wǎng)址生成HTTP請求消息就是我們要發(fā)送的數(shù)據(jù)。接下來調(diào)用Socket庫的write組件時,需要指定描述符和發(fā)送數(shù)據(jù),然后協(xié)議棧就會將數(shù)據(jù)發(fā)送到服務(wù)器。接下來,服務(wù)器執(zhí)行接收操作,解析收到的數(shù)據(jù)內(nèi)容并執(zhí)行相應(yīng)的操作,向客戶端返回響應(yīng)消息。當(dāng)消息返回后,客戶端接收消息的操作是通過Socket庫中的read程序組件委托協(xié)議棧來完成。read負(fù)責(zé)將接收到的響應(yīng)消息存放到接收緩沖區(qū)中。
斷開階段:當(dāng)瀏覽器收到數(shù)據(jù)后,收發(fā)數(shù)據(jù)的過程就結(jié)束了。接下來,需要調(diào)用Socket庫的close程序組件進(jìn)入斷開階段。最終,連接的套接字之間的通道和套接字本身都會被刪除。
