TCP為什麼需要三次握手和四次揮手
阿新 • • 發佈:2018-11-22
網上已經有很多解釋了,就不瞎說了,Mark一些連結作為自己的學習筆記吧。
學習參考連結1
學習參考連結2
學習參考連結3
學習參考連結4
為什麼要3次握手
防止已過期的連線請求報文突然又傳送到伺服器,因而產生錯誤。
Client發生一個請求連線報文可能因為網路延遲等原因,沒有送達到server中。但是當這個client的請求報文送達到server時,如果沒有三次握手的話,server就會直接發資料可client,這樣會導致server資源的浪費。
這個問題的本質是, 通道不可靠。
通道不可靠,但是通訊雙發需要就某個問題達成一致. 而要解決這個問題, 無論你在訊息中包含什麼資訊, 三次通訊是理論上的最小值. 所以三次握手不是TCP本身的要求, 而是為了滿足”在不可靠通道上可靠地傳輸資訊”這一需求所導致的. 請注意這裡的本質需求,通道不可靠, 資料傳輸要可靠. 三次達到了, 那後面你想接著握手也好, 發資料也好, 跟進行可靠資訊傳輸的需求就沒關係了. 因此,如果通道是可靠的, 即無論什麼時候發出訊息, 對方一定能收到, 或者你不關心是否要保證對方收到你的訊息, 那就能像UDP那樣直接傳送訊息就可以了.”。
為什麼要4次揮手?
確保資料能夠完成傳輸。
關閉連線時,當收到對方的FIN報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要傳送一些資料給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ACK報文和FIN報文多數情況下都是分開發送的。