Тайм-аут простоя TCP для операторов США (или любого другого оператора в этом отношении)

1

Из того, что я понимаю, операторы удаляют любые соединения tcp, которые простаивают в течение некоторого количества минут. Вот почему, если вы хотите поддерживать постоянное соединение tcp с вашими клиентами на ваш сервер, вы должны отправить keep-alive в обоих направлениях.

Мой вопрос: какой должен быть интервал поддержания жизни?

Теги:
tcp
timeout

3 ответа

1
Лучший ответ

Чтобы быть ясным, никто не может удалить TCP-соединение, кроме конечных точек. Это связано с тем, что протокол IP-сети - это все, что видит сеть, и оно без апатрида по дизайну.

Что делает "конечную точку", тем не менее, может быть не так, как вы ожидаете. Перевозчик может поместить прозрачный прокси или маршрутизатор с NAT между ними, после чего им нужно сохранить состояние, чтобы правильно пересылать данные.

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

Включение SO_KEEPALIVE имеет значение по умолчанию 2 часа. Таким образом, хорошо выполненный маршрутизатор должен поддерживать состояние как минимум надолго, но не ставьте на него ферму.

Чтобы ответить на ваш конкретный вопрос... Если бы это был я, я бы использовал 15 минут или меньше.

Обратите внимание, что только одна сторона должна отправить keep-alive, когда они работают, путем повторной отправки последнего 1 байта потока данных, как если бы он потерялся в сети. Приемник отбрасывает его, потому что он уже видел его, но отправляет новый ACK в ответ, что приводит к тому, что трафик идет в обоих направлениях.

  • 0
    но afaik SO_KEEPALIVE не легко настраивается
  • 0
    int delay = X; setsockopt (sockfd, SOL_TCP, TCP_KEEPIDLE, и задержка, SizeOf (задержка)); int count = X; setsockopt (sockfd, SOL_TCP, TCP_KEEPCNT, и рассчитывать, SizeOf (счет)); интервал int = X; setsockopt (sockfd, SOL_TCP, TCP_KEEPINTVL, и интервал, SizeOf (интервал)); int enable = 1; setsockopt (sockfd, SOL_SOCKET, SO_KEEPALIVE, и включить, SizeOf (включить));
1

Для этого нужно будет использовать только сломанные NAT. AIUI, разумный NAT может просто отправлять TCP keepalives на оба конца соединения, когда ему нужно проверить на живучесть, и отказаться от соединения, если достаточное количество из них не сможет получить ответ.

Увы, многие/большинство NAT нарушены.

FWIW, iOS "многозадачность" имеет функцию "voip", которая отключит ваше приложение, если ваш сокет получит данные, или, при необходимости, с приблизительными временными интервалами (например, keepalives); минимальный интервал составляет примерно 300 секунд, поэтому примерно 300-1200, вероятно, сработает.

0

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

FYI...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню