почему TCP keep-alive пакет не вызывает событие ввода / вывода? Это потому, что никакой полезной нагрузки или порядковый номер на 1 меньше порядкового номера соединения - PullRequest
0 голосов
/ 06 июня 2019

Я хочу, чтобы уровень приложений уведомлялся, когда мой сервер получил пакет Keep Alive. Мне интересно, по какой причине пакет Keep Alive не вызывает событие ввода-вывода. Это потому, что в пакете TCP Keep Alive нет данных, или порядковый номер на 1 меньше порядкового номера соединения.

Я провел тест, чтобы мой клиент отправил пакеты Keep Alive. Мой сервер использует epoll, но не сработал.

Мне также интересно, если я добавлю один байт для сохранения данных пакета / полезной нагрузки, получит ли мое приложение уведомление / событие ввода-вывода / Epoll, запущенное?

1 Ответ

4 голосов
/ 06 июня 2019

Вас это не должно удивлять.Например, вас также не уведомляют о пакетах RST.

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

Похоже, что ваше последнее редактирование вызвано какой-то путаницей.Вы не можете добавлять данные в пакеты Keep Alive по двум причинам:

  • Во-первых, они отправляются сетевым уровнем, и приложение не контролирует их (кроме таймаутов)
  • Что еще более важно, если какой-то (темной) магией вам удастся вмешаться в сетевой уровень (скажем, вы пропатчите свое ядро ​​:) и начнете помещать в них данные, они перестанут поддерживать пакеты живыми и станут обычными пакетами данных, переносящимиданные.Чем, конечно, ваш получатель будет уведомлен о данных, которые станут частью потока сообщений.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...