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 line# 1874 和 lksctp 用户空间库中正确实现。

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

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

4

1 回答 1

1

你可以:

  • 增加 SO_SNDBUF (通过 setsockopt() )

  • 进行自己的组装/重新组装,例如在每个数据包上添加一个小标头,以标识每个数据包是较大帧的哪一部分。(在这方面有很多现有的协议可以借鉴 - IP 就是一个具有分段机制的示例)您只需要编码 3 个值:“片段开始”、“片段中间”和“最后一个片段” . 如果您不想将其添加到数据包的有效负载中,请在 SCTP ppid 中对分段信息进行编码。

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

  • 将 SCTP 用作单个流 API(正如您使用 socket(AF_INTET, SOCK_STREAM, IPPROTO_SCTP); 获得的那样)并以一种常用的方式对消息进行分段,就像您使用 TCP 一样 - 例如通过上述发送长度的技术场地。

于 2014-09-23T12:49:52.940 回答