【问题标题】:does lksctp support sending large messageslksctp 是否支持发送大消息
【发布时间】:2014-09-23 20:55:19
【问题描述】:

以一对多样式打开 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 然后在接收方重新组装原始消息。

【问题讨论】:

    标签: sockets sctp


    【解决方案1】:

    你可以:

    • 增加 SO_SNDBUF(通过 setsockopt() )

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

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

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

    【讨论】:

    • 观察:如已发布的草案第 4.1.1 节所述,一对多/SOCK_SEQPACKET 套接字不支持流;也只有在设置时才能保证订单;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2011-03-21
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多