所謂的三次握手的作用:是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立
官方解釋:
第一次握手:建立連接,客戶端發送syn包到服務器,並進入syn_send狀態,等待服務器的確認
第二次握手:服務端收到syn包,同時自己也發送一個syn包(syn+ack),並且服務器進入syn_recv狀態
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ack,此包發送完畢,客戶端和服務器進入ESTABLISHED 狀態,完成三次握手
過度解釋:
客戶端發送連接請求消息到服務端,服務端收到請求消息后知道自己與客戶端可以連接成功,但是客戶端不知道服務端是否接受到自己的請求。因此服務端需要給客戶端發送一個消息。當客戶端接受到服務端的消息后,確認自己與服務端可以進行連接。這個時候客戶端需要再次給服務端發送一個請求,因為如果此時客戶端沒有進行任何請求操作的話,服務器會一直等待客戶端的請求,這樣會造成資源的浪費。其實第三次握手的主要作用是為了防止已經失效的請求報文又突然傳遞到了服務端,因此造成錯誤的產生
大白話解釋:
男孩:我們可以戀愛嗎?(客戶端請求服務器建立連接)
女孩:你想追我?想清楚了!(服務器要求客戶端確認連接)
男孩:沒錯,你就是我的夢中情人!(客戶端確認連接)
二、TCP的四次揮手
所謂四次揮手的作用:即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開
官方解釋:
第一次揮手:客戶端發送一個FIN,用來關閉客戶端到服務端的數據傳送,客戶端進入FIN_WAIT_1狀態。
第二次揮手:服務端收到FIN后,發送一個ACK給客戶端,確認序號為收到序號+1,服務端進入CLOSE_WAIT狀態。
第三次揮手:服務端發送一個FIN,用來關閉服務端到客戶端的數據傳送,Server進入LAST_ACK狀態。
第四次揮手:客戶端收到FIN后,客戶端進入TIME_WAIT狀態,接着發送一個ACK給服務端,確認序號為收到序號+1,服務端進入CLOSED狀態,完成四次揮手。
過度解釋:
客戶端向服務器發送消息,告訴服務器需要斷開連接,此時客戶端已經不能向服務端發送消息,服務端接收到客戶端的消息后,還可以繼續向客戶端發送消息,這里只說告訴客戶端我收到了你的關閉請求。當服務端的響應數據完成后,在次告訴客戶端我這邊也要關閉請求了,這時服務端已經不能向客戶端發送數據了,客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)
大白話解釋:
男:“我覺得我們可能不太合適,我們分手吧,我不想和你聯系了。”(發出關閉連接的請求) 女:“你要分手,可以,但是我有些話想跟你說,說完后如果你想分手就分手吧?”(發出ACK報文段) (此后男生不會再主動聯系女生,而女生還會聯系男生) 女:“我要說的話已經說完了,咱們好聚好散吧。渣男再見!”(發送關閉連接的報文段) 男:“再見。”(發出ACK報文段,讓女生知道我已經收到了)
為什么客戶度還需要等待2秒
TCP允許不同的實現可以設置不同的MSL值。 第一,保證客戶端發送的最后一個ACK報文能夠到達服務器,因為這個ACK報文可能丟失,站在服務器的角度看來,我已經發送了FIN+ACK報文請求斷開了,客戶端還沒有給我回應,應該是我發送的請求斷開報文它沒有收到,於是服務器又會重新發送一次,而客戶端就能在這個2MSL時間段內收到這個重傳的報文,接着給出回應報文,並且會重啟2MSL計時器