Каково типичное использование TCP keepalive?

Рассмотрим сценарий, в котором существует один сервер и несколько клиентов. И каждый клиент создает TCP-соединения для взаимодействия с сервером. Существует три варианта использования TCP:

  1. Keepalive на стороне сервера: сервер отправляет keepalive TCP, чтобы убедиться, что клиент активен. Если клиент мертв, сервер закрывает TCP-соединение с клиентом.
  2. Keepalive на стороне клиента: клиенты отправляют TCP keepalive, чтобы сервер не мог закрыть TCP-соединение с клиентом.
  3. Keepalive с обеих сторон: и сервер, и клиенты отправляют keepalive TCP, как описано в 1 и 2.

Какие из вышеперечисленных применений TCP keepalive являются типичными?

1 ответ

Решение

Keepalive на стороне сервера: сервер отправляет keepalive TCP, чтобы убедиться, что клиент активен. Если клиент мертв, сервер закрывает TCP-соединение с клиентом.

Если клиент мертв, сервер получает ошибку "сброса соединения", после чего он должен закрыть соединение.

Keepalive на стороне клиента: клиенты отправляют TCP keepalive, чтобы сервер не мог закрыть TCP-соединение с клиентом.

Нет. Клиент отправляет keepalive, так что если сервер не работает, клиент получит ошибку "сброс соединения", после чего он должен закрыть соединение.

Keepalive с обеих сторон

Обе стороны могут получить "сброс соединения" из-за сбоя поддержки активности, как указано выше.

Какое из вышеперечисленных типов является типичным?

Любой из них или нет. Если пэр регулярно отправляет сообщения, он также не нуждается в keepalive. Поэтому он часто более полезен для сервера, чем для клиента.

На самом деле, как сервер, так и клиенты могут использовать TCP keepalive. Полезно убедиться, что операционная система в конечном итоге освободит любой ресурс, связанный с неработающими соединениями. Обратите внимание, что если соединение между двумя хостами теряется из-за проблем с маршрутизатором между ними, то оба хоста должны независимо обнаружить, что соединение потеряно, и выполнить очистку для себя.

Теперь каждый хост будет поддерживать таймер для каждого соединения, указывающий, когда он последний раз принимал пакет, связанный с этим соединением. Хост отправит пакет keepalive, когда этот таймер превысит определенный порог, который определяется локально (то есть хосты не обмениваются информацией о своей собственной конфигурации keepalive). Таким образом, любой хост с наименьшим временем активности активности будет отправлять пакет поддержки активности другому хосту. Если пакет действительно проходит, другой хост (то есть тот, который имеет более высокое время активности активности) ответит на этот пакет и сбросит свой собственный таймер; следовательно, хост с более высоким временем активности активности, безусловно, никогда не достигнет необходимости отправлять сам пакет активности, если соединение действительно не было потеряно.

Можно утверждать, что серверы, как правило, более агрессивны на keepalive, чем клиентские машины (то есть они чаще будут настраиваться с меньшим временем keepalive), поскольку зависание соединений часто оказывает нежелательное влияние на серверное программное обеспечение (например, программное обеспечение может принять ограниченное количество одновременных подключений, или сервер может создать новый экземпляр процесса, связанный с каждым подключением).

Другие вопросы по тегам