
そこで、ネットワークの先生と議論になりました。先生は、ルーターの NAT テーブルに多数のエントリがあるためにルーターがクラッシュすると苦情を言う人がいると言いました。
私は理解できなかったので、「アプリケーションが同じポートを使用する場合、なぜルーターがクラッシュするのですか? エントリは 1 つだけ (pc-ip、pcport、public-ip、public-port) である必要があります」と質問しました。すると彼は、「同じポートを使用していても問題ありません」と言いました。
NAT は通過するパケットごとにエントリを作成するという考えが浮かびました。ご想像のとおり、私はオーバーロードのある NAT を想定しています。
質問は次のとおりです:
NAT エントリはどのように作成されますか? パケット ベースですか、それとも接続ベースですか? つまり、UDP パケットを送信すると、ルータはエントリを作成しますか?
TCP 接続を開始すると、ルータは接続が閉じられるまで永続的な NAT エントリを作成しますか?
先生の言う通りでしたか? 同じポート上のアプリケーションがパケットを送信すると、NAT テーブルが過負荷になる可能性がありますか?
前もって感謝します。
答え1
- 接続ごと(またはUDPストリームごと)
- はい
- はい。たとえば、1 台の社内 PC 上の Web ブラウザは、複数の異なる外部 Web サーバーのそれぞれに対して同時に複数の TCP 接続を開くことができます。接続ごとに送信元ポートは異なります (ランダムに選択されます) が、宛先ポートと宛先 IP アドレスは複数の接続で同じである可能性があります。家庭内の 2 台または 3 台のコンピューターのニーズに対応するように設計されたルーターは、(たとえば) 非常にビジーなコンピューターが数百台ある学校で必要な同時接続数に対応できない可能性があります。ルーターは、予想される負荷に合わせてサイズを設定する必要があります。
見てみるとTCPクライアントのCソースの例で説明されている方法すると、「ソケット」API では、接続を開始するクライアントが送信元ポートを指定する手段が提供されていないことがわかります。