我最近查看了Richards Stevens 撰写的"UNIX网络编程,第1卷"这本书,我发现除了TCP和UDP之外还有第三个传输层标准:SCTP.
简介:SCTP是一种传输级协议,它像UDP一样是消息驱动的,但是像TCP一样可靠.以下是IBM DeveloperWorks的简短介绍.
老实说,我以前从未听说过SCTP.我记不起在任何网络书籍中阅读它或在我参加的课程中听到它.阅读提到SCTP的其他stackoverflow问题表明,我并不孤单,因为缺乏这方面的知识.
为什么SCTP如此未知?为什么没用多少?
实际上,SCTP主要用于电信领域.传统上,电信交换机使用SS7(7号信令系统)来互连电信网络中的不同实体.例如 - 电信提供商的用户数据库(HLR),带有交换机(MSC),用户也连接(MSC).
电信领域正朝着更高的速度和更加可达的环境发展.其中一个变化是通过一些更优雅,快速和灵活的基于IP的协议来取代SS7协议.
电信领域非常保守.SS7网络已在这里使用了几十年.这是一个非常可靠和封闭的网络.这意味着普通用户无权访问它.
相比之下,IP网络是开放的,不可靠,如果电信不能处理至少SS7处理的负载,电信将不会转换为它.这就是SCTP开发的原因.它尝试:
模仿几十年来积累的SS7网络的所有优势.
在速度,安全性和冗余方面创建比TCP更好的面向连接的协议
最新版本的Linux已经支持SCTP.
我们现在已经在几个应用程序中部署SCTP,并且在各种家用路由器中遇到SCTP支持的重大问题.他们根本无法正确处理SCTP.我认为这主要是性能问题(SCTP协议规范要求重新计算整个数据包的校验和,而不仅仅是标题).
像许多其他有前途的协议一样,在D-link和Netgear修复他们破坏的NAT盒子之前,SCTP可悲地死在水中.
SCTP需要在应用程序中进行更多设计才能充分利用它.有比TCP更多的选项,类似套接字的API后来出现了,而且还很年轻.但是我认为大多数花时间去理解它的人(以及知道TCP的缺点的人)都很欣赏它 - 它是一个设计良好的协议,它基于我们对TCP和UDP的约30年的知识.
需要一些思考的一个方面是流.流提供(通常,我认为你可以关闭)它们内部的订单保证(很像TCP连接)但每个SCTP连接可以有多个流.如果您的应用程序的数据可以通过多个流发送,那么您可以避免由于一个错误的数据包导致接收器挨饿的线头阻塞.可以在同一连接上进行有效的不同对话,而不会相互影响.
另一个有用的补充是多宿主支持 - 一个连接可以跨越两端的多个接口,并且它可以应对故障.您可以在TCP中模拟它,但在应用程序层.
正确的链接心跳,这是任何使用TCP进行非瞬态连接的应用程序首先实现的,是免费的.
我个人对SCTP的总结是,它没有做任何你不能做的事情(在TCP或UDP中),并且有大量的应用程序支持.它提供的是不必自己实现该代码(严重)的能力.
仅供参考,SCTP被授权支持Diameter(参见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不是很知名,也没有大量使用/部署,因为:
广泛:未广泛集成在TCP/IP堆栈中(2013年:在最新的Mac OSX和Windows中仍然缺失)
库:易于使用的语言中很少有高级绑定(免责声明:我是pysctp的维护者,对Python的SCTP easy stack支持)
NAT:根本不能很好地交叉NAT(不到1%的互联网家庭和企业路由器在SCTP上进行NAT).
Popularity:没有一般公共应用程序使用它
编程范例:它改变了一点:它仍然是一个套接字,但你可以将许多主机连接到多个主机(多宿主),数据报是有序且可靠的,erc ......
复杂性:SCTP堆栈实现起来很复杂(由于上述原因)
竞争:多路径TCP即将到来,应该解决多宿主需求/能力,以便人们尽可能避免实施SCTP,等待MTCP
利基:需要SCTP填充是非常奇特的(有序的可靠数据报,多流)并且不需要太多的应用程序
安全性:SCTP规避了安全控制(一些防火墙,大多数IDS,所有DLP,除了CentOS/Redhat/Fedora之外,不会出现在netstat上......)
审计能力:世界上有3家公司经常对SCTP安全进行审计(免责声明:我在其中一家工作)
学习曲线:使用SCTP的工具链不多(检查优秀的withsctp与netcat结合使用或使用socat)
引擎盖下:主要用于电信,每次发送短信,开始在手机上网或打电话,你经常触发流过SCTP的消息(带GSM/UMTS的SIGTRAN/SS7,带LTE/IMS的Diameter)/RCS,S1AP/X2AP与LTE),所以你实际上使用它很多,但你永远不知道它;-)
P1.直接通过IPv4映射的SCTP需要NAT网关的支持,NAT网关从未在任何地方广泛部署,如果没有它,典型的NAT网关只允许每个公共地址一个私有主机一次使用SCTP.
P2.SCTP映射在UDP/IPv4的允许每公网地址更多的私人主机,但在支持IPv4/NAT网关UDP映射是出了名的棘手的建立和保持维持,由于这样的事实,UDP是没有任何明确的状态的连接传输的NAT追踪.
P3.直接通过IPv6映射的SCTP需要......好...... IPv6.您是否尝试部署IPv6?如果是这样,您是否尝试过购买IPv6防火墙?它支持SCTP吗?负载均衡器怎么样?SSL加速器?
P4.最后,许多互联网几乎受限于通过TCP端口80和端口443可以适应的东西,因此任何风味的SCTP都会在那里失去.因此,您会看到像IETF中的MPTCP工作组那样的努力.
我们很多人很快就会使用SCTP,因为WebRTC数据通道使用它来在UDP上创建类似TCP的可靠层 - 通过UDP上的DTLS创建SCTP:https://tools.ietf.org/html/draft-ietf -rtcweb数据信道-13#部-6-
阅读SCTP维基百科页面我会说主要原因是SCTP是一个非常年轻的协议(2000年提出),目前主流操作系统(Windows,OS X,Linux)都不支持.
如果"非常年轻"对你来说似乎不合适,那就考虑一下IPV6:"尽管将其作为标准跟踪协议标志为10周年,但在2008年12月,IPv6在全球普遍部署方面还处于起步阶段."