为什么SCTP不被广泛使用/知道?

215

我最近看了Richard Stevens的书《UNIX网络编程,卷1》,发现除了TCP和UDP之外还有第三种传输层标准:SCTP

简介:SCTP是一种传输层协议,像UDP一样以消息为驱动,但像TCP一样可靠。这里有一篇来自IBM DeveloperWorks的简短介绍

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

SCTP为什么如此无名?为什么它没有被广泛使用?


1
有人愿意比较SCTP和ZeroMQ吗(除了一个是协议,另一个是库——将它们视为解决问题的工具)? - Emil Ivanov
我只是好奇:2013年3月1日有什么问题/不同之处吗?为什么会有这么多投票在这一天? - dmeister
8
因为dmeister将您发到Reddit上。来自达姆施塔特的问候。 - Janus Troelsen
40
请不要写下3/1/2013。最好使用“March 1st 2013”、“1-Mar-2013”或“Mar 1st '13”中的任何一种。只是不要以可能被误解的方式写出月份和日期。 - Zecc
实际上有许多标准的传输层协议和无数专有的协议。 - Ron Maupin
在需要的情况下,您可以在此处找到SCTP的RFC 链接 - Pooya
11个回答

108

SCTP大多数情况下用于电信领域。传统上,电信交换机使用SS7(信令系统第七版)来连接电信网络中的不同实体。例如——电信提供商的用户数据库(HLR),与交换机(MSC),连接到的用户(MSC)。

电信领域正在向更高速度和更可达的环境迈进。其中一个变化是通过一些更优雅、更快速和更灵活的基于IP的协议来替换SS7协议。

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

相比之下,IP网络是开放的,但不可靠,如果不能处理SS7处理的负载,电信公司就不会转向它。这就是为什么SCTP被开发出来的原因。它试图:

  • 模仿几十年累积的SS7网络的所有优点。
  • 创建一个比TCP更好的面向连接的协议,在速度、安全性和冗余方面都有所提升。

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


请查看IETF的“SIGTRAN”工作组的输出,该工作组撰写了SS7和SCTP之间的映射。 - Alnitak
30
SCTP 在公共互联网上应用较少的主要原因可能是由于住宅IPv4/NAT网关需要具备SCTP感知功能,以支持多个同时私有端点和外部主机之间的多路复用关联。随着IPv6过渡加速推进,预计SCTP将变得更加实用。 - james woodyatt
@jameswoodyatt 有一些基于库的SCTP over UDP实现。它解决了一些消费级路由器的问题。 - user7610
1
这完全没有回答问题。詹姆斯的回复包含的信息比实际答案多。 - Ken Sharp
1
@jameswoodyatt 我曾经使用过的普通路由器都支持它,甚至包括一些相当老的型号。问题在于它没有通过常规用户界面公开展示,因此您必须对系统进行某些可怕的操作才能进入配置界面。在我看来,这是一个疏忽。 - Perkins
更新:现在SCTP已广泛用于WebRTC数据通道。 - Andrey Moiseev

75

我们目前在几个应用中部署SCTP,但是遇到了各种家用路由器中SCTP支持的重大问题。它们无法正确处理SCTP。我相信主要是性能问题(SCTP协议规范要求重新计算整个数据包的校验和而不仅仅是头部)。

像许多其他有前途的协议一样,直到D-link和Netgear修复其破损的NAT盒子,SCTP都很遗憾地陷于停滞。


