三次握手
第一次握手:客戶端A將標志位SYN置為1,隨機產生一個值為seq=J(J的取值范圍為=1234567)的數據包到服務器,客戶端A進入SYN_SENT狀態,等待服務端B確認;
第二次握手:服務端B收到數據包后由標志位SYN=1知道客戶端A請求建立連接,服務端B將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,并將該數據包發送給客戶端A以確認連接請求,服務端B進入SYN_RCVD狀態。
第三次握手:客戶端A收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,并將該數據包發送給服務端B,服務端B檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,客戶端A和服務端B進入ESTABLISHED狀態,完成三次握手,隨后客戶端A與服務端B之間可以開始傳輸數據了。
image.png
- 三次握手原因:為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤,如以下情況:client發出的第一個連接請求報文段并沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段后,就誤認為是client再次發出的一個新的連接請求。于是就向client發出確認報文段,同意建立連接。假設不采用“三次握手”,那么只要server發出確認,新的連接就建立了。由于現在client并沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。但server卻以為新的運輸連接已經建立,并一直等待client發來數據。這樣,server的很多資源就白白浪費掉了。采用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由于收不到確認,就知道client并沒有要求建立連接。”。主要目的防止server端一直等待,浪費資源。
四次揮手
第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。
第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。
image.png