Я изучаю порты и слоняюсь без дела. Я обнаружил, что когда я захожу на сайт http://google.com:8000 (произвольно выбранный порт), время ожидания моего браузера истекает.

Но когда я захожу на сайт http://google.com:443, я сразу получаю сообщение об ошибке. (Текст ошибки, похоже, относится к конкретному браузеру - Chrome говорит "Пустой ответ", а Safari утверждает, что сервер "неожиданно разорвал соединение".)

Я знаю, что порт 443 является портом по умолчанию для протокола HTTPS, поэтому я догадался, что это может быть как-то связано с этим, но я недостаточно знаком с этими концепциями, чтобы его выявить. В частности, может ли кто-нибудь рассказать мне, что происходит, когда я указываю неверный номер порта и мой браузер зависает (примерно на 1 минуту) до истечения времени ожидания?

1 ответ1

3

Когда вы собираетесь куда-нибудь, используя браузер и указав порт, вы пытаетесь установить (TCP) соединение с этим портом.

Когда вы запускаете службу (например, веб-сервер), она запускается на определенном порту. Если вы попытаетесь подключиться к машине, и с этим портом не будет запущена какая-либо программа (правильный порт привязан к порту), или он будет защищен брандмауэром, то произойдет тайм-аут.

Когда вы заходили в Google через порт 8000, на нем не было запущено ни одной службы, поэтому время ожидания истекло. (На самом деле он пытается подключиться несколько раз, если в первые несколько раз произошла ошибка, чтобы сделать его более надежным)

Когда вы зашли в Google через порт 443, вы успешно установили соединение, потому что 443 обычно используется для HTTPS, то есть для безопасных соединений. Поскольку вы не инициировали безопасное соединение в соответствии с протоколом HTTPS, Chrome и Firefox работали таким образом.

Расширенный ответ

При установлении соединения по TCP происходит "трехстороннее рукопожатие" - клиент отправляет пакет "SYN" на сервер. Сервер получает это, и, предполагая, что программа запущена, он отправляет обратно подтверждение «SYN-ACK», затем клиент отправляет пакет "ACK" на сервер - в это время системы устанавливают соединение.

В случае подключения к порту 8000 клиент не получает ответ на пакет SYN, поэтому он пытается несколько раз, а затем сдается и время ожидания.

В случае подключения к порту 443, соединение устанавливается на уровне TCP. В настоящее время сервер ожидает согласования SSL-соединения для обеспечения безопасности (поскольку он настроен для этого через порт 443). Вы не знаете, как говорить по SSL, поэтому это не удалось.

Бонусные очки

Если у вас установлен TELNET - большинство систем делают это, вы можете притвориться браузером (или почтовым клиентом, или кем-то еще, если вы знаете протокол), выполнив следующие действия.

1.  type "telnet www.google.com 80"
(wait for a few seconds)
2.  Type GET / HTTP/1.1<enter>
host www.google.com<enter><enter>

На шаге 1 говорится, что Telnet создает TCP-соединение с сервером Googles на порту 80, а на шаге 2 указывается, что получить (GET / означает получить корневой файл), а в строке "host" указывается, к какому серверу вы хотите подключиться - вы Это необходимо, потому что многие сайты используют один сервер - вторая строка сообщает серверу, какой сайт. Вы дважды нажимаете клавишу ввода, чтобы сказать, что вы закончили отправку заголовка, а затем получаете ответ HTTP. (Если бы вы были веб-браузером, вы бы отправили гораздо больше информации, включая сведения о браузере, файлы cookie и т.д., Но в целях пояснения мы этого не делали.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .