次のようにTCPソケットを作成します。
_socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
_socket.ConfigureKeepAlive(true, 5000, 1000);
Dockerコンテナを使用するとConfigureKeepAlive()
実行されませんが、これはソケットがどれだけ長く開いているかわからないことを意味します。ソースコードを見ると、ConfigureKeepAlive()
次のようになります。
socket.IOControl(IOControlCode.KeepAliveValues, keepAliveValues, null);
このコードを理解できません。 TCPソケットのデフォルトのKeepAlive値とは何か、変数からその値を読み取る方法を説明できる人はいますか_socket
?
事前にありがとう
PS1:このプラットフォーム情報は参考用です。
Environment.OSVersion {Unix 5.10.102.1} System.OperatingSystem
編集する:Ps2.:参考のためにDockerコンテナに対応するいくつかの情報を提供します。
# uname -a
Linux 0be4318feadd 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 GNU/Linux
# cd /proc/sys/net/ipv4
# cat tcp_keepalive_time
7200
# cat tcp_keepalive_probes
9
# cat tcp_keepalive_intvl
75
tcp_keepalive_time
2時間以内のDockerコンテナが±5分後に切断されているように見えるのはなぜですか?
答え1
デフォルトはオペレーティングシステムによって異なります。
私が知る限り、ほとんどのオペレーティングシステムはデフォルトでゼロ値に対応する接続の維持を無効にします。
通常、接続が長期間維持されることが予想され、パケットが送信されない場合は、接続が中断される可能性がある場合(たとえば、ステートフルファイアウォールやオンデマンド接続など)にのみ接続維持を有効にします。