0

クライアントサーバー環境では、クライアントが「GET /index.php ... etc」を要求するパケット(source ip / dest ip / ports ... etc)を
送信すると、サーバーアプリケーション(デーモン)にパケット全体が到着します(データの全ビット) mac、IP、ポート、tcp フラグ、ペイロードを含む? それともペイロードだけですか?

スクリプトがリモートアドレスを読み取る方法がわからないため( echo $_SERVER['REMOTE_ADDR']; など)

4

1 に答える 1

1

サーバー マシンはパケット全体を取得します。そのカーネルと TCP/IP スタックがそれを受け取り、処理します。アプリケーション サーバーはソケットを使用して、生のパケットよりも上位層のインターフェイスであるカーネルと通信しています。したがって、それは異なる見方をしています。TCPについて話していると仮定すると、とりわけ次のことがわかります。

  • 物理層またはデータリンク層からの情報 (ソースおよび宛先 MAC アドレスなど) は、ソケットでは利用できません (非常に手の込んだ、おそらく移植性のないことをしない限り)。
  • IP および TCP レイヤーからの一部の情報が利用可能になるため、アプリケーションはgetsockname()やなどの特別なシステム コールを使用して取得できますgetpeername()。これには、IP アドレスとポートが含まれます。
  • アプリケーションは、IP 層と TCP 層からの残りの情報のほとんどに関心がなく、ソケットで利用できるようにはなりません。たとえば、オプション、ウィンドウ サイズ、チェックサム、フラグメント オフセットなどです。
  • アプリケーションは、データが連続したバイト ストリームであるかのように、ソケット上でデータを送受信します。データストリームが、それぞれがデータの一部を含む小さなパケットにどのように分割されるかは知りません。

強調表示した特定のケースでは$_SERVER['REMOTE_ADDR'];、この情報は前述のgetpeername()システム コールから取得されます。PHP がこれを呼び出して、情報を利用できるようにします。

于 2012-03-22T18:41:38.187 に答える