1. ホーム
  2. sockets

[解決済み] TCPオプションSO_LINGER(0)はいつ必要ですか?

2022-11-16 23:19:07

質問

オプションの正式な意味は理解しているつもりです。今、私が扱っているいくつかのレガシーコードで、このオプションが使用されています。顧客は、顧客側からの接続終了時に、顧客側からのFINに対する応答としてRSTについて不満を述べています。

私は、それがいつ使用されるべきかを理解していないので、安全にそれを削除できるかどうかわからない。

このオプションが必要とされる場合の例を教えてください。

どのように解決するのですか?

を設定する典型的な理由は SO_LINGER のタイムアウトをゼロにする典型的な理由は、大量のコネクションが TIME_WAIT 状態になり、サーバーの利用可能なリソースをすべて使い果たしてしまうことを避けるためです。

TCP 接続がきれいに閉じられると、クローズを開始した側 ("active close") は、接続を終了して TIME_WAIT で数分間待機することになります。 そのため、もしあなたのプロトコルが サーバ が接続の終了を開始し、非常に多くの短命の接続を含むプロトコルである場合、この問題の影響を受ける可能性があります。

これは良いアイデアではありません。 TIME_WAIT が存在するのには理由があります (古い接続からの浮遊パケットが新しい接続に干渉しないことを保証するため)。 可能であれば、クライアントが接続の終了を開始するようなプロトコルに再設計する方がよいでしょう。