7.13一次完整的Http請求過程(3)
一次完整請求的圖解
TCP之四次揮手
首先明確特點:
-
斷開連線Server或者Client都可以斷開
四次揮手過程
-
A向B傳送連線釋放報文段並停止傳送資料,此報文段中FIN=;seq=u(等於上次傳送資料的最後一個位元組加1),此時A進入FIN_WAIT-1(終止等待1)狀態。TCP規定,FIN報文段即使不攜帶資料也要消耗一個序號。
-
B收到連線釋放報文段後就傳送確認報文,此時ACK=1;ack=u+1;seq=v;此時B進入close_wait(關閉等待)狀態。TCP伺服器程序通知應用程序A到B的連線釋放了,此時TCP連線處於半關閉狀態,B到A的連線並未斷開,此時B傳送資料A仍要接收。--->B在這時候做的動作是:通知系統關閉程序,A不能向B傳送資料,但B可向A傳送資料
-
A收到B的確認報文後就處於FIN_WAIT2狀態,等待B傳送連線釋放報文段。
-
如果B沒有資料要傳送了,就傳送連線釋放報文段,此時,FIN=1;ACK=1;seq=w;ack=u+1;此時B處於last_ack(最後確認)狀態。
-
A收到B的連線請求報文段後就傳送確認報文段,此時ACK=1;ack=w+1;seq=u+1;此時A處於time_wait等待狀態。
此時TCP連線還未釋放掉,必須經過時間等待計時器(TIME-WAIT timer)設定的2倍的最長報文壽命MSL(Maximum Segment Lifetime)後A才進入到CLOSED,MSL建議設為2分鐘。當A撤銷相應的傳輸控制塊TCB後,就結束了這次TCP連線。B收到A的確認報文就進入CLOSED狀態,當B撤銷相應的傳輸控制塊TCB後,就結束了這次TCP連線。
為什麼是四次揮手不是三次:
其實是可以三次揮手的,因為Client端有一個等待時間,超過這個時間未收到可以關閉連線
而Server端有一個保活時間,如果Server端已經發出了確認釋放報文段沒有收到Client的回覆,過了保活時間可以另作處理
It's a lonely road!!!