Пакет tcp поступает в приложение?

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

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


person pufos    schedule 22.03.2012    source источник


Ответы (1)


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

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

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

person Celada    schedule 22.03.2012