不是我挑毛病,unorder transmission这个词一出来,我才知道,你可能从来也没明白unodered 这个词在SCTP里面是什么意思
SCTP的U flag提供的是unordered delivery,delivery是指的SCTP到Upper Layer Protocol (ULP)这个位置,仅仅指SCTP收到了消息之后,可以不用重排序提交给ULP,这是在接收方内部的事情,
从一个SCTP endpoint到另一个SCTP endpoint,这叫做transmission,从来都强烈依赖order,说unorder transmission,这肯定是错的
不信你去kernel里面搜SCTP_DATA_UNORDERED,你看看它出现的地方,哪个地方与transmission有关系?
下面三个和statistic有关:
if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
SCTP_INC_STATS(net, SCTP_MIB_OUTUNORDERCHUNKS);
if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
asoc->stats.ouodchunks++;
if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
SCTP_INC_STATS(net, SCTP_MIB_INUNORDERCHUNKS);
if (chunk->asoc)
chunk->asoc->stats.iuodchunks++;
下面这段是PR-SCTP扩展里面的,但是也和unordered transmission打不着关系,因为PR-SCTP本身就是ordered:
if (TSN_lte(tsn, asoc->adv_peer_ack_point+1)) {
asoc->adv_peer_ack_point = tsn;
if (chunk->chunk_hdr->flags &
SCTP_DATA_UNORDERED)
continue;
skip_pos = sctp_get_skip_pos(&ftsn_skip_arr[0],
nskips,
chunk->subh.data_hdr->stream);
ftsn_skip_arr[skip_pos].stream =
chunk->subh.data_hdr->stream;
ftsn_skip_arr[skip_pos].ssn =
chunk->subh.data_hdr->ssn;
if (skip_pos == nskips)
nskips++;
if (nskips == 10)
break;
} else
下面这两个和跳过stream sequence number的设置有关:
if (sinfo->sinfo_flags & SCTP_UNORDERED) {
flags |= SCTP_DATA_UNORDERED;
dp.ssn = 0;
if (lchunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
ssn = 0;
下面两个就是和ULP直接相关:
if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
event->flags |= SCTP_UNORDERED;
event->cumtsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
}
/* Check if this message needs ordering. */
if (SCTP_DATA_UNORDERED & event->msg_flags)
return event;
所以,无论是你找RFC,还是扒kernel的code,你看哪里能提供unordered transmission?
【 在 iwannabe 的大作中提到: 】
: 我理解你,犯了一个错误要用更多的只是展示自己多nb的心情
: 可是sctp支持unorder transmission且有实际使用场景,这个你承认吧,别的就不用bb了
: 。
: ...................
--
FROM 123.168.94.*