Я создаю клиент-серверное приложение, которое использует несколько сетевых интерфейсов параллельно для дублирования, и я заметил, что, в то время как один сетевой интерфейс понижается или повышается, коммуникация в других интерфейсах зависает в течение нескольких секунд.
Я мог воспроизвести это поведение без своего приложения простым способом:
Зависание происходит также, если я возвращаюсь на соединении WiFi на компьютере 1. Это происходит также, если я проверяю с помощью ping-запросов WiFi IP и поворот от/на соединения Ethernet (или отключаю/включаю кабель).
Я использую Linux Ubuntu 12.04 на обоих компьютерах.
Какие-либо идеи, почему это происходит, и если / как этого можно избежать?
Это связано с интересной комбинацией "неразборчивого ARP" поведения Linux и ARP-кэширования. По сути, происходит то, что wifi, несмотря на отсутствие IP-адреса, принимает ARP-запросы и посылает ARP-ответы. Если это и есть ARP-ответ, который другая машина в локальной подсети (обычно это маршрутизатор) получает первой, то это то, что попадает в ARP-кэш. Пауза в трафике разрешается, когда запись ARP затухает и ARP-запрос повторяется, и тогда другой интерфейс дает единственный ответ, и все идет нормально.
Чтобы Linux не делал этого "ARP на всех интерфейсах для любого настроенного адреса", необходимо установить sysctl net.ipv4.conf.
на 1
.