При каких обстоятельствах мой браузер будет пытаться повторно использовать TCP-соединение для нескольких запросов? - PullRequest
12 голосов
/ 05 сентября 2011

Я использую Firefox, но я хотел бы знать, как браузеры решают это в целом.

Кажется, что когда я получаю доступ к одному и тому же URL дважды за короткий промежуток времени, мой браузер пытается повторно использовать одно и то же TCP-соединение для обоих запросов (это называется keep-alive). Однако когда я получаю доступ к двум разным URL-адресам (но все еще обслуживается одним и тем же сервером ), браузер иногда решает открыть новое соединение для каждого запроса. Очевидно, что браузер не использует политику «одно соединение на URL».

Я спрашиваю об этом, потому что я пытаюсь реализовать веб-сервис, который использует длинный опрос. Я могу представить, что пользователь может захотеть открыть этот сервис в нескольких вкладках в одном браузере. Однако при использовании keep-alive второй длинный запрос на опрос не отправляется до тех пор, пока не завершится первый (по крайней мере, в Firefox), поскольку браузер пытается запихнуть их обоих в один и тот же сокет, чего я не ожидал, когда спроектировал сервис. Даже если в браузере реализована конвейерная разметка, я не смогу ответить на второй запрос до того, как отвечу на первый, потому что HTTP требует, чтобы я выполнил ответы по порядку.

1 Ответ

7 голосов
/ 05 сентября 2011

При использовании HTTP / 1.1 по умолчанию TCP-соединения остаются открытыми для повторного использования.Это для лучшей производительности, чем запуск нового соединения для каждого запроса.Соединение может быть повторно использовано , но соединение может быть закрыто в любое время любой из сторон.

Вы должны прочитать HTTP1.1 и часть о постоянных соединениях.

В вашем случае он даже не использует конвейерную передачу HTTP (широко не поддерживается), потому что следующий запрос отправляется после ответа первого.

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

Большинство браузеров позволяют пользователю настраивать или переопределять количество постоянных соединений на сервер;в большинстве современных браузеров по умолчанию используется шесть.Если Firefox действительно блокирует второй запрос, потому что соединение уже активно, это ошибка в Firefox и должна быть зарегистрирована в их системе отслеживания ошибок.Но если бы такая ошибка существовала, я думаю, вы бы увидели, что многие сайты не работают.

...