まず、TCP/IP 接続は、2 台のコンピューターを一時的に接続する細い線ではありません。結局のところ、TCP/IP と UDP はどちらも単なる一連のパケットです。IP パケットを正しい順序に戻すことで、接続が確立されているふりをするのはオペレーティング システムです。
あなたの質問に戻りましょう。問題は実際には HTTP 固有のものではないことに注意してください。これらはすべて TCP/IP レイヤーで機能します。ポール192.168.0.100
とジョンには192.168.0.101
内部 IP アドレスがあり、NAT にはパブリック1.2.3.4
アドレスがあるとします。Paul がサーバーに接続するとき、彼の OS は192.168.0.100:54321
アドレスを使用します (ポートは OS によってランダムに選択されます)。このリクエストは、そのアドレスを記憶し、リクエストを外部サーバーに転送する NAT にヒットします。外部サーバーは、ユーザーがNAT 1.2.3.4:4321
の背後にいるため (別のポートに注意してください)、内部 IP が表示されないことを確認します。
外部サーバー (Web サーバーとする) が応答を送信すると、それを に送信し1.2.3.4:4321
ます。一方、NAT は、4321
ポートを 192.168.0.100:54321 に転送する必要があることを記憶しています。
ここで、John が同じサーバーにリクエストを送信したとします。この TCP/IP 接続は、からの要求が行われたことを記憶する NAT を介してルーティングさ192.168.0.101:32123
れます。次に、このリクエストは public を使用して転送され1.2.3.4:4322
ます (別のポートに注意してください)。応答が到着すると、NAT はポートをチェックし、(John)4322
にルーティングします。192.168.0.101:32123
それ以外の場合 (ポートで4321
)、ポールは応答を受け取ります。
注:クライアントのエフェメラル ポートとサーバー ポート (デフォルトでは HTTP の 80) を混同しないでください。