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