私の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接続を維持し、接続を作成します。その後、この接続を追跡するようにWiresharkを設定しました。出力スクリーンショットは次のとおりです。
予想される2時間(「tcp_keepalive_time」値)の7200秒後に、最初のコネクション保持パケットが送信されることがわかります。しかし、各プローブが75秒(「tcp_keepalive_intvl」値)で送信されることを望みましたが、各プローブが2時間以内に送信されることを確認しました。
誰かが私の "tcp_keepalive_intvl"設定オプションが尊重されない理由を教えてもらえますか?
修正する
keep-alive時間よりも大きいkeep-alive間隔を指定すると、間隔が順守されるようです。
答え1
非常にスマートな同僚と議論した結果、問題を特定したと思いますが、まだ証明していません。何が起こるかは、接続保持ACKが受信されていない場合にのみ接続維持間隔が考慮されることです。したがって、2時間後に最初のコネクション保持パケットのACKが受信されない場合、75秒後に2番目のパケットが送信され、ACKが受信されるまで75秒間隔で繰り返されます。
間隔が接続保持時間より大きい場合にのみ、間隔が考慮されることがわかりました。これは、前述のように、Linux接続維持メカニズムがどのように機能するかによるものです。私の他の質問。
答え2
実際、文書:
tcp_keepalive_time
最後に送信されたパケット(単純なACKはデータとは見なされません)と最初の接続保持プローブとの間の間隔は、接続を維持する必要があるとマークされた後は使用されなくなります。
tcp_keepalive_intvl
同時に交換された接続に関係なく、後続のKeepaliveプローブ間の間隔
tcp_keepalive_probes
接続が切断されたと見なし、アプリケーション層に通知する前に送信する未承認プローブの数