Tomcat, HTTP Keep-Alive и Java's HttpsUrlConnection

У меня есть два сервера Tomcat, которым нужно поддерживать постоянное соединение, чтобы сократить рукопожатие SSL. Один сервер (прокси) находится в DMZ, а другой - в безопасности за другим брандмауэром. Прокси-сервер в основном запускает простой сервлет, который выполняет некоторую проверку на вменяемость, прежде чем пересылать запросы на защищенную машину. При первом запросе машины обмениваются сертификатами перед выполнением реальной работы. Поэтому я хотел бы поддерживать постоянное соединение с тайм-аутом в несколько минут.

Для связи с защищенным сервером сервлет на прокси-сервере использует HttpsUrlConnection. Я настроил WireShark и заметил, что независимо от того, какое значение keepAliveTimeout я установил для коннекта на защищенной машине, TCP-соединение закрывается примерно через 5 или 10 секунд. Это число, похоже, совпадает с тем, что я читал о таймауте по умолчанию и о том, как Java обрабатывает HTTP Keep-Alive. Эта ссылка объясняет, что Java соблюдает таймаут Keep-Alive, если он отправлен сервером, в противном случае она использует 5 секунд (прямые соединения) или 10 секунд (прокси-соединения) перед закрытием соединения.

Я пытаюсь понять, как я могу заставить Tomcat отправлять заголовок Keep-Alive. Не, Connection: Keep-Alive, а Keep-Alive: timeout=x.

Я экспериментировал с HTTP-сервером Apache и изменение параметра keepAliveTimeout в httpd.conf действительно заставляет заголовок Keep-Alive менять свое значение таймаута. Более того, Java соблюдает этот таймаут.

UPDATE (12/23/11): После проведения еще нескольких экспериментов я попробовал быстро и грязно создать код, используя HttpClient (3.1) от Apache, а не HttpsUrlConnection. Оказалось, что HttpClient, когда он настроен на использование Keep-Alive, просто ждет, пока сервер закроет соединение. Однако я не знаю, как долго он будет ждать. Я пытаюсь поддерживать HTTP-соединение в течение 3-5 минут.

17
задан rds 26 November 2014 в 10:58
поделиться