首頁  >  問答  >  主體

linux - tcp_tw_reuse 和 tcp_tw_recycle 在原理上有什么区别?

我的理解是,reuse 只会抛弃时间戳后退的 fin 包来,而 recycle 会抛弃所有时间戳后退的包,不止 fin 包,这个理解对不对?

如果对,那么如果遇到了 NAT 后面的多个客户端,reuse 打开的情况下为什么能够正确关闭连接?NAT 后面的多个客户端的时钟不一定一致,fin 包有可能时间戳后退,就被抛弃了。

ringa_leeringa_lee2744 天前1214

全部回覆(1)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 16:05:21

    首先,這個問題你應該發往Stackoverflow的,中文社群裡面大神還是很少,具體的某個點就更少了!
    net.ipv4.tcp_tw_recycle = {0|1} 是否啟用timewait快速回收;注意:開啟此功能在NAT環境下可能會出現嚴重的問題:因為TCP有一種行為,它可以緩存每個連線最新的時間戳,後續請求中如果時間戳小於快取中的時間戳,即被視為無效並丟棄對應的請求封包;Linux是否啟用此行為取決於tcp_timestamptcp_tw_recycle,而前一個參數預設是啟用的,所以啟用後面的參數就會啟動此功能; 因此,如果是NAT環境,安全起見,應該停用tcp_tw_recycle 。另一個解決方案:把tcp_timestamps設為0,tcp_tw_recycle設為1並不會如想像中奏效,因為一旦關閉了tcp_timestamps ,那麼即便打開了tcp_tw_recycle,後面的參數也沒有效果。此時降低net.ipv4.tcp_max_tw_buckets的值就可以顯著降低tw連線的數量了。 net.ipv4.tcp_tw_recycle = {0|1} 是否启用timewait快速回收;注意:开启此功能在NAT环境下可能会出现严重的问题:因为TCP有一种行为,它可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存中的时间戳,即被视为无效并丢弃相应的请求报文;Linux是否启用这种行为取决于tcp_timestamptcp_tw_recycle,而前一个参数默认是启用的,所以启用后面的参数就会激活此功能; 因此,如果是NAT环境,安全起见,应该禁用tcp_tw_recycle。另一种解决方案:把tcp_timestamps设置为0,tcp_tw_recycle设置为1并不会如想象中奏效,因为一旦关闭了tcp_timestamps,那么即便打开了tcp_tw_recycle,后面的参数也没有效果。此时降低net.ipv4.tcp_max_tw_buckets的值就可以显著降低tw连接的数量了。

    net.ipv4.tcp_tw_reuse = {0|1} 是否开启tw重用,即是否允许将TIME-WAIT sockets

    net.ipv4.tcp_tw_reuse = {0|1} 是否開啟tw重複使用,即是否允許將TIME-WAIT sockets 用於新的TCP連接,就是資料結構不會收,只更改一下ip和port就繼續使用,並不是你說的那個功能! 🎜

    回覆
    0
  • 取消回覆