傳輸控制協議(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 。