8
哇,我之前不知道这个门槛存在。您说得对——请参见http://tools.ietf.org/html/draft-ietf-behave-sctpnat-05了解关于绕过此问题的建议方式。这是同一主题的第三组互联网草案。 - Bwooce
1
你听起来相当悲观 - 至少对于家用路由器而言。假设在专业生产环境中使用的路由器支持它,SCTP仍然非常有用。有很多使用案例,其中网络拓扑不离开数据中心的情况下,SCTP应该是完美的选择。 - Evgeniy Berezovsky
8
自从我发布了那个答案以来已经过去了几年。我的印象是,自那时以来SCTP并没有取得重大进展。它仍然在一些受控环境中的少数专业应用程序中使用,但在实际应用中很少见到。Windows和Mac OS X仍然默认不支持SCTP。由于缺乏熟悉度以及大多数防火墙和NAT设备无法识别该协议而导致其易被破坏,人们不愿使用它。 - pehrs
1
@pehrs 我想在数据中心内使用它,因此不涉及NAT和防火墙,除了操作系统内置的防火墙。在Linux服务器环境中,我希望它可以正常工作。但即使使用Windows,也有SCTP库 - 而且我相信不需要对操作系统进行修改。 - Evgeniy Berezovsky
1
SCTP通常在Linux中未启用,因为它缺乏采用率,但即使在我的Ubuntu Precise(旧版)系统中,它也可作为可加载模块使用。提供一个希望使用SCTP但会回退到TCP(例如)的应用程序类似于双栈,但更加痛苦。 - Ken Sharp
显示剩余2条评论

62

SCTP并不是很知名,也没有被广泛使用/部署,因为:

  • 普及程度:在TCP/IP堆栈中并未被广泛集成(2013年:最新的Mac OSX和Windows仍然缺少本地支持。2020年更新:Windows和Mac OS X仍然没有)
  • 库:易于使用的语言中只有几个高级绑定(免责声明:我是pysctp的维护者,这是Python的SCTP易用堆栈支持)
  • NAT:不太/完全不能穿越NAT(不到1%的家庭和企业路由器对SCTP进行NAT)。
  • 流行度:没有一般公共应用程序使用它
  • 编程范式:它有点改变了:它仍然是一个套接字,但您可以将许多主机连接到许多主机(多宿主),数据报是有序和可靠的等等...
  • 复杂性:SCTP堆栈实现起来比较复杂(由于上述原因)
  • 竞争:多路径TCP正在出现,应该解决多宿主需求/能力,因此人们尽可能避免实现SCTP,等待MTCP
  • 利基市场:SCTP填充的需求非常特殊(有序可靠的数据报,多流),并且不需要太多的应用程序
  • 安全性:SCTP规避安全控制(一些防火墙,大多数IDS,所有DLP除外,在netstat中不出现,除了CentOS / Redhat / Fedora...)
  • 审计能力:全球只有三家公司定期进行SCTP安全审计(免责声明:我在其中一家公司工作)
  • 学习曲线:没有太多的工具链可以使用SCTP(请检查优秀的withsctp,它与netcat很好地结合使用,或者使用socat,2020年编辑:nmap现在已支持它)
  • 底层:主要用于电信,每次您发送短信,开始在移动设备上浏览网络或打电话时,通常会触发流经SCTP的消息(SIGTRAN/SS7与GSM/UMTS,LTE/IMS/RCS与直径,LTE的S1AP/X2AP),因此您实际上经常使用它,但您从未了解过;-)2020年编辑:它正在从核心5G网络中删除(不再有直径,而是HTTP/2),并且仅在5G无线访问网络之间的天线和核心之间使用。

17
关于“Niche / not needed by much applications”的反馈。网络浏览器可以从中受益,参见HTTP2及其对实现的尝试,在TCP之上,一些SCTP免费提供的内容。大多数HTTP优化技术(如图像合并、分片、内联、串联)将被SCTP几乎完全取代(但HTTP1的浪费头仍未解决)。对于具有连接池以启用对数据库或任何其他服务的并发访问的应用程序也是如此。换句话说:很多应用程序需要SCTP的某些功能。 - Evgeniy Berezovsky
7
“没有公共应用程序使用它”:这个说法已经不再正确,因为SCTP被WebRTC使用了。 “安全性:SCTP规避安全控制” - 这更多是“安全”控制的问题。如果它确实避开了那些检查,那么对于恶意软件来说,这将是一个保持低调的绝妙协议。 - Maciej Piechotka
你是说SCTP正在被HTTP/2取代吗?那里有人听说过"层次违规"的概念吗? - undefined

