Как браузеры справляются с состоянием гонки поддержки активности HTTP?

В механизме проверки активности HTTP существует известное состояние гонки:

Насколько я понимаю, мне нужно, чтобы мой HTTP-клиент имел либо более короткий тайм-аут, чем мой HTTP-сервер, либо повторил попытку при получении TCP-FIN или TCP-RST.

У меня вопрос: как современные веб-браузеры, которые используют функцию проверки активности HTTP, обрабатывают это состояние гонки. Они повторяют попытку?

Буду рад ссылкам, поиск в гугле ничего не дал.


person speller    schedule 06.03.2017    source источник


Ответы (1)


Согласно RFC, в этих случаях сервер должен ответить Код ошибки 408, сигнализирующий клиенту, что соединение уже закрыто на его стороне. Как говорится в RFC:

Если у клиента есть незавершенный запрос в пути, клиент МОЖЕТ повторить этот запрос при новом соединении.

Это означает, что клиент (то есть каждый браузер) должен решить, как будет обрабатываться ответ 408. Есть 2 альтернативы:

  • справляться с этим изящно: автоматически повторять оставшиеся запросы в новом соединении, чтобы пользователь оставался в полном неведении о произошедшем сбое
  • отказоустойчивый: показ пользователю сбоя с соответствующим сообщением об ошибке 408

Например, кажется, что Chrome в прошлом следовал второму подходу до тех пор, пока люди не начали рассматривать это как «глючное» поведение и не переключились на первый. Вы можете найти ветку ошибок, связанную с ошибкой Chromium, здесь и соответствующее изменение кода здесь.

Примечание. Как вы можете прочитать в последних письмах в связанной ветке, Chrome выполняет эти повторные попытки только в том случае, если некоторые запросы в этом соединении были успешными. В результате, если вы попытаетесь воспроизвести это с помощью одного запроса, возвращающего ответ 408, вы заметите, что Chrome, вероятно, не будет повторять попытку в этом случае.

person Dimos    schedule 01.10.2017
comment
Спасибо, что нашли время и исследовали это. - person Georg Schölly; 04.10.2017
comment
Код ответа 408 предназначен для тайм-аута запроса — сценария, когда клиент начал отправлять запрос и отправляет его недостаточно быстро. В Keepalive race сервер закрывает соединение, когда соединение какое-то время простаивало и сервер не мог видеть текущие запросы, поэтому он не может отправить ответ 408 клиенту. - person avmohan; 03.05.2018
comment
@avmohan Я не думаю, что это правильно. Сервер ответит кодом 408, даже если клиент открыл соединение и вообще не отправил пакет. Например, см.: developer.mozilla.org/en-US /docs/Веб/HTTP/Статус/408 - person Dimos; 03.05.2018
comment
Спасибо за ссылку, Димос. Я понятия не имел, что может быть ответ без запроса. Хорошо знать. Я видел эти условия гонки между Apache httpd в качестве обратного прокси-сервера и tomcat. Tomcat закрывает постоянное соединение (без отправки 408), и в то же время httpd перенаправляет запрос от клиента, что приводит к ошибке 502 клиенту. Единственный способ исправить это — сделать так, чтобы время простоя на httpd было меньше, чем на tomcat. - person avmohan; 04.05.2018