繁体   English   中英

SCTP订购了邮件传递

[英]SCTP ordered message delivery

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

我们来做这个实验:

1)使用此SCTP-discard-server和此SCTP客户端

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算法。

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

您可能缺少的是SCTP不保证关联内的顺序传递。 仅在流中保证顺序传送。

正如RFC 4960第1.5.2章所述

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

我猜你有一个以上的蒸汽配置,你使用的实现分配流之间的负载。 这应该很容易通过wireshark跟踪确认。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM