Azureロードバランサーで奇妙な動作をデバッグしているときに、ローカルのDebian Stretch TCPスタックが偶数番号のポートとのTCP接続を確立するだけでした。奇数の送信元ポートで単一のTCPハンドシェイクを開始しません。それは意図されていますか?
connect()
とbind()
の間の競合を減らすためです(Linux 4.2で表示され、Jessieには3.16、Stretchには4.9があります)。
コミット 7f4c90062f8fc7c8c26f8f95324cbe8fa3145a5 著者:エリックドゥマゼット 日付:日5月24日14:49:35 2015 -0700 tcp/dccp:connect() でip_local_port_rangeを使い切らないようにしてください。使用中のサーバーでの長期にわたる問題は、使用可能な小さなTCPポート 範囲(/ proc/sys/net/ipv4/ip_local_port_range)およびデフォルト connect()システム呼び出しでの送信元ポートの順次割り当て。 ホストに多数のアクティブなTCPセッション、可能性が非常に高い すべてのポートが少なくとも1つのフローで使用されている とその後のbind(0)試行が失敗する、または[の大部分をスキャンする必要がある____。]スペースを見つけてスロットを見つけます。 このパッチでは、__ inet_hash_connect() の開始点を変更して、[1]ポートでさえ優先して、 bind() ユーザー用の奇数ポート。 引き続き順次検索を実行するため、保証はありません。しかし connect()ターゲットが大きく異なる場合、最終的には、bind()に使用できるポートを より多く残し、それらを範囲全体に分散させます。 スロットを見つけるためにconnect()とbind()の両方。 この戦略は、/ proc/sys/net/ipv4/ip_local_port_range が偶数の場合、つまりstart/end値のパリティが異なります。 したがって、デフォルトの/ proc/sys/net/ipv4/ip_local_port_rangeは 32768-60999(32768-61000ではなく)[に変更されました。 ____。] ここではセキュリティの側面に変更はありません。この変更によって最終的に影響を受ける可能性があるのは、一部の不十分なハッシュ スキームのみです。 [1]:奇数/偶数プロパティは、ip_local_port_rangeの値に依存します。パリティ
フォローアップ commit 1580ab63fc9a03593072cc5656167a75c4f1d17 もご覧ください。