tcp retransmit через curl и netcat

Я пытаюсь настроить 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.

1
задан 2 November 2015 в 14:11
1 ответ

Да, TCP пытается установить надежное соединение через ненадежную сеть, поэтому допускает некоторую потерю пакетов. Отправитель будет продолжать повторять попытки отправки своих данных, пока не получит ACK от получателя или пока не истечет время ожидания и не решит, что соединение потеряно.

Согласно в этом сообщении , в Linux тайм-аут по умолчанию при отправке данных составляет чуть более 2 минут.

(Если ни одна из конечных точек не отправляет данные, они могут не обнаружить, что соединение вообще разорвано, если только они не настроены на отправку сообщений поддержки активности TCP. Однако сообщения поддержки активности TCP отправляются после По умолчанию 2 часа бездействия.)

0
ответ дан 4 December 2019 в 06:56

Теги

Похожие вопросы