Я пытаюсь настроить iptables, чтобы вызвать реалистичные сбои сети между контейнерами докеров. На сервере Я запускаю как netcat -lk 1234
, так и ковбойский сервер Erlang. На клиенте запускаю клиентов:
echo blah | netcat myserver 1234
curl myserver / xyz
Изначально все работает нормально, есть свидетельства взаимодействия клиент-сервер. Затем я представляю правило iptables DROP для ВЫХОДА клиента.
iptables -A OUTPUT -j DROP
echo blah | netcat myserver 1234
curl myserver / xyz
Коммуникации netcat и curl не проходят, пока я не удалю правило DROP, после чего они восстанавливаются без проблем!
Наконец, я повторяю выше, но перед удалением правила DROP я Ctrl-C исполняю клиентские файлы. После удаления правила DROP я не заметил никаких признаков получения сервером клиентских запросов.
Я пришел к выводу, что клиент netat / curl должен пытаться повторно передавать данные бесконечно? Разве я не должен в конечном итоге ожидать неудачи? Кстати, то же самое происходит и с другими клиентами, например. Erlang http / websocket_client.
Да, TCP пытается установить надежное соединение через ненадежную сеть, поэтому допускает некоторую потерю пакетов. Отправитель будет продолжать повторять попытки отправки своих данных, пока не получит ACK от получателя или пока не истечет время ожидания и не решит, что соединение потеряно.
Согласно в этом сообщении , в Linux тайм-аут по умолчанию при отправке данных составляет чуть более 2 минут.
(Если ни одна из конечных точек не отправляет данные, они могут не обнаружить, что соединение вообще разорвано, если только они не настроены на отправку сообщений поддержки активности TCP. Однако сообщения поддержки активности TCP отправляются после По умолчанию 2 часа бездействия.)