淺談TCP連接的三次握手與四次揮手(2017.08.08修復版)

TCP連接的建立與釋放

三次握手(建立TCP連接)

TCP連接建立有如下幾個目的,首先,要使雙方都知道對方已經準備好了。其次,雙方要協商如最大報文長度、最大窗口長度和服務質量等通信參數。第三,分配和初始化如緩存長度,各狀態變量和連接表中的表項等運輸實體資源。

  • 第一次握手(客戶機向服務器發送請求)
    客戶機進程向服務器進程發送一個SYN報文段(封裝在一個IP數據報中、不包含應用層數據),其首部中的標誌SYN比特位被置爲1,序號字段中會選擇一個起始序號x,即seq=x。

  • 第二次握手(服務器做出請求響應)
    SYN報文段到達服務器後,服務器首先會爲該TCP連接分配TCP緩存和變量,並向該客戶機TCP發送允許連接的報文段(SYNACK報文段、不包含應用層數據)。該報文段首部設置設置了三個重要信息。首先,首部中的標誌SYN和ACK比特位均被置爲1。其次該報文段首部的確認號字段被置爲x+1,即ack=x+1。最後服務器將自己的序號字段設置爲自己的起始序號y,即seq=y。

  • 第三次握手(客戶機向服務器發送應用層數據)
    收到SYNACK報文段後,客戶機爲該連接分配緩存和變量,並向服務器發送第三個報文段,再次對服務器允許連接的報文段進行確認。之後該客戶機將確認號字段ack的值置爲y+1。這樣客戶機就可以發送應用層數據了,序號seq=x+1。標誌SYN比特位被置爲0,標誌ACK比特位被置爲1。
    這裏寫圖片描述
    以三次握手方式管理TCP連接的優缺點:以三次握手方式管理TCP連接可以更好的避免錯誤連接,但是這種協議爲SYN洪泛攻擊提供了可趁之機。在這種攻擊中,攻擊者大量的發送TCP SYN報文段,但有意不進行第三次握手的步驟,直至服務器消耗完爲第一次握手保留的有限資源。(這種攻擊爲Dos攻擊的一種,其目的是使服務器的連接資源迅速的消耗殆盡)。

四次揮手(釋放TCP連接)

  • 第一次揮手(客戶機釋放連接,主機A不再發送數據)
    在數據傳輸結束後,客戶機可以發出一個關閉連接的命令,這會引起客戶機向服務器發送一個特殊的TCP報文段,這個報文段首部中的FIN比特位爲1,起始序號seq=x。

  • 第二次揮手(通知應用進程對方關閉連接)
    在服務器收到該報文段後,就向客戶機回送一個確認報文段,該報文段的ACK比特位置爲1,起始序號seq=y,確認號字段ack=x+1。

  • 第三次揮手(服務器釋放連接,主機B且不再發送數據)
    服務器可以繼續發送它自己的報文段,直至發送最後的報文段並使其FIN比特位置爲1,這時,FIN=1,ACK=1,seq=y,ack=x+1。

  • 第四次揮手(連接關閉)
    客戶機對服務器的終止報文段進行確認(ACK=1,seq=x+1,ack=y+1),所有資源被釋放。
    這裏寫圖片描述
    【修改於2017.08.08(原圖第四次揮手有誤)】之前放上去的圖,最近才發現有問題,錯的圖不刪除了,下面我附上正確的四次揮手的過程圖,方便大家作對比,請見諒:
    這裏寫圖片描述

【增加於2017.08.08】本次修改增加三次握手與四次揮手的狀態示意圖,方便大家對三次握手與四次揮手過程的理解

客戶端狀態示意圖:
這裏寫圖片描述

服務器端狀態示意圖:
這裏寫圖片描述
客戶端在需要請求連接時,向服務器端發送SYN,等收到服務端的ACK確認報文後也向服務器端發送ACK報文,這樣就建立了一個TCP連接。
假若客戶端發起斷開連接的請求(客戶端和服務器都可以請求斷開連接),客戶端會向服務器端發送FIN,也就是告訴服務器端它已經沒有數據要發送了,這時候客戶端會進入FIN_WAIT狀態,這個狀態雖然客戶端不會向服務器發送數據,但是能接收服務器端發過來的數據並回復確認信息,直到收到服務器端發來的FIN,收到FIN後客戶端會回覆ACK報文確認並進入TIME_WAIT狀態同時啓動定時器,如果服務器端沒有收到ACK,在定時器到達一定時間後,客戶端會進行ACK重傳,如果服務器收到ACK,則斷開連接,否則客戶端在等待2MLS(2倍報文最大生存時間)後,沒有收到服務器的重傳請求,客戶端就認爲服務器已經收到ACK,客戶端將關閉自己的連接。

參考文獻:計算機網絡:原理與實踐/陳鳴編著.-北京:高等教育出版社,2013.2:222-234

發佈了29 篇原創文章 · 獲贊 57 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章