SCTP是一个传输层协议,和UDP,TCP类似
- TCP是一种面向连接的协议,提供可靠传输,确保数据有序发送;
- UDP是一种面向消息的协议,不能确保数据有序发送
SCTP是后来引入的一种新的协议,提供了和TCP一样的可靠、有序的数据传输功能,同时却能和UDP一样面对消息的方式来进行操作,保护消息边界,有下面一些特性:
- 多宿主(Multi-Homing)
- 多流(Multi-streaming)
- 初始化保护(Initiation protection)
- 消息分帧(Message framing)
- 可配置的无序发送(Configurable unordered delivery)
- 平滑关闭(Graceful shutdown
相关术语
-
传送地址:由IP地址、传输层协议类型和传输层端口号定义,可以直接类别TCP/IP
-
主机:配有一个或多个 IP 地址,是一个典型的物理实体
-
端点:数据报的逻辑发送者和接收者,是一个典型的逻辑实体
一个传送地址(IP 地址+SCTP 端口号)唯一标识一个端点。一个端点可以由多个传送地址进行定义,但对于同一个目的端点而言,这些传送地址中的IP地址可以配置成多个,但必须使用相同的SCTP端口。
-
偶联:两个SCTP端点通过SCTP协议规定的4步握手机制建立起来的进行数据传递的逻辑联系或者通道。并且,任意两个端点只能建立一个偶联,由本地IP地址和SCTP端口号,和对端IP地址和SCTP端口号可唯一标识一个SCTP偶联
-
流:是一个SCTP偶联中,从一个端点到另一个端点的单向逻辑通道。一个偶联是由多个单向的流组成的。各个流之间相对独立,使用流ID进行标识,每个流可以单独发送数据而不受其他流的影响。
-
通路:通路是一个端点将 SCTP 分组发送到对端端点特定目的传送地址的路由。如果分组发送到对端端点不同的目的传送地址时,不需要配置单独的通路。
-
传输控制块TCB:TCB 是一种内部数据结构,是一个SCTP端点为它与其他端点之间已经启动的每一个偶联生成的。
多宿主
SCTP里面引入了联合(Association)的概念.
- TCP连接是在两个主机的单个接口之间建立的
- SCTP可以把多条路径合并到一个联合中,数据可以在任意一个连接路径上进行传输
多流
SCTP可以在一个联合中支持多流机制,每个流(stream)都是独立的。
- 每个流都有各自的编号,编码在SCTP报文中
- 阻塞的流不会影响同一联合中的其他流,可以并行进行传输
初始化保护(四次握手)
TCP中的三次握手机制会被利用来进行DoS(Denial of Service)攻击,通过发送大量的SYN报文最终耗尽服务器的资源
该四次握手的详细过程:
- 客户端创建一个数据结构TCB(传输控制块)来描述即将发起的这个偶联(包含偶联的基本信息),然后服务器发送一个INIT初始化消息,消息中包含:
- 启动标签:对端验证标签,是1 到4294967295 中的一个随机数
- 输出流数量(OS):本端点期望的最大出局流的数量。
- 输入流数量(MIS):本端点允许入局流的最大数量。
- 服务器给客户端回一个INIT ACK来确认刚收到的消息,INIT ACK数据块必须要以下的参数:
- 目的地 IP 地址:设置成INIT 数据块的起源IP 地址。
- 启动标签
- 状态 COOKIE(STATE COOKIE):根据偶联的基本信息生成一个TCB,不过这个TCB 是一个临时TCB。这个TCB 生成以后,将其中的必要信息(包含一个COOKIE生成的时间戳、COOKIE 的生命期)和一个本端的密钥通过 RFC2401 描述的算法计算成一个32 位的摘要MAC(这种计算是不可逆的)。必要信息和MAC组合成STATE COOKIE参数。
- 本端点传送地址
- 最大入局流的数量
- 最大出局流的数量
- 客户端收到状态cookie之后,首先停止INIT定时器,离开COOKIE WIT状态,然后给服务器发送一个COOKIE ECHO数据块,将收到INIT ACK 数据块中的STATE COOKIE 参数原封带回,并且此时还可以在此数据包中包含用户数据,最后端点A 启动COOKIE 定时器并进入 COOKIE-ECHOED 状态。
- 服务器收到客户端给其发的COOKIE ECHO数据块之后,进行COOKIE验证。验证由算法和时间戳组成。验证通过后,根据TCB 中的信息建立一和客户端的偶联。服务器将状态迁入ESTABLISHED,并发出COOKIE ACK数据块。服务器向SCTP用户发送SCOMMUNCIATION UP 通知,此时同样也可以携带数据
SCTP通过引入4次握手机制来避免这种场景:
- 服务器的INIT-ACK中会包含cookie(标识这个连接的唯一上下文);
- 客户端使用这个cookie来进行响应。服务器收到这个响应后,才为这个连接分配资源;
- 为了解决4次握手机制带来的时延,SCTP协议还允许在COOKIE-ECHO和COOKIE-ACK报文中传输数据包
消息分帧
-
TCP协议是按照字节流的方式进行数据传输的,并不存在消息边界,比如说音频视频都可以通过流的方式进行传递;
-
UDP使用的是消息分帧,发端多大的数据包,收端收到的数据包也是这么大;
SCTP也提供了这种分帧的机制
可配置的无序发送
TCP能确保数据按照次序发送;UDP无法保证消息有序;SCTP中也可以配置成接受无序的消息;
这样的通信方式对于面向消息的传输非常有用,因为每个消息都是各自独立的,次序并不重要。
平滑关闭(三次挥手)
TCP和SCTP都是基于连接的协议,完成传输后都需要有一个拆除连接的过程。
TCP中连接的删除是半关闭的,服务的某一端可以关闭自己这端的socket,但是可以继续接受数据。
详细过程:
- 客户端向对端发送SHUTDOWN数据块,但在发送前会将处在队列但未发送完的数据优先发送,这时客户端的状态从ESTBLISHED迁入SHUTDOWN-PENDING状态,在这个状态,SCTP不接受SCTP用户在这个偶联上的任何数据发送请求。客户端启动T2-shutdown定时器进入SHUTDOWN-SEND状态,作用为超时重传
- 服务器收到SHUTDOWN 消息后,进入SHOUTDOWN-RECEIVED 状态,不再接收从SCTP 用户发来的的新数据,并且检查数据块的累积TSN ACK 字段,并将处在队列但未发送完的数据优先发送,之后发送 SHUTDOWN ACK 数据块并启动本端T2-SHUTDOWN 定时器,并且进入 SHUTDOWN-ACK-SENT 状态,作用同样为超市重传。
- 客户端收到SHUTDOWN ACK 消息后,停止T2-shutdown 定时器,并且向服务器发送SHUTDOWN COMPLETE 数据块,并清除偶联的所有记录。服务器收到SHUTDOWN COMPLETE 数据块后,验证是否处于 SHUTDOWN-ACK-SENT 状态。如果不是处于该状态,则丢弃该数据块;如果端点处于SHUTDOWN-ACK-SENT 状态,服务器则停止T2-shutdown 定时器并清除偶联的所有记录,进入CLOSED 状态。
SCTP协议设计的时候考虑这种半关闭的状态实际上很少使用,所以简化了关闭的过程,一旦某一端发起了连接拆除,对等的两端都关闭,当然处于队列中的数据会被发送。