59
SCTP需要在应用程序中进行更多的设计,以充分利用它。SCTP比TCP拥有更多的选项,类似于套接字API的支持较晚,且年轻。然而,我认为大多数人如果花时间去了解它(并且知道TCP的缺点),就会欣赏它--它是一种基于我们对TCP和UDP了解的30年经验而设计的协议。
其中一个需要细心考虑的方面是流。流通常提供它们内部的顺序保证(类似于TCP连接),但是每个SCTP连接可以有多个流(我认为你可以将其关闭)。如果您的应用程序数据可以通过多个流发送,则可以避免因一个错误的数据包而导致接收方饥饿的情况。有效地,不同的对话可以在同一连接上进行而互不影响。
另一个有用的补充是多重主机支持--一个连接可以跨越两端的多个接口,并且可以处理故障。在TCP中,您可以在应用程序层模拟此功能。
适当的链路心跳检测是任何使用TCP进行非瞬态连接的应用程序实现的第一件事,而它在SCTP中是免费的。
我的个人总结是SCTP并没有做什么你不能用其他方式在TCP或UDP中实现,只是提供了不必自己(糟糕地)实现该代码的能力。
FYI,SCTP被强制要求为Diameter(cf RADIUS next gen)提供支持。请参阅RFC 3588。
   直径客户端必须支持TCP或SCTP,而代理和服务器必须同时支持两者。本规范的未来版本可能会强制要求客户端支持SCTP。

16

p1. SCTP直接映射到IPv4需要NAT网关的支持,但是这在任何地方都没有得到广泛部署,如果没有它,典型的NAT网关一次只能允许一个私有主机使用SCTP。

p2. 将SCTP映射到UDP / IPv4可以允许更多的私有主机共享一个公共地址,但IPv4 / NAT网关中的UDP映射因UDP是一种无连接传输协议而且没有任何明确的状态来跟踪,所以建立和维护起来非常棘手。

p3. 直接将SCTP映射到IPv6需要... 嗯... IPv6。您尝试过部署IPv6吗? 如果是,请尝试购买IPv6防火墙? 是否支持SCTP? 负载均衡器呢? SSL加速器呢?

p4. 最后,互联网很大程度上受限于可通过TCP端口80和443传输的内容大小,因此任何类型的SCTP都会在这方面失去优势。 因此,您会看到IETF中像MPTCP这样的工作组正在努力。


2
你尝试过购买IPv6防火墙吗?它是否支持SCTP协议?通常免费分发的iptables可以很好地支持它们。但我不是网络专家,对于其他方面我无法作出评论。 - Hi-Angel
10年后,在Linux上通过图形用户界面进行IPv6和SCTP防火墙设置变得更加顺畅。 - undefined

14

忘了提到WebRTC的主要重点是结合视频和音频流。它不应该被用作消息中继。turn/ice/stun服务是WebRTC技术的另一部分。但这些技术是WebRTC使用的,而不是WebRTC本身。 - TamusJRoyce

7
阅读SCTP维基百科页面,我认为主要原因是SCTP是一个非常年轻的协议(于2000年提出),目前不受主流操作系统(WindowsOS XLinux)支持。
如果“非常年轻”似乎不合适,请考虑IPV6:“尽管IPv6作为标准跟踪协议已经迈入第十个年头,但在全球范围内的部署方面,IPv6仍处于起步阶段。”

4
根据你提供的维基百科链接,SCTP 已经在 Linux、Solaris、FreeBSD、HP-UX 等操作系统中实现。 - drrlvn
4
这篇文章现在也提到它可以在 macOS 和 Windows 上运行。 - dmeister

5

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


3

2

可能不是很出名,但也不是没有用过。最近,在IETF上发布了一份草案,介绍了使用SCTP作为HTTP传输层协议的方法。


3
当你说“不是未使用的”时,我想到了协议的实际使用。但是,你只给出了一个草案文档的例子,这可能会在将来潜在地导致实际使用。 - Kissaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接