為面試做准備中。
后面有對ACK機制的詳細講解。
四次揮手比較好解釋。
看一下我的草圖。

ACK表示發來的數據已確認接收無誤。
圖中一個箭頭代表一次揮手。
第一次揮手:
- 主動關閉方:發送一個FIN,表示自己沒有數據要發送了。
第二次揮手:
- 被動關閉方:收到FIN后知道對方不會再有數據傳來。
- 主動關閉方:收到ACK后將進入半關閉狀態,只會發送ACK進行確認,不會發送其他數據。
第三次揮手:
- 被動關閉方:發送一個FIN,表示自己沒有數據要發送了。
第四次揮手:
- 被動關閉方:收到ACK后將進入關閉狀態。
面試過程中除了將上面的講完之外。如何可以、還可以用自己的話講述一遍,這樣子面試官才會知道你是真的理解。
用自己的話講就是:A和B通話,聊到最后A和B說我講完了,B回復說我知道了。但是此時B還沒有講完,所以B又瞎扯了一堆后,B和A說我講完了,A回復說我知道了。此時通信才完全斷開。
這里再科普一下有關知識,大多數三次握手和四次揮手都沒有提到。
發送任何數據、需要接收一個確認對吧。那這個確認是用什么標識的呢。其實還是用的ACK,這個ACK和三次握手四次揮手的ACK都是一回事,都是全大寫的ACK。
也就是說真正的四次揮手其實是這樣子的

主動關閉方:
發送一個FIN的同時還需要帶一個ACK,這個ACK是為了確認被動關閉方所發送的上一條數據的。
可以這樣子理解,FIN數據包和普通的數據包並沒有什么區別好吧,只是將FIN標識位設為1罷了。
ACK : TCP協議規定,只有ACK=1時表示對方數據發送有效,也規定連接建立后所有發送的報文的ACK必須為1
所以說如論你是發送普通數據還是發送四次揮手的數據你都要帶上ACK,用來表示對方發送的信息你此時已經收到哪里了。丟失的那些你不需要確認,你只需要確認你收到哪里了。
總結一下:
大寫ACK可以理解為我收到你發來的數據了。
ACK標志為除了三次握手的第一次握手置為0之外,其他的時候ACK都是置為1的,也就是說我們進行通信的時候ACK的標志位都是被置為1。為什么呢?哪怕傳送失敗了也是置為1嗎?沒錯、傳送失敗了也是置為1、你想想我發送出錯了,你還是需要確認你到底收到哪里了,所以你的ACK還是需要置為1。
這下你理解下面這個四次揮手的含義了吧。

大家要是覺得有收獲的話,麻煩動動手,幫忙點贊,關注。歡迎關注我的公眾號玩編程地碼農

