複製鏈接
請複製以下鏈接發送給好友

三次握手

鎖定
所謂的“三次握手”:為了對每次發送的數據量進行跟蹤與協商,確保數據段的發送和接收同步,根據所接收到的數據量而確認數據發送、接收完畢後何時撤消聯繫,並建立虛連接。 [1] 
為了提供可靠的傳送,TCP在發送新的數據之前,以特定的順序將數據包的序號,並需要這些包傳送給目標機之後的確認消息。TCP總是用來發送大批量的數據。當應用程序在收到數據後要做出確認時也要用到TCP。 [1] 
中文名
三次握手
外文名
Three-way handshake
別    名
TCP握手協議
適用領域
計算機
應用學科
計算機傳輸協議

三次握手簡介

三次握手 三次握手
為了建立連接TCP連接,通信雙方必須從對方瞭解如下信息: [2] 
1、對方報文發送的開始序號。 [2] 
2、對方發送數據的緩衝區大小。 [2] 
3、能被接收的最大報文段長度MSS。 [2] 
4、被支持的TCP選項。 [2] 
在TCP協議中,通信雙方將通過三次TCP報文實現對以上信息的瞭解,並在此基礎上建立一個TCP連接,而通信雙方的三次TCP報文段的交換過程,也就是通常所説的TCP連接建立實現的三次握手(Three-Way Handshake)過程。 [2] 
當連接建立完成之後,則: [2] 
1、TCP連接的通信雙方均可知道連接上對方將被髮送的第一個字節的序列號(發給對方的確認號,A發給B的確認號就是B將發送的序列號,同樣B也是); [2] 
2、雙方均可知道連接上能發送的MSS,從而即可選取握手階段雙方交換的SYN報文和SYN+ACK報文中MSS選項中較小的值作為實際值; [2] 
3、雙方均可知道對方的接收緩衝區大小; [2] 
4、雙方均可知道對方能否使用SACK、窗口縮放等選項。 [2] 
基於這些信息,雙方即可建立一個TCP連接(x,y)並基於該連接開始報文段的傳輸。 [2] 
採用三次握手法建立TCP連接,如果有兩台主機同時企圖在同樣的套接字之間建立一個連接,則結果將只有一個連接被建立起來(這兩個連接被看作完全相同,即為同一個連接),因為所有的連接都是由它們的端點來標識的。若第一個請求導致建立了一個由(x,y)標識的連接,而第二個請求也建立了一個由(X,y)標識的連接,則在TCP實體內部只會存在一個TCP連接表項(x,y)。 [2] 

三次握手過程

三次握手第一次

第一次握手:建立連接時,客户端發送syn包(seq=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。 [3] 

三次握手第二次

第二次握手:服務器收到syn包,必須確認客户端的SYN(ack=j+1),同時自己也發送一個SYN包(seq=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態。 [3] 

三次握手第三次

第三次握手:客户端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客户端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。 [3] 
完成三次握手,客户端與服務器開始傳送數據,在上述過程中,還有一些重要的概念: [3] 
(1)未連接隊列
三次握手協議中,服務器維護一個未連接隊列,該隊列為每個客户端的SYN包(seq=j)開設一個條目,該條目表明服務器已收到SYN包,並向客户發出確認,正在等待客户的確認包。這些條目所標識的連接在服務器處於 Syn_RECV狀態,當服務器收到客户的確認包時,刪除該條目,服務器進入ESTABLISHED狀態。 [3] 
(2)Backlog參數
三次握手協議 三次握手協議
表示內核為相應套接字排隊的最大連接個數。SYN-ACK重傳次數服務器發送完SYN-ACK包,如果未收到客户確認包,服務器進行首次重傳,等待一段時間仍未收到客户確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。注意,每次重傳等待的時間不一定相同。 [3] 
(3)半連接存活時間
是指半連接隊列的條目存活的最長時間,也即服務器從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間為Timeout時間、SYN_RECV存活時間。 [3] 

三次握手四次揮手

對於一個已經建立的連接,TCP使用改進的四次揮手來釋放連接(使用一個帶有FIN附加標記的報文段)。TCP關閉連接的步驟如下: [4] 
第一步,當主機A的應用程序通知TCP數據已經發送完畢時,TCP向主機B發送一個帶有FIN附加標記的報文段(FIN表示英文finish)。 [4] 
第二步,主機B收到這個FIN報文段之後,並不立即用FIN報文段回覆主機A,而是先向主機A發送一個確認序號ACK,同時通知自己相應的應用程序:對方要求關閉連接(先發送ACK的目的是為了防止在這段時間內,對方重傳FIN報文段)。 [4] 
第三步,主機B的應用程序告訴TCP:我要徹底的關閉連接,TCP向主機A送一個FIN報文段。 [4] 
第四步,主機A收到這個FIN報文段後,向主機B發送一個ACK表示連接徹底釋放。 [4] 
參考資料
  • 1.    温子祺等編著.51單片機C語言創新教程:北京航空航天大學出版社,2011.04:第328頁
  • 2.    王雷,魏煥新,聶清彬主編;匡林愛,周維副主編.計算機網絡原理基礎教程:北京理工大學出版社,2016.02:第120頁
  • 3.    龐淑英主編.網絡信息安全技術基礎與應用:冶金工業出版社,2009.03:第128頁
  • 4.    王羣.計算機網絡教程:清華大學出版社,2005