1. 程式人生 > >簡述TCP的三次握手和四次揮手

簡述TCP的三次握手和四次揮手

三次握手

三次握手的目的是連線伺服器指定埠,建立TCP連線,並同步連線雙方的序列號和確認號,交換TCP視窗大小資訊。在socker程式設計中,客戶端執行connect()時,將觸發三次握手。

第一次握手(SYN=1,seq=x): 客戶端傳送一個TCP的SYN標誌位置1的包,指明客戶端打算連線的伺服器的埠,以及初始序號x,儲存在包頭的序列號(Sequence Number)欄位裡。傳送完畢後,客戶端進入SYN_SEND狀態。

第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1): 伺服器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均為1。伺服器端選擇自己的ISN序列號,放到Seq域裡,同時將確認序號(Acknowledgement Number)設定為客戶端的ISN加1,即x+1。傳送完畢後,伺服器端進入SYN_RCVD狀態。

第三次握手(ACK=1,ACKnum=y+1) 客戶端再次傳送確認包(ACK),SYN標誌位為0,ACK標誌位為1,並且把伺服器發來ACK的序號欄位+1,放在確定欄位中傳送給對方,並且在資料端放寫ISN的+1傳送完畢後,客戶端進入ESTABLISHED狀態,當伺服器端接收到這個包時,也進入ESTABLISHED狀態,TCP握手結束。

(1)第一次握手:客戶端傳送SYN包(SYN=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認。 (2)第二次握手:伺服器收到SYN包,必須確認客戶的SYN(ACK=j+1),同時自己也傳送一個SYN包(SYN=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態。 (3)第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ACK=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。 完成三次握手,客戶端與伺服器開始傳送資料

四次揮手

由於TCP連線是全雙工的,連線的拆除需要傳送四個包,因此稱為“四次揮手”。客戶端或伺服器均可主動發起揮手動作,在socket程式設計中,任何一方執行close()操作即可產生揮手操作。

(1)第一次揮手:客戶端傳送一個FIN,用來關閉客戶到伺服器的資料傳輸。 (2)第二次揮手:伺服器收到這個FIN,他發回一個ACK,確認序號為收到的序號加1。 (3)第三次揮手:伺服器關閉與客戶端的連線,傳送一個FIN給客戶端。 (4)第四次揮手:客戶端發回ACK報文確認,並將確認序號設定為收到序號加1。