1. 程式人生 > 其它 >TCP協議的“三次握手”和“四次揮手”

TCP協議的“三次握手”和“四次揮手”

TCP是面向連線的,無論哪一方向另一方傳送資料之前,都必須先在雙方之間建立一條連線。在TCP/IP協議中,TCP 協議提供可靠的連線服務,連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號 並交換 TCP視窗大小資訊。這就是面試中經常會被問到的TCP三次握手。

以下整理了本協議相關的的具體細節:

1.三次握手:

  1.第一次握手:建立連線。客戶端傳送連線請求報文段,將SYN位置為1,Sequence Number為x;然後,客戶端進入SYN_SEND狀態,等待伺服器的確認;

  2.第二次握手:伺服器收到SYN報文段。伺服器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設定Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要傳送SYN請求資訊,將SYN位置為1,Sequence Number為y;伺服器端將上述所有資訊放到一個報文段(即SYN+ACK報文段)中,一併傳送給客戶端,此時伺服器進入SYN_RECV狀態;

  3.第三次握手:客戶端收到伺服器的SYN+ACK報文段。然後將Acknowledgment Number設定為y+1,向伺服器傳送ACK報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入ESTABLISHED狀態,完成TCP三次握手。
完成了三次握手,客戶端和伺服器端就可以開始傳送資料。以上就是TCP三次握手的總體介紹。

2.四次分手

   當客戶端和伺服器通過三次握手建立了TCP連線以後,當資料傳送完畢,這個時候就要斷開TCP連線的。那對於TCP的斷開連線,這裡就有了神祕的“四次分手”。

   1.第一次分手:主機1(可以使客戶端,也可以是伺服器端),設定Sequence Number和Acknowledgment Number,向主機2傳送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有資料要傳送給主機2了;

   2.第二次分手:主機2收到了主機1傳送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我也沒有資料要傳送了,可以進行關閉連線了;

   3.第三次分手:主機2向主機1傳送FIN報文段,請求關閉連線,同時主機2進入CLOSE_WAIT狀態;

   4.第四次分手:主機1收到主機2傳送的FIN報文段,向主機2傳送ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,就關閉連線;此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,主機1也可以關閉連線了。
   至此,四次分手就完成了。

3.為什仫要進行三次握手?

  1).為了防止伺服器端開啟一些無用的連線增加伺服器開銷以及防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。由於網路傳輸是有延時的(要通過網路光纖和各種中間代理伺服器),在傳輸的過程中,比如客戶端發起了SYN=1建立連線的請求(第一次握手)。如果伺服器端就直接建立了這個連線並返回包含SYN、ACK和Seq等內容的資料包給客戶端,這個資料包因為網路傳輸的原因丟失了,丟失之後客戶端就一直沒有接收到伺服器返回的資料包。客戶端可能設定了一個超時時間,時間到了就關閉了連線建立的請求。再重新發出建立連線的請求,而伺服器端是不知道的,如果沒有第三次握手告訴伺服器端客戶端收的到伺服器端傳輸的資料的話,伺服器端是不知道客戶端有沒有接收到伺服器端返回的資訊的。

  

   這樣沒有給伺服器端一個建立還是關閉連線埠的請求,伺服器端的埠就一直開著,等到客戶端因超時重新發出請求時,伺服器就會重新開啟一個埠連線。那麼伺服器端上沒有接收到請求資料的上一個埠就一直開著,長此以往,這樣的埠多了,就會造成伺服器端開銷的嚴重浪費。

   2).還有一種情況是已經失效的客戶端發出的請求資訊,由於某種原因傳輸到了伺服器端,伺服器端以為是客戶端發出的有效請求,接收後產生錯誤。所以我們需要“第三次握手”來確認這個過程,讓客戶端和伺服器端能夠及時地察覺到因為網路等一些問題導致的連線建立失敗,這樣伺服器端的埠就可以關閉了不用一直等待。也可以這樣理解:“第三次握手”是客戶端向伺服器端傳送資料,這個資料就是要告訴伺服器,客戶端有沒有收到伺服器“第二次握手”時傳過去的資料。若傳送的這個資料是“收到了”的資訊,接收後伺服器就正常建立TCP連線,否則建立TCP連線失敗,伺服器關閉連線埠。由此減少伺服器開銷和接收到失效請求發生的錯誤。

4.為什麼要四次分手

   由於TCP協議是一種面向連線的、可靠的、基於位元組流的運輸層通訊協議。TCP是全雙工 模式,這就意味著,當主機1發出FIN報文段時,只是表示主機1已經沒有資料要傳送了,主機1告訴主機2, 它的資料已經全部發送完畢了;但是,這個時候主機1還是可以接受來自主機2的資料;當主機2返回ACK報文 段時,表示它已經知道主機1沒有資料傳送了,但是主機2還是可以傳送資料到主機1的;當主機2也傳送了FIN 報文段時,這個時候就表示主機2也沒有資料要傳送了,就會告訴主機1,我也沒有資料要傳送了,之後彼此 就會愉快的中斷這次TCP連線。