Поздравляем, вы только что углубились в концепцию сетевых уровней, осознав, что порты и протоколы не связаны напрямую друг с другом. Как говорят другие, telnet можно использовать для подключения к любому порту TCP. Однако, чтобы понять, почему это возможно, вам нужно немного разбираться в сетевых уровнях. Если вы когда-либо слышали о модели уровня OSI 7, это то, что позволяет вам использовать telnet для подключения к другому порту. Хотя в Интернете они касаются только 4-х уровней и их называют Internet Protocol Suite, Без сетевых уровней каждая программа должна была бы не только понимать свой собственный протокол, но и определять собственную схему IP-адресации и систему портов, что означает, что каждый маршрутизатор должен понимать, как маршрутизировать эти схемы, и различные протоколы будут очень полезны. сложнее учиться и диагностировать. Проще говоря, Интернет не будет работать почти так же хорошо без слоев.
Вас интересуют транспортный уровень и прикладной уровень. На транспортном уровне у нас есть интернет-протоколы, такие как TCP и UDP, с номерами портов от 1 до 65535 на каждом. На прикладном уровне у нас есть протоколы, такие как HTTP, SMTP и DNS. Обычно каждый документ стандартов Интернета, который определяет протокол, определяет порт TCP по умолчанию или порт UDP, который протокол должен использовать по умолчанию. Например, TCP-порт 80 для HTTP, TCP-порт 25 для SMTP, UDP-порт 53 для DNS и TCP-порт 23 для Telnet. Программа telnet фактически говорит по протоколу TELNET, который является стандартным протоколом., но в основном древний по нынешним меркам. Поскольку его последовательности протоколов состоят из 8-битных символов, вы редко видите сам протокол и в основном его прозрачный по сравнению с другими более современными протоколами, такими как HTTP и SMTP, которые используют видимые человеком слова в ASCII, такие как GET, POST, HELO, LOGIN, и т.п.
Поскольку его протокол обычно не виден, telnet стал хорошим инструментом для подключения к другим портам TCP и позволяет пользователю вводить протоколы вручную. Некоторые сетевые администраторы используют эту технику для диагностики проблем с серверами. Однако, поскольку программа telnet по-прежнему имеет собственный протокол и иногда может отправлять дополнительные биты данных, вы все равно можете испытывать проблемы с этим методом. Когда вы используете telnet, вы действительно «устанавливаете соединение» на уровне приложений, а также на транспортном уровне. Просто случается, что другие протоколы прикладного уровня могут работать нормально для большинства задач диагностики и не будут мешать протоколу telnet. Есть лучшая программа для этого через nc (Net Cat. Она получила свое название от сетевой версии команды cat).
$ nc www.stackexchange.com 80
Программа nc не говорит ни о каком протоколе прикладного уровня, и когда вы устанавливаете соединение с ним, вы «устанавливаете соединение» только на интернет-уровне (IP-адрес) и транспортном уровне (TCP или UDP). Это означает, что вы контролируете, какой протокол прикладного уровня используется. Честная игра, даже бинарные протоколы. Это также позволяет вам делать полезные вещи, такие как передача файлов без их повреждения и прослушивание портов для входящего трафика:
nc -l 9000 < movie.mp4 (Your friend runs this)
nc friends.computer.hostname 9000 > movie.mp4 (you run this)
А затем movie.mp4 передается по сети, вообще не используя протокол прикладного уровня (например, FTP). Протокол приложения - это ваш друг, который говорит вам, что он готов выполнить вашу команду.
nc также может обрабатывать UDP-пакеты и сокеты UNIX-домена. Использование его для прослушивания также может быть интересным.
nc -l 12345
Теперь в вашем веб-браузере зайдите на http: // localhost: 12345 /, а в сеансе nc вы должны увидеть GET / HTTP/1.1
запрос браузера . В этот момент вы можете что-то набрать и нажать, Ctrl-D
и это должно появиться в вашем браузере в виде обычного текста (если вы хотите, чтобы HTML отображался, вы должны отправить его обратно с правильным ответом протокола HTTP, а затем HTML-кодом).
Иногда программы, которые изначально используют один протокол, такой как HTTP, могут подключаться к другим портам, предназначенным для другого протокола. Обычно вы больше не можете делать это в браузере с графическим интерфейсом, потому что они ограничивают их для подключения к некоторым портам, но если вы используете программу, такую как curl, для подключения к порту 25 (SMTP для отправки почты), вы, вероятно, увидите пару ошибки о нарушении протокола.
$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.
Это происходит потому, что curl обычно говорит по протоколу HTTP, поэтому после установления TCP-квитирования он начинает отправлять данные следующим образом:
GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl
Но SMTP-сервер ожидает SMTP, который выглядит примерно так:
HELO myhomecomputername.local
В этот момент сервер отправляет обратно свою идентификационную строку:
250 yourispsmtpserverhost.com
Итак, вы видите, что нет ничего, что мешает curl установить соединение транспортного уровня с SMTP-сервером, оно просто не может говорить по протоколу. Но вы можете говорить по протоколу самостоятельно с помощью программы, такой как telnet или, более предпочтительно, nc.
nc(1)
) гораздо более гибкая. Он может подключаться к зашифрованным службам SSL / TLS, а также использоваться в качестве сервера и даже передавать данные.