WedX - журнал о программировании и компьютерных науках

Как сделать контрольную сумму SCTP отличной от нуля с помощью программирования на C

Я написал простой клиент/сервер SCTP и наблюдал рукопожатие SCTP через Wireshark. Контрольные суммы всех SCTP-пакетов в Wireshark всегда равны нулю.

Как сделать ненулевую контрольную сумму SCTP?

Следующие библиотеки установлены в Ubuntu 18.04.

libsctp-dev:amd64    1.0.17+dfsg-2  
libsctp1:amd64       1.0.17+dfsg-2  
lksctp-tools         1.0.17+dfsg-2

sctp-server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>

int main(int argc, char** argv)
{
    int sockfd, client_sockfd;
    struct sockaddr_in serv_addr, client_addr;
    struct sctp_initmsg initmsg;
    int len;
    int addr_count = 1;

    sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
    if(sockfd < 0)
    {
        fprintf(stderr,"socket descriptor is invalid.");
        exit(1);
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(12345);

    int brst = sctp_bindx(sockfd,(struct sockaddr*)&serv_addr,addr_count,SCTP_BINDX_ADD_ADDR);
    if(brst == -1)
    {
        fprintf(stderr,"error while binding address.");
        exit(1);
    }

    memset(&initmsg,0,sizeof(initmsg));
    initmsg.sinit_max_instreams = 2;
    initmsg.sinit_num_ostreams = 2;
    brst = setsockopt(sockfd,IPPROTO_SCTP,SCTP_INITMSG,&initmsg,sizeof(initmsg));
    if(brst != 0)
    {
        fprintf(stderr,"error while setting sctp options.\n");
        exit(1);
    }

    listen(sockfd,5);
    while (1)
    {
        len = sizeof(client_addr);
        client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &len);

        if(client_sockfd == -1)
        {
            fprintf(stderr,"error while accepting connection, continue.\n");
            continue;
        }
        else
        {
            printf("New client\n");
            close(client_sockfd);
        }
    }
}

sctp-client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>

int main(int argc, char** argv)
{
    sctp_assoc_t associd;
    int sockfd;
    struct sockaddr_in serv_addr;
    struct sockaddr_in *addrs;
    int brst;
    struct sctp_initmsg initmsg;

    sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
    if(sockfd < 0)
    {
        fprintf(stderr,"error while initializing socket.\n");
        exit(1);
    }

    addrs = malloc(sizeof(struct sockaddr_in));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr("192.168.1.197");
    serv_addr.sin_port = htons(12345);

    memcpy(addrs,&serv_addr,sizeof(struct sockaddr_in));
    memset(&initmsg, 0, sizeof(initmsg));
    initmsg.sinit_max_instreams = 2;
    initmsg.sinit_num_ostreams = 2;

    brst = sctp_connectx(sockfd, (struct sockaddr*) &serv_addr, 1, &associd);
    if(brst < 0)
    {
        fprintf(stderr, "can not connect to host.\n");
        exit(1);
    }
    else
    {
        printf("connect ok %d\n", brst);
    }

    close(sockfd);
}

Компиляция

$ gcc sctp-server.c -lsctp -o server
$ gcc sctp-client.c -lsctp -o client

Wireshark

Frame 828: 100 bytes on wire (800 bits), 100 bytes captured (800 bits)
Linux cooked capture
Internet Protocol Version 4, Src: 192.168.1.197, Dst: 192.168.1.197
Stream Control Transmission Protocol, Src Port: 49208 (49208), Dst Port: 12345 (12345)
    Source port: 49208
    Destination port: 12345
    Verification tag: 0x00000000
    [Association index: 0]
    Checksum: 0x00000000 [unverified]
    [Checksum Status: Unverified]
    INIT chunk (Outbound streams: 10, inbound streams: 65535)
        Chunk type: INIT (1)
            0... .... = Bit: Stop processing of the packet
            .0.. .... = Bit: Do not report
        Chunk flags: 0x00
        Chunk length: 52
        Initiate tag: 0xd15eb4e4
        Advertised receiver window credit (a_rwnd): 106496
        Number of outbound streams: 10
        Number of inbound streams: 65535
        Initial TSN: 1069541083
        IPv4 address parameter (Address: 192.168.1.197)
        IPv4 address parameter (Address: 172.17.0.1)
        Supported address types parameter (Supported types: IPv4)
        ECN parameter
        Forward TSN supported parameter

  • @John Kugelman, извините, я редактирую вопрос и добавляю больше деталей. 12.05.2020
  • Спасибо за редактирование! Я проголосовал за повторное открытие вопроса. Пожалуйста, будьте терпеливы — открытие может занять некоторое время. 12.05.2020

Ответы:


1

Есть вероятность, что вы отключили контрольные суммы SCTP в ядре Linux, как указано в этом исправление. Чтобы убедиться в этом, запустите команду sysctl /sys/module/sctp/parameters/sctp_checksum_disable. Если результат равен 1, измените его на 0 и повторите попытку.

12.05.2020
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]