Предположим, я ввожу URL-адрес в свой браузер, и браузер отправляет HTTP-запрос. Удаленный HTTP-сервер принимает запрос и инициирует длительную задачу по его обслуживанию.
Если я завершу запрос до его завершения (например, нажму Esc или в Firefox), как он будет закрыт? Будет ли браузер передавать этот запрос на прерывание серверу (я думаю, что нет)?
Если предположить, что нет, после завершения длинной задачи, что сервер будет делать с результатом? Он все равно отправляет его обратно? Если да, что будет? Дойдет ли он до моего ПК? Или заблудился по дороге?
Это просто из моего любопытства.
Спасибо за ваше время :)
Ну, все зависит от того, что делает сервер. Обычно он не «обнаруживает» завершенный запрос, пока не будет предпринята попытка отправки. В этот момент скрипт получит сообщение user_abort от веб-сервера (в php вы можете указать ему игнорировать прерывание пользователя с помощью ignore_user_abort(true);
). Без попытки отправить данные клиенту сервер не может узнать, что запрос был прерван.
Когда он пытается отправить запрос на закрытое TCP-соединение, то, что происходит, полностью зависит от программного обеспечения сервера. Apache работает следующим образом: если отправленные данные все еще находятся в процессе обработки динамического сценария, он сообщит сценарию об прерывании и позволит ему обработать его так, как он хочет (PHP - по умолчанию - завершается). Если скрипт выполнен или это статический запрос файла, он просто проигнорирует закрытое соединение и вернется.
Я думаю, это нужно думать об электричестве. обвинение. когда какое-то соединение завершается, отправляемые данные являются платными, они просто исчезают, поскольку для этой конкретной передачи нет доступного слушающего сокета. только при наличии сокета происходит какое-то общение.
Пример:
Мы попали http://localhost
для apache2 httpd. Предположим, он не работает. Браузер открывает сокет, отправляет сообщение на порт 80 (по умолчанию) и проверяет, есть ли ответ. Поскольку слушателя нет, поскольку apache не запущен, этот запрос ping вообще не получает ответа. по крайней мере 200 окей или рукопожатие вообще. что тогда происходит с нашим пингом? http отправляет что-то: вроде GET http://localhost 80
... и т.д. что происходит с этой строкой? GET http://localhost 80
? это просто заряд и исчезает.
Это просто мое убеждение, и сначала мы должны обратиться к TCP для большей ясности. Только тогда мы сможем понять, как ведет себя Интернет-протокол и последующий http. В конечном итоге, похоже, нет конкретного определения для преждевременного завершения HTTP-запроса. Вот почему это называется преждевременным прекращением.