TCP連接的11種狀態


傳輸控制協議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。TCP協議主要針對三次握手建立連接和四次揮手斷開連接,其中包括了11中具體的連接狀態。分別是:

                   

一、LISTEN

LISTEN:表示偵聽來自遠方的TCP端口的連接請求。首先服務端需要打開一個socket 進行監聽,狀態為LISTEN。 有提供某種服務才會處於LISTEN狀態, TCP狀態變化就是某個端口的狀態變化,提供一個服務就打開一個端口。例如FTP服務啟動后首先處於偵聽(LISTEN)狀態。處於偵聽LISTEN狀態時,該端口是開放的,等待連接,但還沒有被連接。

二、SYN-SENT

在客戶端發送連接請求后,等待匹配的連接請求。比如客戶端tcp發送一個SYN以請求建立一個連接,之后狀態置為SYN_SENT。

三、SYN-RECEIVED

在收到和發送一個連接請求后等待對方對連接請求的確認。當服務器收到客戶端發送的同步信號時,將標志位ACK和SYN置1發送給客戶端,此時服務器端處於SYN_RCVD狀態, 如果連接成功了就變為ESTABLISHED,正常情況下SYN_RCVD狀態非常短暫。

四、ESTABLISHED

ESTABLISHED狀態是表示兩台機器正在傳輸數據,觀察這個狀態最主要的就是看哪個程序正在處於ESTABLISHED狀態。

五、FIN-WAIT-1

等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認。主動關閉(active close)端應用程序調用close,於是其TCP發出FIN請求主動關閉連接,之后進入FIN-WAIT-1狀態。

六、FIN-WAIT-2

主動關閉端接到ACK后,就進入了FIN-WAIT-2,這時處於等待遠程TCP等待連接中斷請求,這就是著名的半關閉的狀態了,這是在關閉連接時,客戶端和服務器兩次握手之后的狀態。在這個狀態下,應用程序還有接受數據的能力,但是已經無法發送數據,但是也有一種可能是,客戶端一直處於FIN_WAIT_2狀態,而服務器則一直處於WAIT_CLOSE狀態,而直到應用層來決定關閉這個狀態。

七、CLOSE-WAIT

等待從本地用戶發來的連接中斷請求,被動關閉(passive close)端TCP接到FIN后,就發出ACK以回應FIN請求(它的接收也作為文件結束符傳遞給上層應用程序),並進入CLOSE_WAIT狀態。對方主動關閉連接或者網絡異常導致連接中斷,這時我方的狀態會變成CLOSE_WAIT 此時我方要調用close()來使得連接正確關閉。

八、CLOSING

等待遠程TCP對連接中斷的確認。時間短,一般很少見。

九、LAST-ACK

等待原來的發向遠程TCP的連接中斷請求的確認,被動關閉端一段時間后,接收到文件結束符的應用程序將調用CLOSE關閉連接。這導致它的TCP也發送一個 FIN,等待對方的ACK,就進入了LAST-ACK狀態。

十、TIME-WAIT

等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認,在主動關閉端接收到FIN后,TCP就發送ACK包,並進入TIME-WAIT狀態。我方主動調用close()斷開連接,收到對方確認后狀態變為TIME_WAIT。TCP協議規定TIME_WAIT狀態會一直持續2MSL(即兩倍的分段最大生存期),以此來確保舊的連接狀態不會對新連接產生影響。處於TIME_WAIT狀態的連接占用的資源不會被內核釋放,所以作為服務器,在可能的情況下,盡量不要主動斷開連接,以減少TIME_WAIT狀態造成的資源浪費。

十一、CLOSED

沒有任何連接狀態。

 

注意,通常情況下這11種狀態不是客戶端和服務器都有的,其中

只存在於客戶端的狀態有:(1)SYN_SENT (2)FIN_WAIT_1 (3)FIN_WAIT_2 (4)CLOSING (5)TIME_WAIT

只存在於服務器端的狀態有:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。

客戶端和服務器端共有的狀態有:(1)CLOSED (2)ESTABLISHED 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM