【網路】TCP三次握手建立連線和四次揮手釋放連結
TCP協議
TCP報文格式
TCP建立連線的過程
(1)Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Server確認。
(2)Server收到資料包後由標誌位SYN=1知道Client請求建立連線,Server將標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該資料包傳送給Client以確認連線請求,Server進入SYN_RCVD狀態。
(3)Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該資料包傳送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸資料了。
TCP斷開連線的過程
(1)Client傳送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀態。
(2)Server收到FIN後,傳送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
(3)Server傳送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK狀態。
(4)Client收到FIN後,Client進入TIME_WAIT狀態,接著傳送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。
TCP為什麼三次握手建立連線而需要四次揮手斷開連線
因為當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。
主動斷開的一方進入TIME_WAIT狀態的原因
我們知道,TCP連結終止的時候需要四次揮手。
當主動斷開的一方A收到被動一方B的第三次揮手FIN報文後,A會發送第四次揮手的ACK報文。
此刻,A便啟動時間等待計時器
(1)為了保證客戶端傳送的最後一個ACK報文段能夠到達伺服器。因為這個ACK有可能丟失,從而導致處在LAST-ACK狀態的伺服器收不到對FIN-ACK的確認報文。伺服器會超時重傳這個FIN-ACK,接著客戶端再重傳一次確認,重新啟動時間等待計時器。最後客戶端和伺服器都能正常的關閉。假設客戶端不等待2MSL,而是在傳送完ACK之後直接釋放關閉,一但這個ACK丟失的話,伺服器就無法正常的進入關閉連線狀態。
(2)他還可以防止已失效的報文段。客戶端在傳送最後一個ACK之後,再經過經過2MSL,就可以使本連結持續時間內所產生的所有報文段都從網路中消失。從保證在關閉連線後不會有還在網路中滯留的報文段去騷擾伺服器。