淺談TCP三次握手和四次分手

      TCP(Transmission Control Protocol傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議提供可靠的連接服務,采用三次握手確認建立一個連接,比如我們去訪問一個網站,從輸入網址到頁面顯示我們所想要瀏覽的內容,這個過程其中就包含了小編要說的三次握手和四次揮手。

一、首先我們來了解一下tcp包頭的6種標示:

     URG:(緊急)表示本報文段中發送的數據是否包含緊急數據。

     ACK:(確認)表示是否前面的確認號字段是否有效。

     PSH:(傳送)提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收后續數 據騰出空間。

     RST:(重置)如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤,必須釋放連接,然后再重新建立連接。

     SYN:(建立連接)在建立連接時使用,用來同步序號。

     FIN:(結束連接)表示通知對方本端要關閉連接了,標記數據是否發送完畢

二、下面來張匯總圖:

淺談TCP三次握手和四次分手

2.1 上圖為TCP的狀態機,各種版本、模式相信好多人都應該看到過了,小編也是大概畫個樣板圖,從圖中我們可以看到客戶端和服務器端的狀態處于變換之中,那么我們來總結一下它們的變換流程。

   * 客戶端TCP狀態遷移:

     CLOSED——SYN-SEND——ESTABLISHED——FIN-WAIT1——FIN-WAIT2——TIME-WAIT

淺談TCP三次握手和四次分手

   * 服務器端TCP狀態遷移:

     CLOSED——LISTEN——SYN-RECEIVED——ESTABLISHED—-CLOSED-WAIT——LAST-ACK——CLOSED

淺談TCP三次握手和四次分手

2.2 各狀態含義:

   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

淺談TCP三次握手和四次分手

3.1 三次握手建立連接,如上圖所示:

    第一次握手:建立連接時,客戶端A發送SYN包(SYN=1)到服務器B,并進入SYN_SEND狀態,等待服務器B確認。

    第二次握手:服務器B收到SYN包,必須確認客戶ASYNACK=x+1),同時自己也發送一個SYN包(SYN=1),即SYN+ACK包,此時服務器B進入SYN_RECV狀態。

    第三次握手:客戶端A收到服務器BSYNACK包,向服務器B發送確認包ACKACK=y+1),此包發送完畢,客戶端A和服務器B進入ESTABLISHED狀態,完成三次握手。之后就可以進行數據傳送。

    這里的X+1就是指接受方希望收到的下一個序列號

3.2 抓包截圖具體示例TCP的三次握手(SYN,(SYN+ACK),ACK

淺談TCP三次握手和四次分手

四、簡圖2

淺談TCP三次握手和四次分手

4.1 四次揮手(斷開連接),如上圖所示:

     第一次揮手:客戶端服務器發送一個FIN報文段序列號為u,此時,客戶端進入FIN_WAIT_1狀態,這表示客戶端沒有數據要發送給服務器

     第二次揮手:服務器收到了客戶端發送的FIN報文段,向客戶端回一個ACK報文段,序列號為u+1,客戶端進入FIN_WAIT_2狀態,服務器告訴客戶端,我也沒有數據要發送了,可以進行關閉連接了

     第三次揮手:服務器客戶端發送FIN報文段,請求關閉連接,同時服務器進入CLOSE_WAIT狀態

     第四次揮手:客戶端收到服務器發送的FIN報文段,向服務器發送ACK報文段,然后客戶端進入TIME_WAIT狀態;服務器收到客戶端ACK報文段以后,就關閉連接;此時,客戶端等待2MSL后依然沒有收到回復,則證明服務器已正常關閉,此時,客戶端也可以關閉連接了

4.2 抓包截圖具體示例TCP的四次揮手((FIN+ACK),ACK,(FIN+ACK),ACK

淺談TCP三次握手和四次分手

五、兩個小問題

5.1 為什么連接的時候是三次握手,關閉的時候卻是四次握手?
     答:因為當服務器端收到客戶端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當服務器端收到FIN報文時,很可能并不會立即關閉端口,所以只能先回復一個ACK報文,告訴客戶端,你發的FIN報文我收到了。只有等到我服務器端這邊所有的報文都發送完了,我才能發送FIN報文,不能應答和報文一起發送。就像我們雙方通話時,一人說要掛電話,他也會等到對方講話結束,并且對方也同意結束通話是一個道理。

5.2 為什么TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

     答:按道理,四個報文都發送完畢,可以直接進入CLOSE狀態,但是我們要知道,網絡在傳輸數據的過程中也有不穩定的時候,網絡擁擠、堵塞,這都是極有可能發生的事情。這些情況出現的話,最后一個ACK就有可能丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

以上就是小編對三次握手四次揮手的總結,不足之處,大家多多指教哦。





原創文章,作者:Qianzhihe,如若轉載,請注明出處:http://www.www58058.com/86004

(0)
QianzhiheQianzhihe
上一篇 2017-09-02 20:56
下一篇 2017-09-02 21:00

相關推薦

  • 簡述計算機網絡中的物理層

          簡要說明物理層在網絡傳輸中做了哪些工作解決的問題      物理層是計算機網絡OSI模型中最低的一層。物理層規定:為傳輸數據所需要的物理鏈路創建、維持、拆除,而提供具有機械的,電子的,功能的和規范的特性。簡單的說,物理層確保原始的數據比特流可在各種物理媒體上傳輸。使得…

    Linux干貨 2017-05-08
  • N28-第四周:正則表達式練習

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。
    2、編輯/etc/group文件,添加組hadoop。
    3、手動編輯/etc/passwd文件新增一行,添加用戶hadoop,其基本組ID為hadoop組的id號;其家目錄為/home/hadoop。
    4、復制/etc/skel目錄為/home/hadoop,要求修改hadoop目錄的屬組和其它用戶沒有任何訪問權限。
    5、修改/home/hadoop目錄及其內部所有文件的屬主為hadoop,屬組為hadoop。
    6、顯示/proc/meminfo文件中以大寫或小寫S開頭的行;用兩種方式;
    7、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶;
    8、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;
    9、找出/etc/passwd文件中的一位數或兩位數;
    10、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;
    11、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;
    12、打出netstat -tan命令執行結果中以‘LISTEN’,后或跟空白字符結尾的行;
    13、添加用戶bash, testbash, basher, nologin (此一個用戶的shell為/sbin/nologin),而后找出當前系統上其用戶名和默認shell相同的用戶的信息;

    2017-12-24
  • UEFI與GPT(7.3課上作業)

    一、UEFI:統一可擴展固件接口 1、什么是UEFI         統一可擴展固件接口(Unified Extensible Firmware Interface,UEFI)是一種PC系統規格,用來定義操作系統與系統固件之間的軟件界面,作為BIOS的替代方案。UEFI負責加電自…

    Linux干貨 2016-07-12
  • Linux之sed的使用

    sed的工作原理         sed是一種流編輯器以行為單位來處理文本的一款功能十分強大的編輯器,一次只處理一行內容,當處理文本是,將要處理的行放置在模式空間里(緩沖區),接下來sed命令處理模式空間里的內容,處理完成后,把模式空間里處理后的內容送至屏幕打印輸出,接下來處理下…

    Linux干貨 2016-08-09
  • 開篇

    正式開始學習的第一天,了解LINUX,愛上LINUX。希望在往后的日子里越戰越勇!!

    Linux干貨 2017-07-11
  • LVS負載均衡實戰演練

    LVS負載均衡實戰之lvs-nat模型 1.準備好機器,配置好時間同步,配置號網絡,主機名 172.16.251.91 client [橋接] [網關為172.16.251.90] #lvs負載均衡兩塊網卡 172.16.251.90  lvs [網卡1] [橋接] 192.168.42.150  lvs [網卡2] [VMnet8] 192.168.42.…

    Linux干貨 2017-06-22
欧美性久久久久