轉載自https://www.cnblogs.com/jessezeng/p/5617105.html
TCP協議端口狀態說明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ...
了解TCP協議端口的連接狀態,對排除和定位網絡或系統故障會有很大幫助,因此了解一下是有必要的:
一、LISTENING
提供某種服務,偵聽遠方TCP端口的連接請求,當提供的服務沒有被連接時,處於LISTENING狀態,端口是開放的,等待被連接。
二、SYN_SENT (客戶端狀態)
客戶端調用connect,發送一個SYN請求建立一個連接,在發送連接請求后等待匹配的連接請求,此時狀態為SYN_SENT.
三、SYN_RECEIVED (服務端狀態)
在收到和發送一個連接請求后,等待對方對連接請求的確認,當服務器收到客戶端發送的同步信號時,將標志位ACK和SYN置1發送給客戶端,此時服務器端處於SYN_RCVD狀態,如果連接成功了就變為ESTABLISHED,正常情況下SYN_RCVD狀態非常短暫。
四、ESTABLISHED
ESTABLISHED狀態是表示兩台機器正在傳輸數據。
五、FIN-WAIT-1
等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認,主動關閉端應用程序調用close,TCP發出FIN請求主動關閉連接,之后進入FIN_WAIT1狀態。
六、FIN-WAIT-2
從遠程TCP等待連接中斷請求,主動關閉端接到ACK后,就進入了FIN-WAIT-2 .這是在關閉連接時,客戶端和服務器兩次握手之后的狀態,是著名的半關閉的狀態了,在這個狀態下,應用程序還有接受數據的能力,但是已經無法發送數據,但是也有一種可能是,客戶端一直處於FIN_WAIT_2狀態,而服務器則一直處於WAIT_CLOSE狀態,而直到應用層來決定關閉這個狀態。
七、CLOSE-WAIT
等待從本地用戶發來的連接中斷請求 ,被動關閉端TCP接到FIN后,就發出ACK以回應FIN請求(它的接收也作為文件結束符傳遞給上層應用程序),並進入CLOSE_WAIT.
八、CLOSING
等待遠程TCP對連接中斷的確認,處於此種狀態比較少見。
九、LAST-ACK
等待原來的發向遠程TCP的連接中斷請求的確認,被動關閉端一段時間后,接收到文件結束符的應用程序將調用CLOSE關閉連接,TCP也發送一個 FIN,等待對方的ACK.進入LAST-ACK。
十、TIME-WAIT
在主動關閉端接收到FIN后,TCP就發送ACK包,並進入TIME-WAIT狀態,等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認,很大程度上保證了雙方都可以正常結束,但是也存在問題,須等待2MSL時間的過去才能進行下一次連接。
十一、CLOSED
被動關閉端在接受到ACK包后,就進入了closed的狀態,連接結束,沒有任何連接狀態。
狀態遷移過程:
a、客戶端:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
b、服務端
CLOSED->LISTEN->SYN_RECEIVED->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSE
在眾多狀態中,經常關注的有兩個:TIME_WAIT、CLOSE_WAIT。
附狀態遷移過程圖: