Подтвердить что ты не робот

Как воспроизвести тихое соединение TCP/IP?

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

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

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

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

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

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


EDIT 2012-12-18: решение, которое сработало для меня, состояло в том, чтобы использовать локальный SOCKS5-прокси на Java, который можно было бы приостановить с помощью Ctrl-Z по желанию, и сообщить моему приложению, чтобы он прошел через него.

4b9b3361

Ответ 1

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

Ознакомьтесь с примером простого TCP-пересылки

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

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

Ответ 2

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

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

Если вы хотите отключить фильтр

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

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

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

Ответ 3

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

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

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

Ответ 4

Самостоятельное решение на базе 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 для создания потери или задержки. Более подробную информацию см. В документации по документам.