以一对多样式打开SCTP套接字[SOCK_SEQPACKET]我无法发送/接收大于SO_SNDBUF的消息。这符合draft-ietf-tsvwg-sctpsocket-14.txt第7.1.7节。 SO_SNDBUF,在linux内核模块3.16.3 net / sctp / socket.c行#1874和lksctp用户空间库中正确实现。
使用sctp协议发送大于指定大小的邮件时,我有哪些选项/策略?
一个例子: 在发送方面分解消息并设置ppid = seq_number然后在接收方重新组装原始消息。
答案 0 :(得分:1)
你可以:
增加SO_SNDBUF(通过setsockopt())
进行自己的装配/重新组装,例如在每个数据包上添加一个小标题 它标识每个数据包所在的较大帧的哪个部分。 (现有的很多 在这方面提出想法的协议 - 知识产权作为一个具有分散机制的例子) 您只需要编码3个值:"片段的开始","片段的中间"和#34;最后一个片段"。 如果您不想将其添加到数据包的有效负载中,则需要对碎片信息进行编码 在SCTP ppid。
另一种简单的分段方法是在第一个数据包上发送总长度,在发送数据包时将数据包分解为不超过SO_SNDBUF,在接收器上读取所需的数据包数量直到你拥有所有数据包初始长度字段给出的数据。由于SCTP已经可靠,这避免了一般情况下您需要的许多怪癖。虽然您必须确保所有片段都在同一SCTP流上发送。
使用SCTP作为单个流API(正如您使用套接字(AF_INTET,SOCK_STREAM,IPPROTO_SCTP);)和片段消息的常用方式之一就像您使用TCP一样 - 例如通过上述发送长度字段的技术。