【问题标题】:SCTP ordered message deliverySCTP 有序消息传递
【发布时间】:2019-06-01 14:44:13
【问题描述】:

是否可以强制 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

瞧!

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

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

【问题讨论】:

    标签: c packet sctp partial-ordering


    【解决方案1】:

    您可能缺少的是 SCTP 不保证关联内的顺序交付这一事实。仅在流中保证顺序传递。

    正如RFC 4960 chapter 1.5.2 所说:

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

    我猜您配置了不止一个流,并且您使用的实现在流之间分配负载。这应该很容易通过wireshark跟踪确认。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-09-19
        • 2021-10-13
        • 1970-01-01
        • 2021-10-12
        • 2014-08-11
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多