tcp的狀態詳解

tcp狀態詳解網絡

客戶端:SYN_SENT FIN_WAIT1 FIN_WAIN2 CLOSING TIME_WAIT
服務端:LISTEN SYN_RCVD CLOSE_WAIT LAST_ACK
共有的:CLOSED ESTABLISHED併發

TCP/IP三次握手:
服務端socket監聽端口時會處於LISTEN狀態,表示端口開放隨時可接受鏈接。
客戶端第一次發送SYN報文後會進入SYN-SENT等待匹配鏈接狀態。請求創建鏈接。
服務端收到SYN後併發送SYN和ACK報文,這時會進入SYN_RCVD狀態,詢問客戶端是否準備進行數據鏈接傳輸。
客戶端收到SYN和ACK報文併發送ACK報文後就進入ESTABLISHED鏈接狀態,服務端收到也進會入ESTABLISHED鏈接狀態。socket

TCP/IP四次斷開:
客戶端主動發送FIN斷開鏈接請求後會進入FIN_WAIT_1。等待對方FIN中斷請求。
服務端收到FIN併發送立刻發送ACK報文後進入CLOSE_WAIT狀態,檢測是否還有數據傳輸。
客戶端收到ACK報文後會進入FIN_WAIT_2。會繼續等待對方FIN中斷請求。
服務端確認沒有數據傳輸,則發送FIN給客戶端後進入LAST_ACK狀態。最後等待對方的ACK報文。當收到ACK報文後,也就進入CLOSED無鏈接狀態了。
客戶端收到FIN,併發送ACK後就進入TIME_WAIT狀態。若是在FIN_WAIT_1狀態下同時收到ACK和FIN報文時,能夠直接進入TIME_WAIT狀態,無需通過FIN_WAIN_2。
客戶端在TIME_WAIT狀態時須要等待2MSL後才能返回CLOSED狀態。tcp

什麼是2MSL:  https://blog.csdn.net/xiaofei0859/article/details/6044694spa

 

注:爲何TIME_WAIT狀態還須要等2MSL後才能返回到CLOSED狀態?
這是由於: 雖然雙方都贊成關閉鏈接了,並且握手的4個報文也都協調和發送完畢,按理能夠直接回到CLOSED狀態(就比如從SYN_SEND狀態到 ESTABLISH狀態那樣);可是由於咱們必需要假想網絡是不可靠的,你沒法保證你最後發送的ACK報文會必定被對方收到,所以對方處於 LAST_ACK狀態下的SOCKET可能會由於超時未收到ACK報文,而重發FIN報文,因此這個TIME_WAIT狀態的做用就是用來重發可能丟失的 ACK報文。.net

 

注:CLOSING狀態比較特殊,他表示你發送FIN報文後並無接收到對方的ACK報文,而是接收到對方的FIN報文。通常出現雙方同時發送FIN報文,表示雙方都在關閉鏈接。
若是同時發送FIN,則在發送後會首先進入FIN_WAIT_1狀態。在收到對端的FIN後,回覆一個ACK,會進入CLOSING狀態。在收到對端的ACK後,進入TIME_WAIT狀態。這種狀況稱爲同時關閉。
同時關閉也須要有4次報文交換,與典型的關閉相同。blog

相關文章
相關標籤/搜索