SCTP有序消息传递

4

是否有可能强制SCTP完全按顺序发送所有数据?

让我们进行这个实验:

1)使用SCTP-discard-serverSCTP-client

2)让客户端多次计数到100,并分别将一个字节发送到服务器。

for(long i=0; i< 1000000000; i++){
    char temp = (char)(i%100) + 1;
    usrsctp_sendv(
        sock, (void *)&temp, 1,
        NULL, 0, NULL, 0, SCTP_SENDV_NOINFO, 0
    );
}

3)让服务器沿着相同的方式计数,并将其数字与接收到的数字进行比较。

printf("%d %d\n", (int)buffer[0], (int)(test));
if ((int)test != (int)buffer[0]) break;

几秒钟后:
66 66
67 67
68 68
69 69
51 70

看这里!

我使用gcc7.3.0在我的Ubuntu 18.04机器上编译了$ gcc discard_server.c -Wall -lusrsctp。是的,我已经尝试通过SCTP_NODELAY禁用了所有类型的nagel算法。

我错过了什么?提前感谢任何提示。

2个回答

3
你可能忽略了 SCTP 在联合内部并不保证按顺序传递。只有在流中才能保证按顺序传递。
正如 RFC 4960 第1.5.2章 中所述:
“在内部,SCTP 为每个由 SCTP 用户传递给它的消息分配一个流序列号。在接收端,SCTP 确保消息在给定流中按顺序传递给 SCTP 用户。但是,当一个流被阻塞等待下一个按顺序的用户消息时,来自其他流的传递可以继续进行。”
我猜您配置了多个流,并且正在使用的实现在流之间分配负载。这应该很容易通过 wireshark 跟踪来确认。
如果您关心消息顺序,则应在发送数据时指定流 ID,并在到达时检查流 ID。

1
我发现,例如套接字缓冲区已满时,usrsctp_sendv(..)可能会失败。这就是所发生的事情。
我尝试了while(usrsctp_sendv(..) < 0),现在客户端和服务器可以正确计数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接