What went wrong: SCTP (2009)
blog.ipspace.net
blog.ipspace.net
Ah. "Ivan Pepelnjak, CCIE#1354 Emeritus, is an independent network architect." Ivan Pepelnjak also doesn't seem to understand network protocols. SCTP was never intended to be a TCP replacement or a basis for TCP or whatever the hell he thinks it to be. It is a separate protocol which is designed to provide a different set of features to a different set of applications.
I'm sorry that he and the large number of people like him, who would like to have exactly their use-case covered by exactly the simplest possible interface, preferably baked into the kernel or even better, the hardware, for the best performance. It's not going to happen.
I'm also sorry I have to live in a world where networking === TCP, over port 80 or 443. It wasn't supposed to be this way.
What went wrong with SCTP? By the time TCP-friendly congestion control research had reached a critical mass and started producing results, everyone had given up, adopted TCP as the sole transport protocol, and the deck was strongly stacked against anything that wasn't running on TCP.
These days, people justify HTTP for everything with the argument that opening up a TCP socket is not guaranteed to work as reliably as HTTP-over-TCP.
They might be right, but god that sucks.
TCP should have been built on top of UDP, as should ICMP. The IP "protocol" field doesn't do us much good. I don't think we should fret too much about not exploiting it.
But then there are some people who might be more interested in making a secure protocol from scratch (rejecting the layering complexity and third-party dependence of SSL). For instance: http://cr.yp.to/tcpip/minimalt-20130522.pdf
The original article was written 6 years ago and wasn't a novel position at the time. It's hard to say anything's changed since then because app developers are still blocked waiting on mainstream middle-box support and I don't see that really happening without some sort of pressure on the vendors.
SCTP support has just been removed from DragonFly. The code had been present for 15 years (inherited from FreeBSD) and in these 15 years there wasn't even a single known user.
If there really are people using it it's effectively in a very very small niche and they will have to do everything themselves. There is no way generic operating system developers can work on this protocol.
WebRTC is the most obvious candidate for this but maybe one of the HTTP2-over-SCTP experiments will go well enough that someone will ship it in a real browser and start the process of saying “Web users get n% performance improvements if SCTP is implemented”. That certainly seems like a rather long game to play, however.
Some time ago, I also did performance testing on SCTP vs. TCP. It's surprisingly sad how much worse SCTP's performance was compared to TCP. I imagine that this is because just isn't as much work put into SCTP as TCP.
Benchmarks should be consulted before preformance issues are debated.
Interestingly, Emscripten emulates UDP by using SCTP's unreliable data packet mode with max retransmission set to zero. Relatedly, there is an excellent library for game networking called enet, which implements reliable and unreliable transmission. Enet is included in Emscripten.
So if you use Enet in emscripten you have: Enet, which uses UDP, which is emulated via SCTP, which is transported via UDP! It's pretty crazy but it actually works well.
I think TCP is "good enough" for most cases, so people use it. SCTP is great, but TCP isn't broken. Worse is better and all that.
To me, the real promise of SCTP always seemed to be that it was a reliable out-of-order datagram protocol that played nicely with TCP. Essentially: that it killed the need for applications that can't deal with the slowness of in-order delivery in TCP to write their own protocols.
I think the big mistake with SCTP was in making it an IP protocol, rather than a protocol that lived underneath UDP.
your shiny iphone/andriod etc. are all multihomed...
It's shifted on the application developer, who is the "user" of the network stack.
MCTCP (which probably is most famous right now for being used by Apple for Siri) is a cool but complex hack on top of TCP to provide multi-homing without confusing middle-boxes. HTTP2/SPDY/QUIC have their own mechanisms to get multiple streams in one connection over TCP/UDP.
1) It makes the SCTP header complex. Without it, IP address in IP header is sufficient. With it, IP addresses have to appear in SCTP header too.
2) Multi-homing makes it difficult to configure firewall rules, for example NAT(Network Address Translation). Linux tools like iptables, LVS(Linux Virtual Server) do not work well with it.
3) I think the benefit of multi-homing can be gained in Network-layer or Data-Link layer instead of transport layer, for example network interface bonding, etc. It relieves the complexity of the application in this way.
I must iterate:" I’m taking a 3000-foot perspective here, it is still a far away perspective although less a 0 than the author, and whatever I’m writing could be completely wrong. If that’s the case, please point out my mistakes in your comments."
Has anyone implemented multihoming IPv6 capable of creating a continuous SSH session when switching networks?