В SCTP INIT отсутствует параметр адреса IPv4 - PullRequest
0 голосов
/ 13 сентября 2018

Я тестировал поддержку SCTP на Java + lksctp. Я написал простой клиент, чтобы увидеть только начальную настройку ассоциации SCTP, которая в основном представляет собой INIT и INIT ACK. Я проверил 2 способа для Клиента отправить «INIT» на СЕРВЕР, который в основном:

  • создать объект SctpChannel с помощью "open (SocketAddress)"

    try {
        InetSocketAddress socketAddress = new InetSocketAddress("192.168.52.197", 2905);
        SctpChannel sctpChannel = SctpChannel.open(socketAddress,1,1); 
        sctpChannel.bind(new InetSocketAddress("192.168.1.251",2906)); 
        sctpChannel.connect(socketAddress, 1 ,1);
    

таким образом, я вижу в Wireshark, что у меня есть «Параметр IPv4-адреса» для всех моих сетевых интерфейсов (3, как вы можете видеть ниже), но Исходный порт получает номер дополнительного порта вместо 2906 как Я хотел бы иметь, и это в безвыходном положении.

enter image description here


Итак ... после привязки локального IP / порта после «открытия» ... поэтому я изменил код на:

  • создать объект SctpChannel, который просто "open ()"

  • привязка локального IP-адреса клиента и порта

  • «подключиться» к удаленному серверу IP и порт

    try {
        InetSocketAddress socketAddress = new InetSocketAddress("192.168.52.197", 2905);
        SctpChannel sctpChannel = SctpChannel.open(); 
        sctpChannel.bind(new InetSocketAddress("192.168.1.251",2906)); 
        sctpChannel.connect(socketAddress, 1 ,1);
    

Таким образом, я вижу в wireshark, что ожидаются порты источника / назначения (2906/2905), но у INIT нет «параметра адреса IPv4».

enter image description here

Так кто-нибудь знает, почему во втором коде мне не хватает "параметра адреса IPv4" в INIT? Я что-то пропустил?

Любая помощь будет очень кстати.

Спасибо.

1 Ответ

0 голосов
/ 13 сентября 2018

IP-адреса в чанках INIT / INIT_ACK являются необязательными параметрами.В случае, если ваши конечные точки обозначены символом, IP-адрес может быть не включен в блок INIT / INIT_ACK.Удаленный конец все еще может получать информацию об адресе однорангового узла из заголовка IP.

Принципиально причиной такого поведения является то, какие параметры вы передаете open ().Open () без каких-либо параметров и open () с указанным удаленным адресом работает по-другому.

Если вы вызываете SctpChannel.open(socketAddress,1,1) с адресом сокета для удаленного конца, он эффективно открывает канал и подключается к удаленному концу (см. открыть документацию . В этом вызовы bind () и connect ()случай довольно бесполезен. Так как до установления соединения не было вызова bind (), вы как бы используете конечную точку «по умолчанию» со случайным портом (56044) и IP-адресами всех доступных интерфейсов.

В секундуслучай, когда вы не определяете socketAddress для open (), он просто открывает канал, но не подключается к удаленному концу на этом этапе. Таким образом, ваш вызов bind () успешно указывает данные конечной точки (порт и IP-адрес) и когда вы вызываете connect() фактически он использует только что созданную вами конечную точку (192.168.1.251:2906) для установки соединения с удаленным концом.

...