2014-09-23 103 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