目录
SCTP
SCTP(Stream Control Transmission Protocol,流控制传输协议)RFC 2960、RFC 3286、RFC 3309,是一个基于 IP 协议之上可靠的传输层协议。所谓 “可靠” 是相对于 “不可靠” 而言的:TCP/UDP 协议都不能完全满足在电信网中信令承载的要求。
- TCP 协议的消息传送效率与安全性不高。
- UDP 协议不能保证消息的可靠传送。
可见,SCTP 的设计是为了解决 TCP/UDP 这两个传输层协议在传输实时信令和数据时所面临的不可靠传输、时延等问题。主要用于在 “无连接、不可靠” 的 IP 网络之上为电信级信令传输提供高效、可靠的信令传输服务。
SCTP 在两个端点(Endpoint)之间提供稳定、有序的数据传递服务(类似于 TCP),并且可以保护数据消息边界(类似于 UDP)。SCTP 协议的核心是通过多宿主(Multi-homing)和多流(Multi-streaming)技术来提高可用性。
SCTP 与 TCP 的区别
SCTP 可以确保数据可靠传输,与 TCP 类似,也是通过确认机制来实现的。与 TCP 的区别是:
- TCP 是以字节为单位传输的,SCTP 是以数据块为单位传输的。
- TCP 通常是单路径传输,SCTP 可以多路径传输。
- TCP 的两端都只能用一个 IP 来建立连接,连接建立之后就只能用这一对 IP 来相互收发消息。如果这一对 IP 之间的路径出了问题,那这条 TCP 连接就不可用了;而 SCTP 的两端都可以绑定到多个 IP 上,只要有其中一对 IP 能通,这条 SCTP 连接就还可以用。这就是 SCTP 的多宿主机制。
- TCP 是单流的有序传输,SCTP 可以多流独立有序/无序传输。这就是 SCTP 的多流机制。
- TCP 连接的建立过程需要三步握手,SCTP 连接的建立过程需要四步握手。
- SCTP 有 Heartbeat(心跳)机制来管理路径的可用性。
端点(Endpoint)与多宿主(Multi-homing)
端点是 SCTP 协议中的一个逻辑概念,表示一个逻辑的接收方或发送方。一个 SCTP 端点可以包含若干个 IP 地址,但一个 SCTP 端点中所含有的若干个 IP 地址必须使用同一个相同的端口号。
SCTP 提供了多宿主特性,使得单个 SCTP 端点能够支持多个 IP 地址。该特性可以增强应对网络故障的健壮性。一个端点可能有多个冗余的网络连接,每个网络又可能有各自接入因特网基础设施的物理连接。当不同主机之间的端点建立了一个偶联之后,如果它的某个网络连接或物理连接发生故障了,SCTP 就可以通过切换到另一个 IP 地址来避免业务中断。是一种类似于主备的高可用思想。
可见,多宿主机制在于提高网络的容错能力。如果接收端是多宿主的,那么对于发送端来说每一个接收端的 IP 地址代表着一条通往对端的路径,这样发送端可以选择任一条路径来发送数据。SCTP 规定任何时间都有一条路径作为首选路径来发送数据,其他路径作为备份路径。如果首选路径因接口故障或者网络拥塞等原因而失效,SCTP 可以自动切换到另外一条路径来发送,避免单点失效,从而提高整个关联的容错能力。
偶联(Association)
SCTP 使用 “偶联” 一词替代 TCP 的 “连接” 是为了避免内涵的混淆:一个连接只涉及两个 IP 地址间的通信。一个偶联指代两个系统之间的一次通信,它可能因为 SCTP 的多宿主机制而涉及不止两个 IP 地址。
和 TCP 类似,SCTP 是面向连接、端到端、全双工、带有流量和拥塞控制的可靠传输协议。SCTP 的偶联需要通过 4 次握手建立。相对于 TCP 的 3 次握手建立连接,SCTP 的偶联能够抵御拒绝服务(DoS)攻击,从而提高了安全性。数据只有在关联建立之后与关联关闭之前才可发送。SCTP 的关联通过 3 次握手关闭,不支持类似 TCP 的半关闭连接。也就是在任何一方关闭关联后,对方即不再发送数据。
可见,一个偶联表示两个 SCTP 端点之间的一个对应关系,SCTP 协议规定在任何时刻两个 SCTP 端点之间能且仅能建立一个偶联。SCTP 支持多种网络协议,当 SCTP 在 IP 网络上运行时,传送地址就是由 IP 地址与 SCTP 端口号的组合来定义的,因此通过定义本地 IP 地址、本地 SCTP 端口号、对端 IP 地址、对端 SCTP 端口号等四个参数,就可以唯一标识一个 SCTP 偶联。
多流(Multi-streaming)
多流是 SCTP 协议的另一个特性。在 SCTP 偶联中的 “流” 的本质是从一个端点到另一个端点的单向逻辑通道。SCTP 消息在不同的流内发送,这也是流传输控制协议名称的由来。
一个 SCTP 偶联可以由多个单向的流组成,使用流 ID 进行标识。从发送端到接收端可以有多个流,在同一流内发送的消息有序,而不同流之间的消息无序,因此不同流之间的消息传输是相对独立的,每个流可以单独发送数据而不受其他流的影响。一个 SCTP 偶联中可用流的数量是在建立 SCTP 偶联时由双方端点协商决定的,但一个流只能属于一个 SCTP 偶联。
SCTP 能够在一个偶联中提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。这种做法正好与 TCP 相反,就 TCP 而言,在单一字节流中任何位置的字节丢失都将在阻塞该连接上其后所有数据的递送,直到该丢失被修复为止。SCTP 在某一个流内由于数据传输失败而引起的阻塞不会影响其他流的消息递交,多流特性可以帮助解决 TCP 中的队头阻塞(HOL)问题。这一点与 HTTP/2 协议非法类型。因为 TCP 传输是按字节严格有序的,先行传送的字节如果丢失或损坏,即使后续的字节正确地被接收到也不能向上层递交,必须在接收端缓冲起来,直到先行字节由于重传而全部正确接收到后才可以提交,并且释放缓冲区。
此外,SCTP 还定义了无序消息。如果消息带有无序标志,则不论它在哪个流中(在具体实现中,数据块中的流 ID 不被解析),只要被正确接收,都提交给 ULP,从而实现和流无关的无序递交。
来源:oschina
链接:https://my.oschina.net/u/4330404/blog/4355333