Как воспроизвести тихо сброшенное соединение TCP / IP? - PullRequest
24 голосов
/ 25 мая 2011

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

КаждоеВ субботу этот сервер перезагружен, но по какой-то причине мой клиент не сообщил об этом должным образом, поэтому соединение просто зависает, ожидая ответа навсегда.Это точно такое же поведение, как и в случае устаревших JDBC-соединений, когда некоторый маршрутизатор между сервером и клиентом обнаружил, что соединение неактивно, и сбросил его без уведомления.

Мне нужно иметь возможность воспроизвести этот сценарий, чтобыбыть в состоянии создать правильное исправление.

Следовательно, мне нужно знать, есть ли хороший способ для симуляции маршрутизатора, который молча отбрасывает соединения под моим контролем?

Я могу поместить коробку Linux или Mac между моей средой разработки и сервером.Я могу запустить JVM на виртуальной машине (vmware player), если мне удастся сделать сброс.

Предложения очень приветствуются.


РЕДАКТИРОВАТЬ 2012-12-18: Для меня работало решение использовать локальный прокси-сервер SOCKS5 на основе Java, который можно было приостановить с помощью Ctrl-Z по желанию, и скажите моему заявлению, чтобы оно прошло.

Ответы [ 4 ]

9 голосов
/ 25 мая 2011

Используйте Socat для переадресации вашего соединения (его очень легко настроить в качестве пересылки / прокси-сервера TCP) даже на той же машине, если вы хотите (введя новый порт для прокси-сервера, на котором можно работать, иуказывая на «официальную» конечную точку)

Извлеките простой TCP-сервер пересылки пример

Затем, когда вы захотите проверить отключения, вы можете либо убить его (и сокетбудет закрыт) или, возможно, попробуйте остановить процесс (CTRL Z linux), чтобы увидеть, как ваш пункт назначения обрабатывает заблокированные соединения.

Есть вопросы?Я постараюсь ответить ... Удачи!

9 голосов
/ 25 мая 2011

Вы должны иметь возможность временно применять правило, используя iptables, чтобы отбрасывать все пакеты, поступающие с удаленного сервера (abcd).Что-то вроде:

iptables -A INPUT -s a.b.c.d -j DROP

Когда вы хотите отключить фильтр

iptables -D INPUT -s a.b.c.d -j DROP

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

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

3 голосов
/ 25 мая 2011

Отключите сетевой кабель от компьютера.

Проведите простую проверку только этого модуля.Подключитесь к серверу и доберитесь до ожидающей части.Затем вытащите сетевой штекер.

Конечно, важно, чтобы вы изолировали этот модуль и включили только этот модуль при запуске этого теста.Могут быть и другие аспекты вашей программы, требующие доступа к сети, и они не должны быть запущены.

1 голос
/ 18 августа 2014

Нативное решение на основе Linux - использовать tc с netem . Netem - это специальная очередь, которую можно подключить к различным сетевым интерфейсам, чтобы вызвать задержку, переупорядочение и потерю (подробности см. На веб-странице). Вот некоторые примеры использования netem:

tc qdisc change dev eth0 root netem loss 0.1%

чтобы eth0 сбросил 0,1% всех исходящих пакетов и

tc qdisc change dev eth0 root netem loss 0.3% 25%

Чтобы создать пакеты потери пакетов:

Это приведет к потере 0,3% пакетов, и каждая последующая вероятность зависит на четверть от последней.

Если вам также необходимо отбросить входящие пакеты, вы можете использовать ifb (промежуточное функциональное блочное устройство). Вы устанавливаете его, пересылаете все пакеты, полученные eth0, в ifb и присоединяете netem к ifb для создания потери или задержки. Более подробную информацию смотрите в документации ifb.

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