Проблемы с подключением SCTP, когда оба конца имеют одинаковый IP-адрес в разных сетях - PullRequest
0 голосов
/ 06 мая 2020

Я столкнулся с интересной проблемой при работе над клиент-серверным приложением 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 проходит в течение нескольких секунд, прежде чем возникают проблемы с драйверами?

...