我想就SCTP是否真的无序再多说几嘴:
虽然SCTP有Stream Sequence Number,有U flag,但是实际上,这些做的,都仅仅是让到达的数据包提早进入用户层的手段,
而实际上,SCTP的拥塞控制算法,非常强烈的依赖于传输的顺序,如果chunk在传输过程中出现了乱序,后发的先到,则先发的后到,则当后发先至收到的那一刻起,先发而尚未到(即使马上就会到)的这个"洞"就会被判定为丢包,会触发GAP report,而一个TSN被三次GAP report指认,则会进入Fast Retransmit,而这个名字看上去Fast,实际上一点都不Fast,前头我已经讲过了。而且它的恢复也强烈依赖于RTT,对于长距离多路径的网络,乱序是很常见的,而乱序之后导致的降速,因为RTT大,恢复非常慢,这意味着SCTP的连接非常脆弱,很容易降速,并很难恢复。
https://www.rfc-editor.org/rfc/rfc4960#section-7.2.4
In the absence of data loss, an endpoint performs delayed
acknowledgement. However, whenever an endpoint notices a hole in the
arriving TSN sequence, it SHOULD start sending a SACK back every time
a packet arrives carrying data until the hole is filled.
Whenever an endpoint receives a SACK that indicates that some TSNs
are missing, it SHOULD wait for two further miss indications (via
subsequent SACKs for a total of three missing reports) on the same
TSNs before taking action with regard to Fast Retransmit.
这里因为乱序导致的降速,无论你是用多个流,还是set U flag,都不能豁免,所以即使你把一个"洞"之后的包提交给用户层,这个洞却会引发SCTP本身一系列的反应
所以本质上,我可以这么讲,SCTP其实非常非常依赖于顺序并对失序非常脆弱
TCP虽然要求顺序,但是它的拥塞控制算法进化了好多次了,Reno,Vegas,BIC,New-Reno,BBR,所以它对于失序的耐受程度要比SCTP好得多
虽然我对SCTP并不是滚瓜烂熟,但是至少我也是debug过现实问题的,rfc 4960的某些章节也是仔细读过的
至于你说的内核,我从来不都觉得内核就怎么高大上了,debug问题最后发现问题在内核,给内核打个patch,这虽然不是每天都发生,但也不是什么高深的东西
至于你又是扯某为,又是沾Oracle的,我都不知道你真的读过RFC没
顺便说一句,无论是某为还是Oracle,在我眼里都是普通的公司,没有光环
【 在 iwannabe 的大作中提到: 】
:
https://docs.oracle.com/cd/E95619_01/html/esbc_ecz810_configuration/GUID-AB031: B53-8C69-4B73-BBBC-081742853093.htm#GUID-B23CF5FD-B001-4F58-8873-B8BF1C7846BD
: 给你举一个sctp unorder transmission的一个案例
: ...................
--
FROM 123.168.94.*