SCTP协议详解

SCTP(StreamControlTransmissionProtocol)是一种传输协议,在TCP/IP协议栈中所处的位置和TCP、UDP类似,兼有TCP/UDP两者特征。SCTP是可以确保数据传输的,和TCP类似,也是通过确认机制来实现的。和TCP不同的是:1. TCP是以字节为单位传输的,SCTP是以数据块为单位传输的TCP接收端确认的是收到的字节数,SCTP接收端确认的是接收到的…

大家好,又见面了,我是你们的朋友全栈君。

SCTP (Stream Control Transmission Protocol)是一种传输协议,在TCP/IP协议栈中所处的位置和TCPUDP类似,兼有TCP/UDP两者特征。

SCTP是可以确保数据传输的,和TCP类似,也是通过确认机制来实现的。和TCP不同的是:

1. TCP是以字节为单位传输的,SCTP是以数据块为单位传输的

TCP接收端确认的是收到的字节数,SCTP接收端确认的是接收到的数据块。SCTP的这种数据块(被称为DATA CHUNK)通常会携带应用的一个数据包,或者说是应用要发送的一个消息。

在实际的应用中,TCP发送方的可以将应用程序需要发送的多个消息打包到一个TCP包里面发出去。比如,应用程序连续调用两次send()向对端发送两条消息,TCP协议可能把这两条消息都打包放在同一个TCP包中。接收端在收到这个TCP包时,回给对端的ACK只是表明自己接收到了多少个字节,TCP协议本身并不会把收到的数据重新拆散分成两条应用层消息并通知应用程序去接收。事实上,应用程序可能只需要调用一次receive(),就会把两条消息都收上来,然后应用需要根据应用程序自己定义的格式去拆成两条消息。

TCP不同,SCTP是将应用程序的每次调用sendmsg()发送的数据当作一个整体,放到一个被称为DATA CHUNK的数据块里面,接收端也是以DATA CHUNK为单位接收数据,并重新组包,通知应用程序接收。通常,应用程序每次调用recvmesg()都会收到一条完整的消息。

SCTP的发送端,多条短的应用层消息可以被SCTP协议打包放在同一个SCTP包中,此时在SCTP包中可以看到多个DATA CHUNK。另一方面,一条太长(比如,超过了路径MTU)的应用层消息也可能被SCTP协议拆分成多个片段,分别放在多个DATA CHUNK并通过不同的SCTP包发送给对端。这两种情况下,SCTP的接收端都能重新组包,并通知应用程序去接收。

2. TCP通常是单路径传输,SCTP可以多路径传输

TCP的两端都只能用一个IP来建立连接,连接建立之后就只能用这一对IP来相互收发消息了。如果这一对IP之间的路径出了问题,那这条TCP连接就不可用了。

SCTP不一样的地方是,两端都可以绑定到多个IP上,只要有其中一对IP能通,这条SCTP连接就还可以用。

SCTP协议详解SCTP协议详解

体现在socket API中,TCP只能bind一个IP,而SCTP可以bind到多个IP

3. TCP是单流有序传输,SCTP可以多流独立有序/无序传输

一条SCTP连接里面,可以区分多条不同的流(stream),不同的流之间的数据传输互不干扰。这样做理论上的好处是,如果其中某一条流由于丢包阻塞了,那只会影响到这一条流,其他的流并不会被阻塞。但是实际上,如果某一条流由于丢包阻塞,其他的流通常也会丢包,被阻塞,最后导致所有的流都被阻塞,SCTP连接中断。

SCTP协议详解

在同一条stream里面,SCTP支持有序/无序两种传输方式,应用程序在调用sendmsg()的时候,需要指定用哪一条stream传输,以及指定这条要发送的消息是需要有序传输还是无序传输的。如果在传输过程中丢包,则有序传递模式可能会在接收端被阻塞,而无序传输模式不会在接收端被阻塞。

SCTP协议详解

4. TCP连接的建立过程需要三步握手,SCTP连接的建立过程需要四步握手

TCP连接建立过程,容易受到DoS攻击。在建立连接的时候,client端需要发送SYN给server端,server端需要将这些连接请求缓存下来。通过这种机制,攻击者可以发送大量伪造的SYN包到一个server端,导致server端耗尽内存来缓存这些连接请求,最终无法服务。

SCTP的建立过程需要四步握手,server端在收到连接请求时,不会立即分配内存缓存起来,而是返回一个COOKIE。client端需要回送这个COOKIE,server端校验之后,从cookie中重新获取有效信息(比如对端地址列表),才会最终建立这条连接。这样,可以避免类似TCP的SYN攻击。

应用程序对此感知不到,对应用程序来说,不管是TCP还是SCTP,都只需要在server端listen一个socket,client调用connect()去连接到一个server端。

5. SCTP有heartbeat机制来管理路径的可用性

SCTP协议本身有heartbeat机制来监控连接/路径的可用性。

前面说过,SCTP两端都可以bind多个IP,因此同一条SCTP连接的数据可以采用不同的IP来传输。不同的IP传输路径对应一条path,不同的path都可以由heartbeat或者是数据的传输/确认来监控其状态。

如果heartbeat没相应,或者是数据在某条path超时没收到确认导致重传,则认为该path有一次传输失败。如果该path的连续传输失败次数超过path的连续重传次数,则认为该path不可用,并通知应用程序。如果一条连接的连续传输次数超过设定的“连接最大重传次数”,则该连接被认为不可用,该连接会被关闭并通知应用程序。

下一节将描述SCTP协议是如何实现上述功能的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/124854.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • Ajax面试题_世界十道经典面试题

    Ajax面试题_世界十道经典面试题1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识)什么是ajax:AJAX是“AsynchronousJavaScriptandXML”的缩写。他是指一种创建交互式网页应用的网页开发技术。Ajax包含下列技术:基于web标准(standards-basedpresentation)XHTML+CSS的表示;使用DOM(DocumentObjectM

  • Linux上端口开放常用命令[通俗易懂]

    Linux上端口开放常用命令[通俗易懂]场景系统部署在linux服务器后常需要开发指定的端口。在linux怎样对端口进行操作。注:博客:https://blog.csdn.net/badao_liumang_qizhi关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现#查看想开的端口是否已开:firewall-cmd–query-port=8888/tcp#添加指定需要开放的端口:firewall-cmd–add-port=8888/tcp–permanent#重载入添加的端口:

  • mac版本idea激活码2021(最新序列号破解)

    mac版本idea激活码2021(最新序列号破解),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 来自程序猿的一些废话

    “又是一年毕业时”,看到一批批学子离开人生的象牙塔,走上各自的工作岗位;想想自己也曾经意气风发、踌躇满志,不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼,希望对所有的软件工程师们有所帮助,早

    2021年12月22日
  • request.getParameterValues()用法「建议收藏」

    request.getParameterValues()用法「建议收藏」本人前段也不怎么样,研究了很久终于弄明白了request.getParameterValues()的简单用法,希望以下的方案能帮你渡过难关<formname="checkform"method="post"action="getvalue.j

  • 互联网java软件工程师

    互联网java软件工程师职位诱惑:高并发,分布式,氛围好,待遇不错职位描述:岗位职责:1、负责公司支付、推荐、云服务、应用商店、账号、开发者平台、论坛等系统的分析设计、开发实现和持续改善;2、参与产品分析和规划,完善和优化开发过程;3、研究和实践相关技术及实现原理。岗位要求:1、本科及以上学历,3年以上java开发经验;2、精通Java语言,熟练掌握JavaWEB

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号