瞭解TCP協議端口的鏈接狀態,對排除和定位網絡或系統故障會有很大幫助,所以瞭解一下是有必要的:服務器
1、LISTENING 網絡
提供某種服務,偵聽遠方TCP端口的鏈接請求,當提供的服務沒有被鏈接時,處於LISTENING狀態,端口是開放的,等待被鏈接。3d
2、SYN_SENT (客戶端狀態)blog
客戶端調用connect,發送一個SYN請求創建一個鏈接,在發送鏈接請求後等待匹配的鏈接請求,此時狀態爲SYN_SENT.同步
3、SYN_RECEIVED (服務端狀態)服務器端
在收到和發送一個鏈接請求後,等待對方對鏈接請求的確認,當服務器收到客戶端發送的同步信號時,將標誌位ACK和SYN置1發送給客戶端,此時服務器端處於SYN_RCVD狀態,若是鏈接成功了就變爲ESTABLISHED,正常狀況下SYN_RCVD狀態很是短暫。sed
4、ESTABLISHED請求
ESTABLISHED狀態是表示兩臺機器正在傳輸數據。程序
5、FIN-WAIT-1im
等待遠程TCP鏈接中斷請求,或先前的鏈接中斷請求的確認,主動關閉端應用程序調用close,TCP發出FIN請求主動關閉鏈接,以後進入FIN_WAIT1狀態。
6、FIN-WAIT-2
從遠程TCP等待鏈接中斷請求,主動關閉端接到ACK後,就進入了FIN-WAIT-2 .這是在關閉鏈接時,客戶端和服務器兩次握手以後的狀態,是著名的半關閉的狀態了,在這個狀態下,應用程序還有接受數據的能力,可是已經沒法發送數據,可是也有一種多是,客戶端一直處於FIN_WAIT_2狀態,而服務器則一直處於WAIT_CLOSE狀態,而直到應用層來決定關閉這個狀態。
附半關閉例圖:
7、CLOSE-WAIT
等待從本地用戶發來的鏈接中斷請求 ,被動關閉端TCP接到FIN後,就發出ACK以迴應FIN請求(它的接收也做爲文件結束符傳遞給上層應用程序),並進入CLOSE_WAIT.
8、CLOSING
等待遠程TCP對鏈接中斷的確認,處於此種狀態比較少見。
9、LAST-ACK
等待原來的發向遠程TCP的鏈接中斷請求的確認,被動關閉端一段時間後,接收到文件結束符的應用程序將調用CLOSE關閉鏈接,TCP也發送一個 FIN,等待對方的ACK.進入LAST-ACK。
10、TIME-WAIT
在主動關閉端接收到FIN後,TCP就發送ACK包,並進入TIME-WAIT狀態,等待足夠的時間以確保遠程TCP接收到鏈接中斷請求的確認,很大程度上保證了雙方均可以正常結束,可是也存在問題,須等待2MSL時間的過去才能進行下一次鏈接。
11、CLOSED
被動關閉端在接受到ACK包後,就進入了closed的狀態,鏈接結束,沒有任何鏈接狀態。
附TCP正常鏈接創建和終止所對應的狀態圖
狀態遷移過程:
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。
附狀態遷移過程圖: