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

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

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

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

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

Однако то, что делает «конечную точку», может оказаться не тем, что вы ожидаете. Оператор может установить прозрачный прокси-сервер или маршрутизатор с NAT между ними, и в этот момент им необходимо сохранить состояние для правильной пересылки данных.

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

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

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

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

1 голос
/ 07 апреля 2011

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

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

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

0 голосов
/ 07 апреля 2011

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

К вашему сведению ...

...