三報文握手是指為了對每次發送的資料量進行追蹤與協商,確保資料段的發送和接收同步,根據所接收到的資料量而確認資料發送、接收完畢後何時撤銷聯繫,並建立虛擬連結。
所謂的「三次握手」:為了對每次發送的資料量進行追蹤與協商,確保資料段的發送和接收同步,根據所接收到的資料量而確認資料發送、接收完畢後何時撤銷聯繫,並建立虛擬連線。
為了提供可靠的傳送,TCP在發送新的資料之前,以特定的順序將資料包的序號,並需要這些包傳送給目標機之後的確認訊息。 TCP總是用來發送大批量的資料。當應用程式在收到資料後要做出確認時也要用到TCP。
為了建立連接TCP連接,通訊雙方必須從對方了解以下訊息:
三握手
1、對方訊息傳送的開始序號。
2、對方傳送資料的緩衝區大小。
3、能被接收的最大封包段長度MSS。
4、支援的TCP選項。
在TCP協定中,通訊雙方將透過三次TCP報文段彭對以上資訊的了解,並在此基礎上建立一個TCP連接,而通訊雙方的三次TCP報文段的交換過程,也就是通常所說的TCP連結建立實現的三次握手(Three-Way Handshake)過程。
當連線建立完成之後,則:
1、TCP連線的通訊雙方皆可知道連線上對方將被傳送的第一位元組的序號(發給對方的確認號,A發給B的確認號就是B將發送的序號,同樣B也是);
2、雙方均可知道連接上能發送的MSS,從而即可選取握手階段雙方交換的SYN封包與SYN ACK封包中MSS選項中較小的值作為實際值;
3、雙方皆可知道對方的接收緩衝區大小;
4、雙方均可知道對方能否使用SACK、視窗縮放等選項。
基於這些訊息,雙方即可建立一個TCP連線(x,y)並基於該連線開始封包的傳輸。
採用三次握手法建立TCP連接,如果有兩台主機同時企圖在同樣的套接字之間建立一個連接,則結果將只有一個連接被建立起來(這兩個連接被看作完全相同,即為同一個連接),因為所有的連接都是由它們的端點來標識的。若第一個請求導致建立了一個由(x,y)標識的連接,而第二個請求也建立了一個由(X,y)標識的連接,則在TCP實體內部只會存在一個TCP連接表項(x,y)。
過程
第一次
第一次握手:建立連線時,客戶端發送syn套件(seq=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN:同步序號(Synchronize Sequence Numbers)。
第二次
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j 1),同時自己也發送一個SYN包(seq=k) ,即SYN ACK包,此時伺服器進入SYN_RECV狀態。
第三次
第三次握手:客戶端收到伺服器的SYN ACK包,向伺服器發送確認包ACK(ack=k 1),此包發送完畢,客戶端和伺服器進入ESTABLISHED(TCP連線成功)狀態,完成三次握手。
完成三次握手,客戶端與伺服器開始傳送數據,在上述過程中,還有一些重要的概念:
(1)未連接佇列
在三次握手協定中,伺服器維護一個未連接佇列,該佇列為每個客戶端的SYN包(seq=j)開設一個條目,該條目表示伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連線在伺服器處於 Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。
(2)Backlog參數
表示核心為對應套接字排隊的最大連接個數。 SYN-ACK重傳次數伺服器寄完SYN-ACK包,若未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,若重傳次數超過系統規定的最大重傳次數,系統將該連接資訊從半連接佇列中刪除。注意,每次重傳等待的時間不一定相同。
(3)半連線存活時間
是指半連線佇列的項目存活的最長時間,也也就是伺服器從收到SYN套件到確認這個訊息無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間為Timeout時間、SYN_RECV存活時間。
以上是三報文握手指什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!