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