Подтвердить что ты не робот

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

В механизме keepalive HTTP существует известное условие гонки:

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

Мой вопрос в том, как сегодня веб-браузеры, используют функцию keepalive HTTP, обрабатывают это состояние гонки. Повторяют ли они?

Я буду рад за ссылки, поиск в google не придумал ничего.

4b9b3361

Ответ 1

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

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

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

  • обработать его изящно: автоматически повторить остальные запросы в новом подключении, чтобы пользователь не знал о том, что произошло с последним.
  • fail-fast: отображение ошибки пользователя с сообщением об ошибке 408

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

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