Вопрос о поведении браузера при отправке ответа с сервера - PullRequest
7 голосов
/ 01 июня 2011

Сценарий:

  • Браузер отправляет HTTP-запрос на сервер.
  • Пользователь одновременно нажимает на закладку или другую ссылку на странице, что приводит к новому запросу на сервер.
  • Теперь сервер отправляет обратно два HTTP-ответа (или браузер получает ответы от двух серверов).

Как браузер решает, какой из ответов на самом деле обрабатывать?

Я знаю, что произойдет - я пытаюсь понять, почему.Любые ссылки или веб-сайты, которые объясняют это, также будут высоко оценены.

Спасибо,

vivek.

Редактировать: Увидел этот похожий вопрос после того, как задал,Пожалуйста, объедините / удалите, если необходимо.

1 Ответ

14 голосов
/ 08 июня 2011

Для общего обсуждения того, как выполняется сетевое программирование, см. этот вопрос .

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

Но когда браузер получает ответ от сервера, он делает это, вызывая recv в том же сокете, который использовалчтобы отправить запрос, чтобы он знал, с каким запросом отправляется ответ, прежде чем он даже начнет его читать.В теоретическом плане браузер поддерживает информацию о состоянии открытых им соединений.С практической точки зрения он имеет список или массив сокетов.

Браузер также отслеживает, какие окна и вкладки связаны с какими сокетами.Таким образом он может обновлять счетчики и строки состояния, чтобы отражать состояние соответствующих подключений.И если пользователь нажимает кнопку остановки, он знает, какой сокет (или сокеты) закрыть.

Таким образом, в вашем сценарии пользователь щелкнул ссылку или закладку в окне или вкладке, связанной с существующим сокетом, представляющимсоединение с сервером, на который ответ сервера еще не получен.Браузер может просто закрыть этот сокет, как если бы пользователь нажал кнопку «Стоп».И даже если он не закрыл его, браузер знает, что пользователь больше не хочет видеть ответ.Тем временем он открывает новый сокет для сервера, в котором заинтересован пользователь.

...