1. 程式人生 > >Tcp協議三次握手四次揮手

Tcp協議三次握手四次揮手

blog 可靠的 協議 smis 客戶端 finish 協議號 time 徹底

一、什麽是TCP

  TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接(連接導向)的、可靠的、 基於IP的傳輸層協議。TCP在IP報文的協議號是6。 

 

二、什麽是TCP鏈接  

  為了提供可靠的傳送,TCP在發送新的數據之前,以特定的順序將數據包的序號,並需要這些包傳送給目標機之後的確認消息。

  TCP總是用來發送大批量的數據。當應用程序在收到數據後要做出確認時也要用到TCP。  

  當我們向服務器發送HTTP請求,獲取數據、修改信息時,都需要建立TCP連接,包括三次握手,四次分手。   

三、建立鏈接

  TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接 (也就是說三次握手之後才能夠進行TCP的正式鏈接)  

(1)三次握手

    三次握手(three times handshake;three-way handshake)所謂的“三次握手”即對每次發送的數據量是怎樣跟蹤進行協商使數據段的發送和接收同步,

    根據所接收到的數據量而確定的數據確認數及數據發送、接收完畢後何時撤消聯系,並建立虛連接。

  第1次

    建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。   第2次     服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;   第3次
    客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,     完成三次握手。

技術分享圖片

  TCP標誌位,有6種標示:

    SYN(synchronous建立聯機)  ACK(acknowledgement 確認)  PSH(push傳送)

    FIN(finish結束)  RST(reset重置)  URG(urgent緊急)

    Sequence number(順序號碼) Acknowledge number(確認號碼)

  完成了三次握手,客戶端和服務器端就可以開始傳送數據。以上就是TCP三次握手的總體介紹。

(2)四次揮手

  對於一個已經建立的連接,TCP使用改進的三次握手來釋放連接(使用一個帶有FIN附加標記的報文段)

  第1步

    當主機A的應用程序通知TCP數據已經發送完畢時,TCP向主機B發送一個帶有FIN附加標記的報文段(FIN表示英文finish)。

  第2步     主機B收到這個FIN報文段之後,並不立即用FIN報文段回復主機A,而是先向主機A發送一個確認序號ACK,     同時通知自己相應的應用程序:對方要求關閉連接(先發送ACK的目的是為了防止在這段時間內,對方重傳FIN報文段)。   第3步       主機B的應用程序告訴TCP:我要徹底的關閉連接,TCP向主機A送一個FIN報文段。   第4步     主機A收到這個FIN報文段後,向主機B發送一個ACK表示連接徹底釋放。   至此,四次分手的流程就結束了。      1、為什麽要3次握手?    

    在謝希仁的《計算機網絡》中是這樣說的:

    為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。

    例子如下:

      "已失效的連接請求報文段”的產生在這樣一種情況下:client發出的第一個連接請求報文段並沒有丟失,而是在某個網絡結點長時間的滯留了,

      以致延誤到連接釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。

      但server收到此失效的連接請求報文段後,就誤認為是client再次發出的一個新的連接請求。

      於是就向client發出確認報文段,同意建立連接。假設不采用“三次握手”,那麽只要server發出確認,新的連接就建立了。

      由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。

      但server卻以為新的運輸連接已經建立,並一直等待client發來數據。

      這樣,server的很多資源就白白浪費掉了。采用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。

      server由於收不到確認,就知道client並沒有要求建立連接。"

  2、為什麽要4次揮手?

    TCP協議是一種面向連接的、可靠的、基於字節流的運輸層通信協議。TCP是全雙工模式,

    這就意味著,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2, 它的數據已經全部發送完畢了;

    但是,這個時候主機1還是可以接受來自主機2的數據;當主機2返回ACK報文段時,表示它已經知道主機1沒有數據發送了,

    但是,主機2還是可以發送數據到主機1的;當主機2也發送了FIN 報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,

    之後彼此 就會愉快的中斷這次TCP連接。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態變化。

參考:http://network.51cto.com/art/201411/456783.htm

Tcp協議三次握手四次揮手