TCP三次握手與四次揮手

                                                                          TCP三次握手與四次揮手

TCP三次握手

一、什么是三次握手

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

二、三次握手的目的

        三次握手的目的是連接服務器指定端口,建立TCP連接,并同步連接雙方的序列號和確認號并交換 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)??蛻舳嘶蚍掌骶芍鲃影l起揮手動作,任何一方執行close操作即可產生揮手操作。

二、四次揮手過程

 TCP三次握手與四次揮手

第一次揮手:

     客戶端發送一個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.www58058.com/85976

(2)
Light YagamiLight Yagami
上一篇 2017-09-03 23:39
下一篇 2017-09-04 08:24

相關推薦

  • MySQL常用命令

    本文大綱 MySQL命令             (0%) 交互式CLI工具     服務端命令 mysqld服務器程序 數據類型 DDL語句                 &n…

    Linux干貨 2017-02-16
  • 文本處理章練習題

    2017.7.27練習 1、找出ifconfig “網卡名” 命令結果中本機的IPv4地址 ifconfig |head -n 2 |tail -n 1|tr -s ” ” : |cut -d: -f4   2、查出分區空間使用率的最大百分比值 df|tr -s ‘ ‘ %|sort -t% -k5 …

    2017-07-29
  • 馬哥教育網絡班21期+第六周課程練習

    請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;  ~]# cp /etc/rc.d/rc.sysinit /tmp/  ~]# vim /tmp…

    Linux干貨 2016-08-22
  • 第十二周:httpd和lamp

    看了一下作業內容,發現所有的都在51cto上寫過了。這里就不在做了。 畢竟當時幾篇博客寫下來,還是非常繁瑣的,不想在寫。 文檔地址:RHEL6.8編譯安裝LAMP環境:httpd-2.4+mysql5.6+php5.5;基于LAMP環境部署WordPress: http://afterdawn.blog.51cto.com/7503144/1876171 配…

    Linux干貨 2016-12-09
  • 說說web和http以及lamp/lnmp

    <span style="font-size: 24px;font-family: 宋體,SimSun">**說說web和http以及lamp/lnmp**</span> 說說web和http以及lamp/lnmp 在這篇文章當中你將看到如下內容: web與http的簡介,網頁的分類 度量網站流量的幾個術語——知道…

    2016-05-28
  • bash中的變量

        對任何一門編程語言來說,最基礎的部分就是變量。那什么事變量呢?變量就是把一個已知的可以變動的值,賦給一個固定名字的,用固定的名字代表這個可變動的值。在bash中也不例外,跟大多數編程語言一樣,它也有一些自己的語法和規則 bash變量:     1.規則設置:變量和變量的值中間用=連接,=的兩…

    Linux干貨 2016-08-15
欧美性久久久久