1.1 數(shù)據(jù)收發(fā)數(shù)據(jù)概覽
知道了IP地址犁嗅,就可以委托操作系統(tǒng)內(nèi)部的協(xié)議棧向這個(gè)目標(biāo)IP地址敛瓷,也就是要訪問的Web服務(wù)器發(fā)送消息。這一過程需要按照指定的順序來調(diào)用Socket庫中的程序組件。收發(fā)數(shù)據(jù)的兩臺(tái)計(jì)算機(jī)之間連接了一條數(shù)據(jù)通道,數(shù)據(jù)的流動(dòng)是雙向的搭幻。要建立連接的通道,需要向建立通道兩端的數(shù)據(jù)出入口逞盆,這些出入口稱為套接字檀蹋。
首先,服務(wù)器一方先創(chuàng)建套接字云芦,然后等待客戶端向該套接字連接管道俯逾。當(dāng)服務(wù)器進(jìn)入等待狀態(tài)時(shí),客戶端就可以連接管道焕数。客戶端也會(huì)創(chuàng)建一個(gè)套接字刨啸,然后從該套接字延伸出管道堡赔,最后管道連接到服務(wù)器端的套接字上。連接是客戶端發(fā)起设联,但是斷開時(shí)可以由客戶端或者服務(wù)器任意一方發(fā)起善已。一方斷開,另一方也會(huì)隨之?dāng)嚅_离例,當(dāng)管道斷開后换团,套接字也會(huì)被刪除。
收發(fā)數(shù)據(jù)可以分為以下4個(gè)階段:
- 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é)議棧會(huì)返回一個(gè)描述符,描述符是用來識(shí)別不同套接字的想虎。計(jì)算機(jī)可以同時(shí)進(jìn)行多個(gè)數(shù)據(jù)的通信操作卦尊,比如打開兩個(gè)個(gè)瀏覽器窗口可能就是訪問兩臺(tái)Web服務(wù)器,也就是需要?jiǎng)?chuàng)建兩個(gè)不同的套接字舌厨。應(yīng)用程序是通過描述符來設(shè)別套接字的岂却。
連接階段:通過調(diào)用Socket庫中connect的程序組件來完成。調(diào)用connect時(shí)裙椭,需要指定描述符躏哩、服務(wù)器IP地址和端口號(hào)3個(gè)參數(shù)。
IP地址是為了區(qū)分網(wǎng)絡(luò)中各個(gè)計(jì)算機(jī)而分配的數(shù)值揉燃。但是扫尺,連接操作的對象是某個(gè)具體的套接字,而端口號(hào)就是用來讓通信的另一方能夠識(shí)別出套接字的機(jī)制你雌。描述符則是用來在一臺(tái)計(jì)算機(jī)內(nèi)部識(shí)別套接字的機(jī)制器联。當(dāng)同時(shí)指定IP地址和端口號(hào)時(shí),就可以明確識(shí)別出某臺(tái)具體的計(jì)算機(jī)上的某個(gè)具體的套接字婿崭。服務(wù)器上所使用的端口號(hào)是根據(jù)應(yīng)用的種類事先規(guī)定好的拨拓,比如Web是80號(hào)端口,電子郵件是25號(hào)端口氓栈。
總結(jié):描述符:應(yīng)用程序用來識(shí)別套接字的機(jī)制渣磷。IP地址和端口號(hào):客戶端和服務(wù)器之間用來識(shí)別對方套接字的機(jī)制。
通信階段:根據(jù)用戶輸入的網(wǎng)址生成HTTP請求消息就是我們要發(fā)送的數(shù)據(jù)授瘦。接下來調(diào)用Socket庫的write組件時(shí)醋界,需要指定描述符和發(fā)送數(shù)據(jù),然后協(xié)議棧就會(huì)將數(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)入斷開階段。最終断医,連接的套接字之間的通道和套接字本身都會(huì)被刪除滞乙。