2014-09-23 140 views
0

使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用户空间库中正确实现。lksctp支持发送大量消息

为了使用sctp协议发送大于指定大小的消息,我有哪些选项/策略?

举例: 在发送方分解消息并设置ppid = seq_number,然后在接收方重新组装原始消息。

回答

1

您可以:

  • 增加SO_SNDBUF(通过调用setsockopt())

  • 做你自己的组装/重新组装,例如在每个数据包 上加上一个小标题,标识每个数据包的较大帧的哪一部分。 (有很多现有的 协议来从这方面提取想法--IP作为具有分段机制的一个示例) 您只需编码3个值:“片段开始”,“片段中间”和“最后一个片段”分段”。 如果您不希望将其添加到数据包的有效负载中,则可以在SCTP ppid中对碎片信息 进行编码。

    另一个简单的分段方法是只发送第一个数据包的总长度,当你发送数据包的时候把数据包分解成不超过SO_SNDBUF,然后在接收器上读取所需的数据包数量,直到你所有数据由初始长度字段给出。由于SCTP已经可靠,这就避免了一般情况下需要的许多怪癖。尽管您必须确保所有片段都在同一个SCTP流上发送。

  • 使用SCTP作为一个单一的流API(正如你使用套接字(AF_INTET,SOCK_STREAM,IPPROTO_SCTP);)和片段消息的方式之一,就像你正在使用TCP一样。通过上述发送长度字段的技术。

+0

观察:如在已发布的草案部分4.1.1中注意到的,一个到多个/ SOCK_SEQPACKET套接字不支持流;订单只有在设定时才能保证; – 2014-09-23 22:08:43