TCP三次握手與四次揮手

TCP三次握手linux

1、什麼是三次握手服務器

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

2、三次握手的目的ide

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

3、三次握手過程3d

    


第一次握手:
     客戶端發送一個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。
orm

TCP四次揮手blog

1、什麼是四次揮手同步

      TCP的鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動做,任何一方執行close操做便可產生揮手操做。
it

2、四次揮手過程

 

第一次揮手:

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

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

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

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


有限狀態機FSM:Finite State Machine

一、CLOSED 沒有任何鏈接狀態

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

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

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

五、ESTABLISHED 表明傳輸鏈接創建,雙方進入數據傳送狀態

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

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

八、 TIME-WAIT 完成雙向傳輸鏈接關閉,等待全部分組消失

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

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

十一、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

相關文章
相關標籤/搜索