TCP/IP之TCP连接的建立与中止状态分析
TCP連接的建立可以簡單的稱為三次握手,而連接的中止則可以叫做四次握手。
1、連接的建立:
c端發起請求同步(用SYN段等于1的TCP報文),確認某個端口是否監聽;
s端應答(用ACK段等于1的TCP報文),
c端收到s端的ACK,并回應s端一個ACK給s端;
經過上面三步連接的建立完成。這就叫做三次握手;
2、連接的中止:(TCP中有half-close,這是因為TCP的連接是全雙工(可以同時發送和接收)連接,關閉的時候就需要在兩個方向上都進行關閉,否則就是half-close)
c端發起關閉(FIN為1的TCP報文);
s端應答c端(用ACK段等于1的TCP報文);
上面兩步完成就是半關閉(half-close)
s端發起關閉(FIN為1的TCP報文)
c端應答s端(用ACK段等于1的TCP報文)
經過上面四步,連接中止。這叫做四次揮手;
最大報文長度MSS
在建立連接的時候,通信的雙方要互相確認對方的最大報文長度(MSS),以便通信。
一般這個MSS長度是MTU減去固定IP首部和TCP首部長度。對于一個以太網,一般可以達到1460字節。當然如果對于非本地的IP,這個MSS可能就只有536字節,而且,如果中間的傳輸網絡的MSS更佳的小的話,這個值還會變得更小。
TCP的狀態遷移圖
TCP的狀態圖參見書P182頁,這個圖實在太精彩了(筆要偷懶,好好研究);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2MSL等待狀態
TCP狀態圖中有一個TIME_WAIT等待狀態,這個狀態又叫做2MSL狀態,說的是在TIME_WAIT2發送了最后一個ACK數據報以后,要進入TIME_WAIT狀態,這個狀態是防止最后一次握手的數據報沒有傳送到對方那里而準備的(注意這不是四次握手,這是第四次握手的保險狀態)。這個狀態在很大程度上保證了雙方都可以正常結束,但是,問題也來了。
由于插口的2MSL狀態(插口是IP和端口對的意思,socket),使得應用程序在2MSL時間內是無法再次使用同一個插口的,對于客戶程序還好一些,但是對于服務程序,例如httpd,它總是要使用同一個端口來進行服務,而在2MSL時間內,啟動httpd就會出現錯誤(插口被使用)。為了避免這個錯誤,服務器給出了一個平靜時間的概念,這是說在2MSL時間內,雖然可以重新啟動服務器,但是這個服務器還是要平靜的等待2MSL時間的過去才能進行下一次連接。
4.5.FIN_WAIT_2狀態
這就是著名的半關閉的狀態了,這是在關閉連接時,客戶端和服務器兩次握手之后的狀態。在這個狀態下,應用程序還有接受數據的能力,但是已經無法發送數據,但是也有一種可能是,客戶端一直處于FIN_WAIT_2狀態,而服務器則一直處于WAIT_CLOSE狀態,而直到應用層來決定關閉這個狀態。
?
總結
以上是生活随笔為你收集整理的TCP/IP之TCP连接的建立与中止状态分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql 主从复制常用管理任务介绍
- 下一篇: BestCoder Round #4 前