пакет tcp, поступающий в приложение? - PullRequest
0 голосов
/ 22 марта 2012

В среде клиент-сервер, когда клиент отправляет пакет (с исходным ip / dest ip / ports ... etc), запрашивая "GET /index.php ... etc",
в приложении сервера (демон) приходит весь пакет (целые биты данных), включая mac, IP-адреса, порты, флаги tcp, полезную нагрузку?Или просто полезная нагрузка?

Поскольку я не понимаю, как сценарии могут читать удаленный адрес (например, echo $ _SERVER ['REMOTE_ADDR'];)

1 Ответ

1 голос
/ 22 марта 2012

Серверный компьютер получает весь пакет.Его ядро ​​и стек TCP / IP получают и обрабатывают его.Сервер приложений использует сокет для связи с ядром, которое является интерфейсом более высокого уровня, чем необработанные пакеты;поэтому у него другое мнение.Предполагая, что мы говорим о TCP, вы обнаружите среди прочего:

  • Информация от физического уровня или уровня канала данных (например, MAC-адреса источника и назначения) недоступна в сокете (если вы непричудливые и, вероятно, непереносимые вещи).
  • Доступна некоторая информация из уровня IP и TCP, поэтому приложение может получить ее с помощью специальных системных вызовов, таких как getsockname() и getpeername().Это включает в себя IP-адреса и порты.
  • Приложение не имеет отношения к большей части остальной информации из уровней IP и TCP и не доступно в сокете.Например, параметры, размер окна, контрольная сумма, смещение фрагмента.
  • Приложение отправляет и получает данные в сокете, как если бы это был непрерывный поток байтов.Он не знает или не заботится о том, как поток данных разбивается на маленькие пакеты, каждый из которых содержит часть данных.

для конкретного случая $_SERVER['REMOTE_ADDR'];, который вы выделите, эта информация поступает из вышеупомянутогоgetpeername() системный вызов.PHP вызывает это для вас и делает информацию доступной.

...