为什么SCTP不常用/不为人所知

我最近看了理查兹史蒂文斯的书UNIX网络编程,第1卷,我发现除了TCP和UDP之外还有第三个传输层标准:SCTP

概要:SCTP是一种传输级协议,它像UDP一样是消息驱动的,但像TCP一样可靠。这是一个来自IBM DeveloperWorks的简短介绍

老实说,我以前从未听说过SCTP。我不记得在任何网络书籍中读到过它,也不记得在我上的课上听说过它。读其他stackoverflow问题提到SCTP表明,我并不是唯一缺乏这种知识的人。

为什么SCTP如此不为人知?为什么不怎么使用呢?

53463 次浏览

阅读SCTP维基百科页面,我想说的主要原因是SCTP是一个非常年轻的协议(在2000年提出),目前不被主流操作系统(窗户OS XLinux)支持。

如果“非常年轻”对你来说似乎不合适,想想IPV6:“2008年12月,尽管是作为标准跟踪协议的10周年纪念日,IPv6在全球范围内的普遍部署方面还处于起步阶段。”

它可能不为人所知,但也不是没有被使用过。最近,在IETF上发表了关于使用SCTP作为HTTP的传输层协议草案

Sctp诞生得太晚了,对于很多情况,TCP已经足够了。

此外,据我所知,它的大部分使用是在电信领域。

事实上,SCTP主要用于电信领域。传统上,电信交换机使用SS7 (7号信令系统)来连接电信网络中的不同实体。例如,电信供应商的用户数据库(HLR),通过交换机(MSC),用户也被连接(MSC)。

电信领域正在向更高的速度和更可达的环境发展。其中一个变化是用一些更优雅、更快、更灵活的基于ip的协议取代SS7协议。

电信领域非常保守。七号信令网络在这里已经使用了几十年。这是一个非常可靠和封闭的网络。这意味着普通用户无法访问它。

相比之下,IP网络是开放的,不可靠,如果它不能至少处理SS7处理的负载,电信公司就不会转换到IP网络。这就是开发SCTP的原因。它尝试:

  • 模仿SS7网络几十年来积累的所有优势。
  • 创建一个在速度、安全性和冗余方面优于TCP的面向连接的协议

Linux的最新版本已经支持SCTP。

SCTP需要在应用程序中进行更多的设计,以便更好地利用它。它比TCP有更多的选择,类似socket的API是后来才出现的,而且它很年轻。然而,我认为大多数花时间理解它的人(并且知道TCP的缺点)都很欣赏它——这是一个设计良好的协议,建立在我们对TCP和UDP大约30年的知识之上。

其中一个需要思考的方面是流。流提供了(通常,我认为您可以关闭它)它们之间的顺序保证(很像TCP连接),但是每个SCTP连接可以有多个流。如果您的应用程序的数据可以通过多个流发送,那么您就可以避免由于一个错误放置的数据包而导致的接收端阻塞。有效地,不同的对话可以在同一个连接上进行,而不会相互影响。

另一个有用的附加功能是多归属支持——一个连接可以跨两端的多个接口,它可以处理故障。您可以在TCP中模拟这一点,但是是在应用层。

正确的链接心跳是任何使用TCP进行非瞬态连接的应用程序实现的第一件事,它是免费的。

我个人对SCTP的总结是,它没有做任何其他方式(在TCP或UDP中)在大量应用程序支持下不能做的事情。它所提供的是不必自己(糟糕地)实现代码的能力。

供参考,SCTP是强制支持的直径(cf RADIUS下一代)。参见RFC 3588

Diameter clients MUST support either TCP or SCTP, while agents and
servers MUST support both.  Future versions of this specification MAY
mandate that clients support SCTP.

我们现在已经在几个应用程序中部署了SCTP,并且在各种家用路由器中遇到了SCTP支持的重大问题。它们不能正确地处理SCTP。我认为这主要是一个性能问题(SCTP协议规范要求重新计算整个数据包的校验和,而不仅仅是报头)。

和许多其他有前途的协议一样,SCTP在D-link和Netgear修复它们坏掉的NAT盒子之前已经不幸地死在水里了。

p1。直接通过IPv4映射的SCTP需要NAT网关的支持,而NAT网关从未在任何地方广泛部署,如果没有它,典型的NAT网关一次只允许每个公共地址有一台私有主机使用SCTP。

p2。通过UDP/IPv4映射的SCTP允许每个公共地址有更多的私有主机,但是IPv4/NAT网关中的UDP映射非常难以建立和维护,因为UDP是一种无连接传输,没有任何显式的状态供NAT跟踪。

p3。SCTP直接映射到IPv6需要…嗯…IPv6。你试过部署IPv6吗?如果是的话,你试过买IPv6防火墙吗?是否支持SCTP?负载均衡器怎么样?SSL加速器?

p4。最后,许多Internet在很大程度上受到限制,只能通过TCP端口80和端口443进行传输,因此任何类型的SCTP都可能在这两个端口上丢失。因此,你可以在IETF中看到像MPTCP工作组这样的努力。

我们中的许多人很快就会使用SCTP,因为WebRTC数据通道使用它在UDP之上创建一个类似tcp的可靠层——SCTP基于DTLS基于UDP: https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb-data-channel-13#section-6

SCTP不是很为人所知,也不是经常使用/部署,因为:

  • 广泛的:没有在TCP/IP堆栈中广泛集成(2013年:在最新的Mac OSX和Windows中仍然没有本机集成。2020年更新:在Windows和Mac OSX中仍然没有集成)
  • 库:在易于使用的语言中很少高级绑定(免责声明:我是pysctp的维护者,SCTP对Python的简单堆栈支持)
  • NAT:没有很好地跨越NAT /根本(不到1%的互联网家庭&企业路由器在SCTP上进行NAT)。
  • 受欢迎程度:没有一般的公共应用程序使用它
  • 编程范例:它改变了一点:它仍然是一个套接字,但你可以连接许多主机到许多主机(多家),数据报是有序的和可靠的,erc…
  • 复杂性:SCTP堆栈实现起来很复杂(由于上述原因)
  • 竞争:多路径TCP即将到来,它应该能够解决多址需求/功能,因此人们在可能的情况下避免实现SCTP,而是等待MTCP
  • 小众:需要SCTP填充非常特殊(有序可靠数据报,多流),并且不需要很多应用程序
  • 安全性:SCTP逃避安全控制(一些防火墙,大多数idse,所有dlp,除了CentOS/Redhat/Fedora之外,不会出现在netstat上)
  • 可审计性:世界上大约有3家公司经常对SCTP安全性进行审计(免责声明:我在其中一家公司工作)
  • 学习曲线:没有太多的工具链来使用SCTP(检查出色的withsctp,它与netcat很好地结合或使用socat, 2020编辑:nmap现在已经支持它几年了)
  • 引擎盖下面:主要用于电信和每次你发送短信,开始在你的手机上网或打电话,你往往会触发消息流SCTP (SIGTRAN与GSM / UMTS / SS7,直径与LTE / IMS / RCS, S1AP / X2AP LTE),所以你实际上使用它很多但你永远不知道它;-)2020编辑:它被删除从核心5 g网络(直径,HTTP / 2)并将只用于天线之间的5 g无线接入网和核心。

SCTP广泛应用于4G LTE网络,其中Diameter用于AAA。

关于商业路由器被破坏或缺乏SCTP支持的所有评论,问题是带有NAT的SCTP仍处于IETF的草案形式。所以他们没有RFC规范来实现它。

https://datatracker.ietf.org/doc/html/draft-ietf-behave-sctpnat-09