- 論壇徽章:
- 0
|
回復(fù) 5# ssffzz1
多謝回復(fù)!
我解釋下你提的問題,不對的地方,還請指正,謝謝。
Q:服務(wù)器只開了一個80端口,為什么大家可以同時訪問呢???
A:應(yīng)用程序使用TCP協(xié)議, 三次握手建立連接,建立的socket 是流套接字(基于TCP協(xié)議),使用Internet域。
先說明應(yīng)用程序上的操作:
服務(wù)器端:服務(wù)器應(yīng)用程序開放80端口,并處于LISTEN狀態(tài)的過程:服務(wù)器應(yīng)用程序(nginx,apache等)調(diào)用socket函數(shù)創(chuàng)建socket,使用bind函數(shù)bind綁定地址和套接字名(即包含IP地址和端口號的Internet套接字),使用listen函數(shù)創(chuàng)建服務(wù)器端socket隊列,使用accept函數(shù)等待客戶端的請求。
客戶端:客戶端應(yīng)用程序(瀏覽器)調(diào)用socket函數(shù)創(chuàng)建客戶端套接字,接下來調(diào)用connect 函數(shù)發(fā)送請求到服務(wù)器端,服務(wù)器端的accept 函數(shù)接受客戶端請求,建立連接。
只開一個80端口,為什么大家都可以同時訪問呢?原因在:accept函數(shù)接受到A客戶端請求后,使用原來的套接字(即服務(wù)器端socket函數(shù)創(chuàng)建的套接字)相同的屬性打開新的套接字文件句柄,并將它附加給A客戶端的套接字(即由監(jiān)聽套接字產(chǎn)生連接套接字),這個連接套接字可以與A客戶端進(jìn)行通信,此時TCP連接建立。原來的套接字(即服務(wù)器端socket函數(shù)創(chuàng)建的套接字)已經(jīng)解放出來了,如果有新的客戶端B請求80端口服務(wù),原來的套接字又可以進(jìn)行處理了。
關(guān)于TCP的三次握手過程,我的理解如下:
客戶端發(fā)送tcp報文,包含了源端口,目的端口,flag位為S 即 SYN 包給服務(wù)器端
服務(wù)器收到后,發(fā)送 ACK+SYN 包到客戶端
客戶端收到后,發(fā)送 ACK 包 給服務(wù)器端,從而建立三次握手。
例如:我的問題實例:
tcp 0 0 58.248.171.*:80 124.65.82.194:2922 TIME_WAIT -
客戶端IP:124.65.82.194 發(fā)起請求,本地創(chuàng)建socket,包含:源ip:124.65.82.194 源端口:2922
目標(biāo)IP:58.248.171.* ,目標(biāo)端口80
服務(wù)器端IP:58.248.171.* ,接受到客戶端請求后,建立三次握手。此時服務(wù)器端套接字狀態(tài)為“ESTABLISHED”
當(dāng)服務(wù)器和客戶端之間數(shù)據(jù)傳輸完畢后,接下來關(guān)閉TCP連接。
TCP 關(guān)閉連接:(這里只說明TCP三向關(guān)閉)
A主動發(fā)送FIN包,A進(jìn)入FIN_WAIT_1 狀態(tài)
B接受到A的FIN包,狀態(tài)轉(zhuǎn)為CLOSE_WAIT,再完成發(fā)送FIN+ACK包,狀態(tài)變?yōu)長AST_ACK
A收到B的FIN+ACK包,狀態(tài)變?yōu)門IME_WAIT,并發(fā)送ACK,等待2MSL后,TIME_WAIT消失
B收到A的ACK后,狀態(tài)LAST_ACK 消失。
主動發(fā)送FIN包的一方,在收到對方發(fā)回的ACK包后進(jìn)入TIME_WAIT狀態(tài)
從本例看,是服務(wù)器:58.248.171.* 主動發(fā)送的FIN包。
我的問題依舊:
同一個socket 的多個TIME_WAIT 的是如何同時產(chǎn)生的,同樣的socket ,是如何進(jìn)行數(shù)據(jù)傳輸?shù),又如何正常關(guān)閉的?
分析:
假設(shè)1、同一socket的多個TIME_WAIT連接是由多個處于ESTABLISHED 狀態(tài)的socket 關(guān)閉產(chǎn)生。
如果假設(shè)1成立,這將得出矛盾,即同一個socket ,多個ESTABLISHED 狀態(tài),數(shù)據(jù)傳輸肯定會出問題,TCP協(xié)議中也沒有提及到這個可能出現(xiàn)的情況。
假設(shè)2,同一socket的多個TIME_WAIT連接是由同一個處于ESTABLISHED 狀態(tài)的socket 關(guān)閉產(chǎn)生。
似乎這個假設(shè)更像問題的本質(zhì),如果是這樣,那么在服務(wù)器端主動發(fā)出FIN包,并收到客戶端的ACK包,進(jìn)入TIME_WAIT狀態(tài)的時候出現(xiàn)了什么問題?
你說的正常,請問是在哪一步出現(xiàn)的正常現(xiàn)象?還請指出,我要推翻的認(rèn)識在哪?
|
|