了解TCP協(xié)議端口的連接狀態(tài),對排除和定位網絡或系統(tǒng)故障會有很大幫助,因此了解一下是有必要的:
一、LISTENING
提供某種服務,偵聽遠方TCP端口的連接請求,當提供的服務沒有被連接時,處于LISTENING狀態(tài),端口是開放的,等待被連接。
二、SYN_SENT (客戶端狀態(tài))
客戶端調用connect,發(fā)送一個SYN請求建立一個連接,在發(fā)送連接請求后等待匹配的連接請求,此時狀態(tài)為SYN_SENT.
三、SYN_RECEIVED (服務端狀態(tài))
在收到和發(fā)送一個連接請求后,等待對方對連接請求的確認,當服務器收到客戶端發(fā)送的同步信號時,將標志位ACK和SYN置1發(fā)送給客戶端,此時服務器端處于SYN_RCVD狀態(tài),如果連接成功了就變?yōu)镋STABLISHED,正常情況下SYN_RCVD狀態(tài)非常短暫。
四、ESTABLISHED
ESTABLISHED狀態(tài)是表示兩臺機器正在傳輸數(shù)據(jù)。
五、FIN-WAIT-1
等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認,主動關閉端應用程序調用close,TCP發(fā)出FIN請求主動關閉連接,之后進入FIN_WAIT1狀態(tài)。
六、FIN-WAIT-2
從遠程TCP等待連接中斷請求,主動關閉端接到ACK后,就進入了FIN-WAIT-2 .這是在關閉連接時,客戶端和服務器兩次握手之后的狀態(tài),是著名的半關閉的狀態(tài)了,在這個狀態(tài)下,應用程序還有接受數(shù)據(jù)的能力,但是已經無法發(fā)送數(shù)據(jù),但是也有一種可能是,客戶端一直處于FIN_WAIT_2狀態(tài),而服務器則一直處于WAIT_CLOSE狀態(tài),而直到應用層來決定關閉這個狀態(tài)。
附半關閉例圖:

七、CLOSE-WAIT
等待從本地用戶發(fā)來的連接中斷請求 ,被動關閉端TCP接到FIN后,就發(fā)出ACK以回應FIN請求(它的接收也作為文件結束符傳遞給上層應用程序),并進入CLOSE_WAIT.
八、CLOSING
等待遠程TCP對連接中斷的確認,處于此種狀態(tài)比較少見。
九、LAST-ACK
等待原來的發(fā)向遠程TCP的連接中斷請求的確認,被動關閉端一段時間后,接收到文件結束符的應用程序將調用CLOSE關閉連接,TCP也發(fā)送一個 FIN,等待對方的ACK.進入LAST-ACK。
十、TIME-WAIT
在主動關閉端接收到FIN后,TCP就發(fā)送ACK包,并進入TIME-WAIT狀態(tài),等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認,很大程度上保證了雙方都可以正常結束,但是也存在問題,須等待2MSL時間的過去才能進行下一次連接。
十一、CLOSED
被動關閉端在接受到ACK包后,就進入了closed的狀態(tài),連接結束,沒有任何連接狀態(tài)。
附TCP正常連接建立和終止所對應的狀態(tài)圖

狀態(tài)遷移過程:
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
在眾多狀態(tài)中,經常關注的有兩個:TIME_WAIT、CLOSE_WAIT。
附狀態(tài)遷移過程圖:
