爲何tcp timewait需要2MSL

借用一張圖(https://blog.csdn.net/xp178171640/article/details/103855714
爲何tcp timewait需要2MSL

tcp time_wait等待2MSL有兩個原因
1:如果最後一個ACK丟失,對端需要重傳FIN,如果直接是CLOSED的狀態,那對於重傳的FIN,肯定是RST響應
2:爲了保證最後一個ACK正常的丟失,因爲不確認對方是否收到,需要等1個MSL,至於另一個MSL,能找到比較信服的解釋就是被動關閉的一方在收到ACK的那一刻之前重發了FIN,爲了保證這個FIN正常丟失,需要再等1個MSL(https://cloud.tencent.com/developer/article/1450264, https://www.zhihu.com/question/67013338)
3:CentOS7.6內核中TIMEWAIT的定義是60s 定義如下


#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
                                                                  * state, about 60 seconds */

4:TCP RFC793規定MSL爲2分鐘,實際Linux定義的是30S,至於爲何MSL是30S,這個應該是個經驗值,TCP頭部的SEQ是32位,對於一個連接,如果SEQ翻轉,前後會出現SEQ相同的報文並且前一個沒有被處理,可能導致收包異常,因此2**32-1 個字節傳輸的時間應該大於MSL,千兆網絡下,2**32-1 個字節傳輸的時間的極限傳輸時間大概34S(https://tools.ietf.org/html/rfc1185), MSL只是一個名詞,並不控制報文的生命週期,實際控制一個報文的時間是有IP頭部的TTL跳數來控制,兩者單位上並沒有實際的關聯,但MSL的經驗值應該是參考了TTL

參考:
http://www.masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch02lev1sec7.html
https://www.zhuxiaodong.net/2018/tcp-time-wait-instruction/
https://www.cnblogs.com/rexcheny/p/11143128.html
https://networkengineering.stackexchange.com/questions/68468/is-tcps-msl-value-equivalent-to-ips-ttl-value



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章