Отключение TCP, если нет данных - PullRequest
1 голос
/ 09 января 2010

Я проверил TCP-протокол Wiki, но не нашел, истечет ли время подключения сокета, если в течение длительного периода времени данные не передаются. Я имею в виду ... не будет никаких физических проблем, но у двух компьютеров просто не будет данных для отправки друг другу в течение некоторого времени. Как связь все еще будет существовать? Будут ли некоторые передачи данных низкого уровня, чтобы помочь ему понять, что он не сломан?

Спасибо! Извините, если вопрос тупой ..

Ответы [ 4 ]

4 голосов
/ 09 января 2010

Данные не передаются по сети для поддержания TCP-соединений. Вы можете отправить подтверждение активности сетевого уровня, просто отправив () пакет нулевого байта от одного из узлов или включив опции сокетов, чтобы операционная система периодически отправляла их вам. На мой взгляд, средства поддержки активности уровня приложения (ваш протокол приложения управляет им) обеспечивают лучшую конструкцию / надежность, чем машинный уровень транспортного уровня.

При разработке прикладных протоколов, наложенных поверх TCP для максимальной надежности, обычно требуется, чтобы вы включили какой-то тип неработоспособности (NOOP), ping, heartbeat в дизайн протокола.

Это очень важно, потому что, например, если ваш сервер прослушивает запрос от клиента и клиент отключен после установления соединения, сеанс TCP практически потерян, и ваш сервер может прослушивать вечно. Прерывание соединения не может быть обнаружено, если данные никогда не отправляются или не принимаются !!

Если сервер, по крайней мере, регулярно отправляет noop / ping / heartbeats, исходящий запрос вызовет повторную передачу / тайм-аут уровня TCP, и тогда сервер сможет обнаружить разорванное соединение. Если вместо этого ваше приложение отправляет прикладной уровень "ping" или "привет, как дела?" сообщение, которое вы можете пойти дальше и использовать его, чтобы узнать о состоянии вашего партнера, а не просто базовое соединение.

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

2 голосов
/ 09 января 2010

TCP-соединение будет оставаться открытым, пока оба конца не закроют его.

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

0 голосов
/ 09 января 2010

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

0 голосов
/ 09 января 2010

Соединения часто остаются открытыми, используя keepalive .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...