LinuxカーネルはIPアドレスに基づいて無料のTCPポートを割り当てますか?

LinuxカーネルはIPアドレスに基づいて無料のTCPポートを割り当てますか?

これは、TCPポートのしくみをよりよく理解するのに役立つ仮想的な質問です。

私のコンピュータに複数のイーサネットカードがあり、異なるサブネットに接続されているとしましょう。ローカルアドレス/ポートをバインドせずにTCPを介してリモートシステムに接続しようとすると、カーネルは自動的にIPアドレスとポートを決定します。

私が理解したように、カーネルはインターフェイスのプライマリIPに基づいてIPアドレスを選択し、インターフェイスはルーティングテーブルに基づいて選択されます。

TCPポート部分の場合、カーネルは未使用(一時)ポートを見つけます。問題は、カーネルがIPアドレスに使用されるTCPポートを予約することです。つまり、すでにポート(インターフェイスAのIPと仮定)を使用していて、パケットがa.b.c.d:12345インターフェイスBから出る必要がある場合は、そのポートe.f.g.h:12345(インターフェイスBのIPと仮定)を使用できますか?

どちらにしても議論を考えることができます。確立されたTCP接続はローカル/リモートIP /ポート4タプルで識別されるため、答えは「yesポートを再利用できます」と思われます12345。ただし、TCP層を準備するとき、カーネルはルーティング情報(つまり、インターフェイス、つまりソースIP)を知らないため、カーネルはTCP層にIP依存の無料TCPポートを割り当てることはできません。 IP階層まで下がります。

カーネル関数inet_csk_get_porthinfo->bhashポート番号のみをハッシュキーとして使用してテーブルをスキャンします。これは、一時ポートがグローバルに一意であることを意味しますか?これが真であれば便利です。ここでいくつかの重要な事実を見逃していますか?誰かがこれを明確にするのに役立つことを願っています。ありがとうございます!

関連情報