SCTP订购消息传递

时间:2019-01-06 20:52:52

标签: c packet sctp partial-ordering

是否可以强制 SCTP 发送所有有序的数据?

让我们做这个实验:

1)拿这个SCTP-discard-server和这个SCTP-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

Voila!

我在我的 Ubuntu 18.04 计算机上使用 gcc7.3.0 $ gcc discard_server.c -Wall -lusrsctp对此进行了编译。是的,我已经尝试通过SCTP_NODELAY禁用各种nagel算法。

我想念什么?预先感谢您的任何提示。

2 个答案:

答案 0 :(得分:2)

您可能会缺少的事实是SCTP无法保证关联中的顺序传递。仅在流中保证顺序传送。

RFC 4960 chapter 1.5.2说:

  

在内部,SCTP为每个分配一个流序列号      SCTP用户传递给它的消息。在接收方,SCTP      确保按顺序将消息传递给SCTP用户      在给定的流中。但是,虽然一个流可能会被阻止      等待下一个顺序用户消息,其他消息传递      流可能会继续。

我想您配置了一个以上的流,并且您使用的实现会在流之间分配负载。通过Wireshark跟踪可以很容易地确认这一点。

如果携带消息顺序,则应在发送数据时指定流ID,并在到达时检查流ID。

答案 1 :(得分:0)

我发现,例如套接字缓冲区已满,usrsctp_sendv(..)可能会失败。这就是发生的事情。

我尝试了while(usrsctp_sendv(..) < 0),现在客户端和服务器的计数正确。