#http #tcp #keep-alive
#http #tcp #поддерживать активность
Вопрос:
Я пытаюсь понять связь между значениями тайм-аута TCP / IP и HTTP. Эти два значения тайм-аута разные или одинаковые? Большинство веб-серверов позволяют пользователям устанавливать значение тайм-аута HTTP Keep Alive с помощью некоторой конфигурации. Как это значение используется веб-серверами? это значение просто установлено в базовом сокете TCP / IP, т. е. Время ожидания HTTP Keep Alive и время ожидания TCP / IP Keep Alive одинаковы? или они обрабатываются по-разному?
Насколько я понимаю (возможно, неверно): веб-сервер использует тайм-аут по умолчанию для базового TCP-сокета (т. Е. неопределенный) независимо от настроенного тайм-аута HTTP Keep Alive и создает рабочий поток, который отсчитывает указанный интервал тайм-аута HTTP. Когда рабочий поток достигает нуля, он закрывает соединение.
РЕДАКТИРОВАТЬ: Мой вопрос касается связи или разницы между двумя длительностями тайм-аута, т. Е. что произойдет, когда длительность тайм-аута HTTP keep-alive и тайм-аут на сокете (SO_TIMEOUT), который использует веб-сервер, различны? должен ли я вообще беспокоиться о том, что эти два совпадают или нет?
Ответ №1:
Открытый сокет TCP не требует какой-либо связи вообще между двумя сторонами (назовем их Алисой и Бобом), если только не отправляются фактические данные. Если Алиса получила подтверждения для всех данных, которые она отправила Бобу, она никак не сможет отличить следующие случаи:
- Боб был отключен от сети или иным образом недоступен для Алисы.
- Боб был перезагружен или иным образом забыл об открытом TCP-сокете, который он установил с помощью Alice.
- Боб подключен к Алисе и знает, что у него открытое соединение, но не имеет ничего, что он хотел бы сказать.
Если Алиса некоторое время ничего не слышала от Боба и хочет провести различие между вышеуказанными условиями, она может повторно отправить свой последний байт данных, завернутый в подходящий TCP-фрейм, чтобы его можно было распознать как повторную передачу, по сути, притворившись, что она не слышала подтверждения. Если Боб отключен от сети, он ничего не услышит в ответ, даже если он повторно отправляет пакет в течение многих секунд. Если Боб перезагрузился или забыл соединение, он немедленно ответит, что соединение недействительно. Если Боб доволен подключением и ему просто нечего сказать, он ответит подтверждением повторной передачи.
Тайм-аут указывает, как долго Алиса готова ждать ответа, когда она отправляет пакет, требующий ответа. Время сохранения активности указывает, сколько времени она должна позволить истечь, прежде чем она повторно передаст свой последний бит данных и потребует подтверждения. Если Боб пропадает, сумма значений Keepalive и Timeout будет указывать на время в наихудшем случае между получением Алисой последнего бита данных и ее решением о том, что Боб мертв.
Комментарии:
1. Боб перезагрузил или забыл средство подключения на стороне Боба, TCP-соединение было разорвано, и для Боба, при просмотре сообщения, которое Алиса отправляет ему, поскольку соединение было разорвано, Боб понятия не имеет о сообщении от Алисы (он не может распознать сообщение), поэтому он повторяет недействительным, как и любое сообщение, отправленное ему неправильно.
Ответ №2:
Это два отдельных механизма; название является совпадением.
Функция HTTP keep-alive (также известная как постоянные соединения) поддерживает TCP-сокет открытым, чтобы можно было выполнить другой запрос без настройки нового соединения.
Поддержка TCP- это периодическая проверка, позволяющая убедиться, что соединение все еще подключено и функционирует. Это часто используется для гарантии того, что блок NAT (например, маршрутизатор DSL) не «забывает» сопоставление между внутренним и внешним ip / портом.
Комментарии:
1. Привет, Марк, спасибо за твой ответ. Я думаю, что я неправильно сформулировал вопрос. Мой вопрос касается связи или разницы между двумя длительностями тайм-аута, т. е. что произойдет, когда длительность тайм-аута HTTP keep-alive и тайм-аут на сокете (SO_TIMEOUT), который использует веб-сервер, различны? должен ли я вообще беспокоиться о том, что эти два совпадают или нет? Что касается моего первоначального вопроса, я думаю, что ваш ответ правильный. Спасибо
Ответ №3:
Директива KeepAliveTimeout
Описание: Количество времени, в течение которого сервер будет ожидать последующих запросов при постоянном соединении Синтаксис: KeepAliveTimeout секунд По умолчанию: KeepAliveTimeout 15 Контекст: конфигурация сервера, статус виртуального хоста: Основной модуль: ядро Количество секунд, в течение которых Apache будет ждать последующего запроса перед закрытием соединения. После получения запроса применяется значение тайм-аута, указанное директивой Timeout.
Установка значения KeepAliveTimeout в высокое значение может вызвать проблемы с производительностью на сильно загруженных серверах. Чем больше тайм-аут, тем больше серверных процессов будет занято ожиданием соединений с простаивающими клиентами.
В контексте виртуального хоста на основе имени будет использоваться значение первого определенного виртуального хоста (хоста по умолчанию) в наборе NameVirtualHost. Другие значения будут проигнорированы.
Директива о тайм-ауте
Описание: Время, в течение которого сервер будет ожидать определенных событий, прежде чем выполнить запрос с ошибкой Синтаксис: Время ожидания в секундах По умолчанию: Время ожидания 300 Контекст: конфигурация сервера, статус виртуального хоста: Основной модуль: ядро Директива TimeOut в настоящее время определяет время, в течение которого Apache будет ждать трех вещей:
Общее количество времени, необходимое для получения запроса GET. Промежуток времени между получением TCP-пакетов по запросу POST или PUT. Количество времени между подтверждениями при передаче TCP-пакетов в ответах. Мы планируем сделать их настраиваемыми отдельно в какой-то момент в будущем. До версии 1.2 таймер по умолчанию равнялся 1200, но был снижен до 300, что по-прежнему намного больше, чем необходимо в большинстве ситуаций. По умолчанию оно не установлено ниже, потому что в коде все еще могут быть нечетные места, где таймер не сбрасывается при отправке пакета.