Как HTTP-серверы принимают Telnet

Я понимаю, что Telnet является протоколом так же, как HTTP. У меня есть такое представление, что после установления первоначального TCP-соединения клиент Telnet отправляет некоторый определенный код telnet на сервер на другой стороне, в данном случае HTTP-сервер. Но так как HTTP-сервер не понимает специфические коды Telnet, он должен выдать ошибку или разорвать соединение и т. Д. Но на самом деле мы можем подключиться к HTTP-серверу и извлекать страницы, если вводим правильные заголовки HTTP и отправляем их. Как это может быть так? Запись в Википедии действительно не помогла мне понять этот конкретный момент. (Http://en.wikipedia.org/wiki/Telnet#Telnet_data)

3 ответа

Решение

Вы правы, говоря, что telnet - это собственный протокол, который описан в нескольких RFC. Вы можете взглянуть на Википедию, чтобы узнать, какие именно, и некоторые другие ресурсы, которые объясняют протокол.

По сути, это работает так: когда вы используете telnet для подключения к серверу, он показывает все печатные символы, которые сервер отправляет вам. И все, что вы введете, будет отправлено обратно на сервер. Вот как вы можете получать веб-страницы при подключении к веб-серверу: вы отправляете команду, которую принимает http-сервер, и получаете правильный результат.

Теперь есть несколько опций для Telnet. IIRC, вы не отправите их на сервер, если сервер не отправит их первым. Эти параметры используются для включения / отключения локального эха (подумайте о паролях, вы не хотите, чтобы они были видны при входе в систему), согласовать размер терминала, согласовать тип конца строки. Это команды длиной в несколько байтов, которые начинаются с байта 255 (называемого IAC, интерпретировать как команду). Когда вы подключаетесь к серверу telnet, ваш клиент будет интерпретировать их и отвечать соответствующим образом, все автоматически в фоновом режиме, не показывая вам эти команды.

Хотя сервер telnet не относится только к telnet, он также может отправлять escape-последовательности ANSI. Они используются для цветов, полужирного шрифта, позиционирования курсора,... Клиент telnet также будет их интерпретировать (или просто передавать их в эмулятор терминала, который вы используете, например, xterm).

Если вы хотите что-то "более низкого уровня", чем telnet, которое не будет интерпретировать параметры telnet и фактически отображать то, что вы получите, вы можете взглянуть на netcat

Telnet - это просто простой интерактивный способ открыть TCP-соединение с прослушивающим сокетом. Поскольку клиент telnet слепо отправляет то, что вы вводите, в этот сокет, он теоретически может эмулировать любой другой протокол поверх TCP. На самом деле тот факт, что непечатаемые символы интерпретируются драйвером клавиатуры, является единственным ограничением.

HTTP не использует непечатаемые символы, за исключением разграничения между заголовком HTTP и телом с двумя последовательными "переносами строк" ​​(то есть "пустой строкой").
Обратите внимание, что здесь я говорю не о теге HTML body, а о полезной нагрузке (например, теле SOAP).

Никакой магии здесь нет.

Давайте посмотрим динамику вещей.
HTTP поддерживает несколько команд, таких как GET, POST, PUT и т. Д. Каждая команда имеет свой синтаксис, и есть связанный ответ с согласованным синтаксисом и четко определенными кодами ошибок. Когда вы подключаетесь к HTTP-серверу с помощью telnet, вы открываете соединение через сокет, и сервер создает поток для управления диалогом с вашим клиентом. Затем вы можете имитировать браузер, набрав команду, которую браузер отправит. Каждый раз, когда вы нажимаете клавишу CR, клиент отправляет линию на сервер. Если команда содержит несколько строк, вы можете ввести несколько строк, каждая из которых соответствует строке заголовка команды. После того, как вы нажмете два CR подряд (т.е. пустую строку), заголовок команды будет считаться завершенным сервером, и ответ будет собран и отправлен обратно вашему клиенту. Поскольку жизненная цель клиента telnet состоит в том, чтобы отображать полученные символы (если не указано иное), вы можете увидеть заголовок и тело ответа в окне терминала. Telnet останавливается там. Браузер будет отображать HTML (если ответ является HTML-страницей).
Я надеюсь, что это проясняет все это.

Вы можете запросить http-сервер, используя telnet, я часто делаю это как быстрый и неприятный тест, telnet не отправляет никаких кодов. он просто устанавливает соединение, но есть определенные коды Telnet, которые вы можете отправить, если вам требуется

сделай это...

telnet server.com 80
GET http/1.0 /^m
host: server.com^m
^m

... servers response

^ m = введите ключ

Я сделал это сделано в Linux в Windows, это может быть по-другому.

ОКРУГ КОЛУМБИЯ

Другие вопросы по тегам