是否可以强制 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算法。
我想念什么?预先感谢您的任何提示。
答案 0 :(得分:2)
您可能会缺少的事实是SCTP无法保证关联中的顺序传递。仅在流中保证顺序传送。
在内部,SCTP为每个分配一个流序列号 SCTP用户传递给它的消息。在接收方,SCTP 确保按顺序将消息传递给SCTP用户 在给定的流中。但是,虽然一个流可能会被阻止 等待下一个顺序用户消息,其他消息传递 流可能会继续。
我想您配置了一个以上的流,并且您使用的实现会在流之间分配负载。通过Wireshark跟踪可以很容易地确认这一点。
如果携带消息顺序,则应在发送数据时指定流ID,并在到达时检查流ID。
答案 1 :(得分:0)
我发现,例如套接字缓冲区已满,usrsctp_sendv(..)
可能会失败。这就是发生的事情。
我尝试了while(usrsctp_sendv(..) < 0)
,现在客户端和服务器的计数正确。