淺談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

相關推薦

  • Linux sed命令詳則

    sed命令 sed是一種流編輯器,它是文本處理中非常好的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前的行儲存在臨時緩存區中,稱為“模式空間”(pattern space),接著用sed命令處理緩存區中的內容,處理完成后,把緩存區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed…

    2017-08-11
  • 2016-10-17練習題

    1 生產環境發現一臺服務器系統時間產生偏差,造成服務異常,請幫忙校正。 linux系統查看當前時間命令為date [root@Shining pirate]# date Mon Oct 17 20:50:42 CST 2016 修改系統時間選項為-s 格式為 只修改系統的日期,不修改時間 …

    Linux干貨 2016-10-17
  • Linux-運維之半自動化安裝系統

    CentOS系統安裝             系統啟動流程: bootloader–>kernel(initramfs)–>rootfs–>/sbin/init 安裝程序啟動過程:         &nbs…

    2017-07-24
  • 磁盤管理之MBR與GPT分區

    磁盤管理之MBR與GPT分區 2016-08-26 zanghonglei%1 $ S 磁盤管理之MBR與GPT分區 linux下的文件分為常規文件和設備文件,常規文件一定在某一個設備上被存儲,不論這個設備是真實的還是虛擬的,這里的設備是linux中vfs層中的設備,也就是設備文件中的設備,vfs層的設備分為字符設備和塊設備,字符設備可以類比為一個…

    Linux干貨 2016-08-29
  • Linux基礎之正則表達式

    正則表示式語法及在grep命令中的引用

    2017-09-09
  • 壓縮和解壓縮總結

                      壓縮和解壓縮的命令很多,今天總結如下: gzip  壓縮比1–9  默認是6  壓縮比越高  耗費CPU資源也多,文件比較小的話,不建議使用gzip壓縮,因為使用gzip越壓縮越大。…

    Linux干貨 2017-04-17
欧美性久久久久