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