Keep alive of TCP connection

245
04 октября 2017, 06:40

Добрый день.

У нас на работе с коллегой возник спор по поводу keep alive TCP соединения с клиентом.

Я утверждаю:

Метод

Stream.Read (Byte[], Int32, Int32)

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

(копия примечания с msdn: https://msdn.microsoft.com/ru-ru/library/system.io.stream.read(v=vs.110).aspx)

Т.е. если мы выполняем await ReadAsync и постоянно получаем 0 байт, следовательно TCP клиент отвалился. Данный метод "keep alive" актуален при использовании ReadAsync и корректном дисконнекте клиента (чтобы на уровне TCP успел придти пакет о закрытии сокета).

Мой коллега утверждает:

Нельзя пологаться на этот метод. Единственный способ "keep alive" - это послать "heart bit" и удостовериться, что на том конце есть кому его принимать, иначе TCP клиент отвалился.

Хотелось бы узнать что думаете вы??

Answer 1

Нет смысла "постоянно получать 0 байт", первый же 0 означает закрытый на чтение сокет.

Однако, закрытым соединение становится только после прихода FIN или RST-пакета, причем пакет RST еще и имеет негарантированную доставку! Поэтому, если вас не устраивает системный тайм-аут в 2 часа для Keep-Alive (который к тому же по умолчанию для сокетов выключен) - обязательно нужно писать свою логику определения зависших соединений.

Тем не менее, не обязательно для этого отправлять heartbeat-сообщения. Если протокол подразумевает возможность повторного подключения - можно просто выставить тайм-аут на чтение и после тайм-аута закрывать соединение.

С другой стороны, надо помнить о NAT. Многие реализации PNAT имеют свои тайм-ауты для исходящих соединений - и могут разорвать неактивное соединение. Этот тайм-аут может быть очень небольшим, и угадать его заранее нельзя. Если важно чтобы соединение не рвалось само по себе - придется вводить в протокол клиентские keep-alive сообщения, с настраиваемым интервалом.

READ ALSO
Вопрос по С# Перелистывание графика

Вопрос по С# Перелистывание графика

Всем приветВопрос возможно глупый, но я новичок в с#

275
JavaScript SDK vk - ограничение запросов в секунду

JavaScript SDK vk - ограничение запросов в секунду

У VK API есть ограничение - 3 запроса в секундуКак используя javascript sdk, ограничить запросы до трех в секунду?

248
Плагин релоадящий страницу для gulp

Плагин релоадящий страницу для gulp

Доброго времени сутокЗнаю что хочу не возможного, просто хочу убедится, действительно ли это так, пишу сюда т

236
В чем отличия метода от функции?

В чем отличия метода от функции?

Хотелось бы узнать о различиях между методом ({method(){}}) и функцией ({function: function(){}}) - как по смыслу, так и техническиЖелательно не выдержку из спеки...

476