Оригинальный вопрос
Я подключаюсь к TCP-серверу node.js (на локальном хосте) с помощью telnet и пытаюсь изучить проверки активности.
В качестве первого теста я хотел бы подключиться к серверу с помощью telnet и завершить сеанс telnet таким образом, чтобы не отправлять пакет FIN. (Позволить серверу думать, что сокет TCP все еще «исправен».) К сожалению, я не могу найти умный способ проверить это.
- Когда я выхожу из telnet из приглашения telnet, событие
end
сокета срабатывает в node. Он явно получил пакет FIN. - Когда я
kill
запускаю процесс telnet, он также аккуратно разрывает соединение с пакетом FIN до того, как процесс завершится.
Знаете ли вы способ выйти из telnet без отправки пакета FIN (желательно без использования сетевого кабеля, который отключен / вызывает физическую сетевую ошибку.)
Улучшенный вопрос
Я хочу имитировать сбой сети, используя только локальный хост/петлю (без фактического отключения каких-либо интерфейсов/сетевых кабелей). Я хочу открыть TCP-соединение между клиентом и сервером, как на локальном хосте. Затем я хочу, чтобы клиент умер, не сообщив серверу, что он ушел. (т. е. без отправки пакета FIN.) Это может произойти в реальной сети, например, если маршрутизатор выйдет из строя.
Благодаря комментариям ниже я узнал, что ядро будет собирать все открытые порты/сокеты, принадлежащие процессу, когда процесс умирает (или принудительно уничтожается), как мой telnet
выше, и закрывает их для процесса, отправляя Пакет ФИН. Поэтому мне нужно заставить ядро не закрывать существующее соединение.
Итак, как я могу создать клиентский процесс, сохранить его живым, но позволить ему вести себя как полностью мертвое TCP-соединение?
Спойлеры
- (Ответ 1 ниже: используйте необработанный сокет (scapy), пусть он игнорирует любые пакеты, отправленные сервером после первоначального подключения и некоторых тестовых данных. (например, через определенное время.))
- (Ответ 2, Идея от коллеги: настроить
iptables
для отключения трафика между клиентом и сервером. Актуальное правилоiptables
в комментарии ниже.)