Назад | Перейти на главную страницу

Все сетевые интерфейсы зависают на секунды, пока один интерфейс выходит из строя

Я создаю клиент-серверное приложение, которое использует несколько сетевых интерфейсов параллельно для резервирования, и я заметил, что, когда один сетевой интерфейс выходит из строя или повышается, связь на других интерфейсах зависает на несколько секунд.

Я мог бы воспроизвести это поведение без моего приложения простым способом:

Зависание также происходит, если я снова включаю соединение WiFi на компьютере 1. Это также происходит, если я проверяю IP-адрес WiFi и выключаю / включаю соединение Ethernet (или отсоединяю / подключаю кабель).

Я использую Linux Ubuntu 12.04 на обоих компьютерах.

Есть идеи, почему это происходит, и если / как этого можно избежать?

Это связано с интересным сочетанием «беспорядочного ARP» в Linux и кэширования ARP. По сути, происходит то, что Wi-Fi, несмотря на то, что у него нет IP-адреса, получает запросы ARP и отправляет ответы ARP. Если это ответ ARP, который другой компьютер в локальной подсети (обычно маршрутизатор) получает первым, он будет помещен в кэш ARP. Пауза в трафике разрешается, когда запись ARP устаревает и запрос ARP повторяется, после чего другой интерфейс дает единственный ответ, и все идет нормально.

Чтобы Linux не выполнял этот «ARP на всех интерфейсах для любого настроенного адреса», вам необходимо установить sysctl net.ipv4.conf.<interface>.arp_ignore к 1.