TCP三次握手與四次揮手

TCP三次握手

一、什麼是三次握手

        三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。

二、三次握手的目的

        三次握手的目的是連接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息。客戶端執行連接請求時。將觸發三次握手。

三、三次握手過程

    


第一次握手:
     客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段裏。
第二次握手:
     服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1同時,將確認序號(Acknowledgement Number)設置爲客戶的ISN加1以.即X+1。
第三次握手.
     客戶端再次發送確認包(ACK) SYN標誌位爲0,ACK標誌位爲1。如果正確則連接建立成功,客戶端和服務器進入ESTABLISHED狀態,完成三次握手,隨後客戶端與服務器之間可以開始傳輸數據了。把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1。

TCP四次揮手

一、什麼是四次揮手

      TCP的連接的拆除需要發送四個包,因此稱爲四次揮手(four-way handshake)。客戶端或服務器均可主動發起揮手動作,任何一方執行close操作即可產生揮手操作。

二、四次揮手過程

 

第一次揮手:

     客戶端發送一個FIN,用來關閉客戶端到服務器的數據傳送,客戶機進入FIN_WAIT_1狀態。
第二次揮手:

     服務器收到FIN後,發送一個ACK給客戶端,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),服務器進入CLOSE_WAIT狀態。
第三次揮手:

     服務器發送一個FIN,用來關閉服務器到客戶端的數據傳送,服務器進入LAST_ACK狀態。
第四次揮手:

     客戶端收到FIN後,客戶端進入TIME_WAIT狀態,接着發送一個ACK給服務器,確認序號爲收到序號+1,服務器進入CLOSED狀態,完成四次揮手。


有限狀態機FSM:Finite State Machine

1、CLOSED 沒有任何連接狀態

2、LISTEN 偵聽狀態,等待來自遠方TCP端口的連接請求

3 、SYN-SENT 在發送連接請求後,等待對方確認

4、SYN-RECEIVED 在收到和發送一個連接請求後,等待對方確認

5、ESTABLISHED 代表傳輸連接建立,雙方進入數據傳送狀態

6、FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認

7 、FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求

8、 TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失

9、CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,並已確認

10、LAST-ACK 被動關閉,等待最後一個關閉傳輸連接確認,並等待所有分組消失

11、CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認

附加問題:


【問題1】爲什麼連接的時候是三次握手,關閉的時候卻是四次揮手?

答:因爲當服務器收到客戶端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來回應的,SYN報文是用來同步的。但是關閉連接時,當服務器收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴客戶端,”發送的FIN報文已經收到”。只有等到客戶端所有的報文都發送完了,客戶端才能發送FIN報文,因此不能一起發送。故需要四步揮手。

【問題2】爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:四個報文都發送完畢,客戶端和服務器可以直接進入CLOSE狀態了,但有可能最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文,確保之前的數據不會丟失後再進入close狀態。


原創文章,作者:Light Yagami,如若轉載,請註明出處:http://www.178linux.com/85976


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章