Я столкнулся с интересной проблемой при работе над клиент-серверным приложением SCTP (написанным на C ++). Клиент регулярно отправлял пакеты. Первоначально пакеты были получены на дальнем конце. Однако через несколько секунд соединение каждый раз прерывалось. Это происходило даже при очень низких скоростях (10 маленьких пакетов / с). Wireshark показал, что соединение было прервано сервером, но очевидной причины не было. Вот моя настройка:
Мой P C имел две виртуальные машины Virtual Box под управлением Ubuntu. У меня были сети виртуальных машин, настроенные для одного интерфейса NAT и одного мостового интерфейса, поэтому каждая виртуальная машина имеет два интерфейса (и два IP-адреса).
VM 1 (server):
interface enp0s3 IP 10.0.2.15
interface enp0s8 IP 192.168.1.18
VM 2 (client):
interface enp0s3 IP 10.0.2.15
interface enp0s8 IP 192.168.1.19
Интерфейсы enp0s3 находятся в разных сетях, поэтому конфликта IP-адресов нет. Две виртуальные машины общаются друг с другом через интерфейс enp0s8.
Потратив около дня на исследования, я наконец нашел здесь объяснение (https://forums.freebsd.org/threads/sctp-connection-reset-after-about-5-seconds.50512/). По какой-то причине SCTP не нравится, что два конца имеют одинаковый IP-адрес, даже если этот IP-адрес / интерфейс не используется для соединения. Сервер был привязан к порту по адресу 192, клиентская сторона не вызывала привязку. Как только я изменил адрес enp0s3 на одной из виртуальных машин, проблема исчезла. Это меня удивило, потому что я ранее запускал TCP-трафик c в той же настройке и не имел никаких проблем.
У меня два вопроса:
Почему драйверы SCTP заботятся об интерфейсе который не используется?
Почему трафик c проходит в течение нескольких секунд, прежде чем возникают проблемы с драйверами?