同じ WIFI ネットワークに接続された 2 台のマシンが HTTP 要求をサーバーに送信する場合、サーバーは 2 つの要求を区別できますか? 2 つの要求が 2 つの異なるマシンからのものであることをサーバーが知ることができる情報はありますか? 私が理解している限り、ソース IP アドレスは HTTP リクエストでは利用できません。サーバー ソフトウェアは、ip パケットから if を抽出し、変数REMOT_ADDRに割り当てます。
サーバーに送信される FROM : IP アドレスは、共通ゲートウェイの IP アドレスになります。したがって、サーバーはリクエストをゲートウェイに送り返します。次に、ゲートウェイはどのように応答をそれぞれのマシンに転送しますか? 可能であれば、いくつかの実装の詳細を教えてください
2 に答える
is the server able to differentiate between the two requests?
いいえ、Wi-Fi ルーターはネットワークと外部インターネットの間の仲介者として機能するためです。Wi-Fi ネットワークに接続されているすべてのコンピューターは、このルーターのみを介して外部ネットワークと通信できます。したがって、httpサーバーは、wifiルーターと通信していると考えています.
したがって、このシナリオでは、ネットワーク内の異なるコンピューターからの要求を処理して区別するのは、ルーターの役割です。このために、wifi ルーターはtable
、コンピューターのすべての IP アドレスを含む を保持します。
そのため、外部の http サーバーはルーターの IP アドレスしか見ることができず、http サーバーが応答を返すと、wifi ルーターはヘッダーをチェックし、どのコンピューターから要求が送信されたかを判断します。これは、ルーターが以前に使用したのと同じテーブルを調べることによって行われます。正しいコンピュータを見つけた後、ルーターはそれに応答を送信します。これは、ネットワーク アドレス変換またはと呼ばれNAT
ます。このプロセス全体は、ユーザーと http サーバーに対して完全に透過的です。ローカル ユーザーは、これがどのように行われるかについて心配する必要はありません。
最も一般的な理由why NAT is used
は、ローカル コンピューターにstatic ip addresses
.
Is there any information from which the server can come to know that the 2 requests have come from 2 different machines?
http サーバーは、ネットワーク内のどのコンピューターと話しているかを知ることはできませんがlow level requests and response
、application level
http サーバーではcookies
、実際のクライアントについて詳しく知るために使用できます。
NAT の仕組み
非常に単純な設定で、ルーターは IP アドレス マッピングのテーブルを維持します。
そのテーブルでは、すべてのローカル IP アドレスがルーターによって一連のグローバル IP アドレスにマッピングされます。
ローカル システムが外部サーバーにリクエストを送信すると、ルーターは NAT マッピング テーブルをチェックし、現在のローカル アドレスにマップされたグローバル アドレスを選択します。次に、ルーターはリクエストのヘッダーを変更し、パケットの送信元アドレスをマッピングされたグローバル ip として設定します。このようにして、http サーバーはこのグローバル IPアドレスのみを認識します。
サーバーが応答を返すと、ルーターは再び NAT マッピング テーブルをチェックし、サーバーによって送信された応答の宛先にマップされた IP を選択し、ヘッダーを再度変更して、宛先をシステムの正しいローカル IP に変更します。
ただし、この方法には、1 つのローカル IP のみを 1 つのグローバル IP にしかマッピングできないなどの問題があります。これにより、1 つのグローバル IP で確立できる接続の数が制限されます。
この問題を修正するために、ポート アドレスも NAT マッピング テーブルに含まれています。今度は、IP とポートのペアが非常に広い範囲で変化する可能性があるため、同じグローバル IP を複数のローカル システムで使用できます。
ただし、元の送信元ポートも http サーバーから隠されています。プライベート システムの送信元ポート番号は、NAT テーブルによって 1024 ~ 65536 のいずれかの番号に置き換えられます。そのため、http サーバーが、プライベート コンピューターがどのポートを介してリクエストを行ったかを知る方法はありません。
また、これらの送信元ポート番号は、ブラウザがシステムにポート番号の提供を要求したときに、OS によって 1024 ~ 65536 の値からランダムに選択されます。無作為に選択されたポート番号が原因で、2 つのローカル システムが同じポートを使用でき、競合が発生する可能性があります。したがって、この問題を解決するために、NAT ソフトウェアはシステムごとに新しい番号を選択します。
このジャンク ポート番号 (元のソースではなく) がサーバーに送信され、サーバーはそれを確認して抽出することもできます。したがって、たとえば、サーバーでサーブレットを使用した場合、クライアント ポート (静的 IP の場合) またはサーブレットのいずれかでこのメソッド request.getRemotePort() によってリクエストが行われた最後のプロキシを取得できます。任意の httprequest
ネットワーク アドレス変換 (NAT) の一部としての WiFi ルーターは、プライベート IP アドレスから発信された接続の状態情報を維持します。
ルーターは、ネットワーク スタックの下位レベルに実装されたプロキシのようなものと考えてください。
ルーターは、送信元 IP アドレスとイーサネット アドレスを変更した後、クライアントに代わって要求を送信します。クライアントが応答を待っている場合は、サーバーとの接続がルーターによって維持され、各クライアントが応答を受信します。 .
サーバーがどのリクエストがどのクライアントに属しているかを判別できる唯一の方法は、HTTP ヘッダーを調べることです。ソース IP アドレスまたはホスト名はヘッダーで使用できますが、両方のクライアントで同じになります。サーバーがどの要求がどのクライアントに属しているかを判別する方法の 1 つは、サーバーが Cookie を使用してセッションの概念を埋め込んだり、ユーザーを識別したりすることです。クライアントからの要求の一部として、Cookie が設定されている場合、HTTP ヘッダーに常に存在します。サーバーは Cookie を探して、ユーザーが誰であるかを確認する必要があります。ユーザーが複数のブラウザー (firefox や chrome など) を同時に使用できる場合、サーバーはユーザーに関する情報だけでなく、ユーザーのセッションを追跡するための別のデータも必要とします。
また、IP アドレスが静的であることに常に依存できるとは限りません。ブラウザーがたまたまスマートフォン上にあり、ユーザーがたまたま電車などで移動している場合、IP アドレスが変化し続けることは非常に一般的です。スマートフォンがさまざまなセル タワーに接続すると、IP アドレスが変更され、サーバーはユーザーがまだ有効なセッションを持っているという概念を維持する必要があります。