Каждый HTTP-запрос использует отдельное TCP-соединение.

Наблюдения:

  • Мое веб-приложение работает в JBoss.

  • Каждый пользовательский щелчок генерирует> 5 HTTP-запросов из-за изображений и т. Д.

  • Запуск netstat на сервере показывает, что новое TCP-соединение открывается для каждого отдельного HTTP-запроса (в основном я смотрю на общее количество TCP-соединений с IP-адреса клиента на порту 80).

Факты:

  • Протокол JBoss HTTP установлен на 1.1.

  • Я проверил с FF, IE9 и Chrome - все браузеры делают то же самое.

  • У меня есть две тестовые среды: одна работает на Windows7, а другая на CentOS. Я вижу одинаковое поведение в обоих.

Что я пытаюсь сделать

  • Постоянное TCP-соединение, потому что мы надеемся, что это а) улучшит взаимодействие с пользователем и б) снизит нагрузку на сервер.

На данный момент я не уверен, какой код, детали конфигурации или журнал я должен прикрепить к вопросу, но если вы сообщите мне, я предоставлю его. Любая помощь приветствуется.

p.s. Этот поток показался многообещающим из заголовка TCP-соединение не используется повторно для HTTP-запросов с HttpURLConnection, но в основном работает на стороне клиента.


person Prajesh Bhattacharya    schedule 06.06.2012    source источник
comment
Можешь посмотреть трафик? Можете ли вы проверить HTTP-заголовки Connection, которые отправляют клиент и сервер?   -  person Philippe Marschall    schedule 06.06.2012
comment
Привет Филипп, спасибо за ответ. На какие элементы заголовка следует обратить внимание? Я бы, вероятно, сделал это, используя методы HttpServletRequest и HttpServletResponse getHeader(String header). Если есть более быстрый способ сделать это, мне было бы интересно узнать об этом. Спасибо за помощь!   -  person Prajesh Bhattacharya    schedule 06.06.2012
comment
@PhilippeMarschall Заголовок запроса: проверено следующее: 1) Cookie -> JSESSIONID=blah-blah, 2) Connection -> keep-alive, 3) Cache-Control -> null, 4) pragma -> null   -  person Prajesh Bhattacharya    schedule 07.06.2012
comment
Я обычно использую комбинацию tcpdumpd и Wireshark, а затем следую tcpstream. Это позволяет мне видеть, какие запросы выполняются через TCP-соединение. Затем я смотрю на заголовок Close w3.org/Protocols/rfc2616. /rfc2616-sec14.html#sec14.10 отправляется как клиентом, так и сервером. Я ищу заголовок Connection: close. Клиент или сервер отправляет его?   -  person Philippe Marschall    schedule 07.06.2012
comment
Инструмент на стороне браузера, такой как firebug, fiddler или httpwatch, также предоставит вам эти данные.   -  person Nicholas    schedule 07.06.2012
comment
Частично заголовки уже разобраны и вы не видите, где начинается tcp соединение и где оно заканчивается.   -  person Philippe Marschall    schedule 07.06.2012


Ответы (1)


Я думаю, что нашел решение этой проблемы. Спасибо за указатели и предложения. Они действительно помогли.

Часть 1. Я использовал плагин HttpFox в Firefox, чтобы просмотреть заголовки ответа. Как и подозревал Филипп, заголовок Connection имел значение «close».

Часть 2: Добавление строки кода в мой собственный фильтр для изменения заголовка ответа не помогло. Поэтому я скачал и добавил jbossWebService.jar в каталог WEB-INF/lib, чтобы использовать класс org.jboss.web.tomcat.filters.ReplyHeaderFilter. (По-видимому, до JBoss 7 этот пакет был включен в JBoss по умолчанию.) В мой web.xml добавлено следующее:

<filter>

<filter-name>CommonHeadersFilter</filter-name>

<filter-class>

org.jboss.web.tomcat.filters.ReplyHeaderFilter</filter-class>

<init-param>

     <param-name>Connection</param-name>

     <param-value>keep-alive</param-value>

</init-param>

</filter>

Это помогло (ну, почти). Теперь первый «щелчок» из браузера генерирует около 4 TCP-соединений - не уверен в причине этого числа, потому что каждый щелчок генерирует> = 7 HTTP-запросов. Но все последующие клики, если они выполняются в течение периода ttl (15 с), не создают дополнительных TCP-соединений. Думаю, более тщательное расследование, предложенное Филиппом, могло бы кое-что выявить. Но на данный момент я должен двигаться дальше. Итак, пока я отмечу этот вопрос как ответ. Если понадобится в будущем, открою.

person Prajesh Bhattacharya    schedule 08.06.2012
comment
Большинство современных браузеров открывают до 4-8 одновременных подключений на одно имя хоста, чтобы ускорить загрузку нескольких файлов с одного хоста. Вы можете найти подробную информацию о поведении каждого браузера в Browserscope. - person MartinodF; 09.06.2012
comment
@MartinodF Это очень информативно и полезно (ваш комментарий, а также проект Browserscope)! Большое спасибо! Теперь буду считать эту проблему решенной. - person Prajesh Bhattacharya; 09.06.2012