В чем разница между запросом http и записью текста запроса http в сокет tcp / ip на 80-порту - PullRequest
2 голосов
/ 06 декабря 2011

Может кто-нибудь объяснить разницу между запросом HTTP и его обработкой и запросами сокета на 80 порту. Как я понял, HTTP-сервер прослушивает 80-порт, а когда кто-то отправляет HTTP-запрос на этот порт - сервер обрабатывает его. Поэтому, когда мы помещаем слушатель сокета на порт 80, а затем записываем в него сообщение в формате HTML - означает ли это, что мы отправляем обычный HTTP-запрос? Но как сказал скрипач - это ложь. Какая разница на уровне пакета? Или другой ниже уровня представления между HTTP-запросом и HTTP-сформированной записью в сокет? Спасибо.

1 Ответ

5 голосов
/ 06 декабря 2011

Прежде всего, порт 80 является портом по умолчанию для HTTP, он не требуется. HTTP-серверы могут прослушивать и другие порты.

Относительно разницы между «обычными» HTTP-запросами и теми, которые вы делаете самостоятельно через сокет - разницы нет. «Обычные» HTTP-запросы, на которые вы ссылаетесь (например, через веб-браузер), также реализуются через сокеты, как вы делали бы это вручную. И то же самое касается сервера. Реализация HTTP-сервера прослушивает входящие соединения сокетов и анализирует данные, которые передаются туда, так же, как вы.

Пока вы отправляете в свой сокет действительный протокол HTTP (согласно RFC), не должно быть никакой разницы в уровне пакета (если нижний сетевой стек идентичен).

Имейте в виду, что слой сокетов - это просто слой, через который всегда проходят HTTP-данные. Неважно, кто поместил данные туда, они просто выходят с другой стороны так же, как они были вставлены.

Обратите внимание, что у вас есть некоторая степень свободы при самостоятельной реализации HTTP. Есть много необязательных полей, и порядок заголовков не имеет значения. Поэтому возможно, что две разные реализации HTTP будут отличаться на уровне пакета, но будут вести себя в основном одинаково.

Лучший способ на самом деле увидеть, что происходит на уровне пакетов, - это использовать сетевой анализатор, например, wireshark или packetyzer. Сниффер фактически записывает пакеты сети и показывает их содержимое. Поэтому, если вы записываете несколько реализаций HTTP (из разных браузеров) и собственную реализацию сокетов, вы можете внести необходимые изменения, чтобы сделать их идентичными на уровне пакетов.

...