Tcp
不遵守 TCP 保持活動參數
我在我的 Linux 機器上執行了一台伺服器,也執行了以下命令:
$ cat /proc/sys/net/ipv4/tcp_keepalive_time 7200 $ cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75 $ cat /proc/sys/net/ipv4/tcp_keepalive_probes 9
我的伺服器偵聽埠 58080,並在我的程式碼中設置 TCP keep-alive 在其上創建連接。然後我設置 Wireshark 跟踪這個連接;輸出的螢幕截圖如下所示:
您可以看到第一個 keep-alive 數據包在 7200 秒後發送,即預期的 2 小時(’tcp_keepalive_time’ 的值)。但是我也希望每個探測都在 75 秒內發送(’tcp_keepalive_intvl’ 的值);我看到的是,每個探測都是在 2 小時內發送的。
有人能告訴我為什麼我的 ’tcp_keepalive_intvl’ 配置選項沒有得到尊重嗎?
更新
似乎指定一個大於保持活動時間的保持活動間隔會導致間隔時間被遵守……
在與一位超級聰明的同事討論之後,我們認為我們已經弄清楚出了什麼問題,但還沒有證明這一點。可能發生的情況是,只有在沒有接收到 keep-alive ACK 時才考慮 keep-alive 間隔。因此,在 2 小時後,如果沒有收到對第一個保活數據包的 ACK,則將在 75 秒後發送第二個數據包,並以 75 秒的間隔重複發送,直到收到 ACK。
事實證明,僅當間隔大於保持活動時間時才考慮間隔的原因是由於 Linux 保持活動機制的工作方式,如我在另一個問題中所述。