今天要讲的是流控制传输协议,也就是Stream Control Transmission Protocol。主要讲三个部分。
首先对SCTP进行一个简要的概述,然后介绍一下SCTP是如何通过四次握手建立一个“偶联”,这里的偶联就跟TCP中的连接是一个道理,它通过偶联这个过程能有效避免拒绝服务攻击(DoS,目的是使计算机或网络无法进行正确的服务,最常见的有计算机带宽攻击和连通性的攻击,利用TCP的缺陷来攻击)。第三部分主要讲一下SCTP的特性,以及与TCP、UDP相比的优点。
在这个模型中可以看到,SCTP处于与TCP和UDP同样的地位,都是传输层的,是标准的传输层协议。
那既然它与TCP、UDP一样,而且这两个已经使用这么广泛了,为什么我们还要一个SCTP呢?
其实SCTP的提出最早是为IP网中传输信令业务流而设计的,信令传输在实时性、安全性、可靠性等方面要求比较高,TCP协议支持多宿主困难、容易受到拒绝服务攻击、容易出现队头阻塞、实时性差、仅能支持字节流传输等缺点,因而无法满足这种要求。SCTP可以看做是TCP协议的改进,SCTP继承了TCP较为完善的拥塞控制和流量控制机制,同时也改进了TCP的一些缺点。而UDP没有确认连接的过程,安全性和可靠性也不高。
SCTP是能够处理多媒体和流通信量(stream traffic)的一种可靠的、面向报文的通用传输层协议,他能做到:
选择性确认(SACK),与传统的ACK有点不一样,TCP里的ACK确认机制是累计确认。
支持严格有序传输、部分有序传输和无序传输,对流会进行报文序号。
支持多宿主特性(MULTI-HOMING)和多流特性,多宿主特性与多宿主主机有关,即一个主机具有多个网络接口,也就是多个IP地址,两个多宿主主机使用多个网络接口进行通信就叫多宿主特性,多流特性也就是相应的在传输中有多个流。
SCTP中建立连接的过程叫偶联,是SCTP的两个端点通过SCTP规定的四步握手机制建立的进行数据传输的通道。
如图是两个主机各有两个IP,其中就存在四条路径。当传输时中途有一条路径出现故障,就可以立马进行切换,因此在故障切换上比TCP就更好,因为TCP就一条通道,坏了就只能通过路由调整来切换,而STCP在协议中就定义好这种切换方式了,可用性会更高。
之前说TCP通过三次握手建立连接是有一些缺陷的,首先客户端向服务器发送SYN请求,然后服务器向客户端返回SYN+ACK这样一个请求,这时如果客户端不向服务器再返回一个ACK的话,服务器就会重新发送一个SYN+ACK,如果还没有客户端返回的ACK,才会丢弃这个连接。在这个过程之中,服务器有个专门处理的线程是一直处于使用当中的,就会一直占用资源,时间大概有30秒到2分钟,这就是TCP的一个缺陷。如果有人伪造IP发送大量请求的话,就会占用服务器很多资源,导致一些正常请求得不到很好的响应,这也就是SYN洪泛攻击。
SCTP建立偶联的过程是(A是客户端,B是服务器):
(1) 端点A创建一个数据结构TCB(传输控制块)来描述即将发起的这个偶联(包含偶联的基本信息),然后向端点B发送INIT数据块。INIT数据块中主要包括如下参数:
端点A发送INIT后启动一个INIT定时器,并进入COOKIE-WAIT状态。
(2) 端点B收到INIT消息后,立即用INIT ACK数据块响应。INIT ACK数据块中必须带有如下参数:
目的地IP地址:设置成INIT数据块的起源IP地址。
启动标签(Initiate Tag):设置成Tag_B。
状态COOKIE(STATE COOKIE):根据偶联的基本信息生成一个TCB,不过这个TCB是一个临时TCB。这个TCB生成以后,将其中的必要信息(包含一个COOKIE生成的时间戳、COOKIE的生命期)和一个本端的密钥通过RFC2401描述的算法计算成一个32位的摘要MAC(这种计算是不可逆的)。必要信息和MAC组合成STATE COOKIE参数。
本端点传送地址。
最大入局流的数量。
最大出局流的数量。
B节点也就是服务器端节点发送完INIT ACK之后会删除该TCB,即在连接建立完成前不为连接建立过程保持任何资源,这就是相对TCP来说改善的一点。
(3) 端点A收到INIT ACK后,首先停止INIT定时器离开COOKIE-WAIT状态,然后发送COOKIE ECHO数据块,将收到INIT ACK数据块中的STATE COOKIE参数原封带回。最后端点A启动COOKIE定时器并进入COOKIE-ECHOED状态。
(4) 端点B收到COOKIE ECHO数据块后,进行COOKIE验证。将STATE COOKIE中的TCB部分和本端密钥根据RFC2401的MAC算法进行计算,得出的MAC和STATE COOKIE中携带的MAC进行比较。如果不同则丢弃这个消息;如果相同,则取出TCB部分的时间戳,和当前时间比较,看时间是否已经超过了COOKIE的生命期。如果是,同样丢弃。否则根据TCB中的信息建立一个和端A的偶联。端点B将状态迁入ESTABLISHED,并发出COOKIE ACK数据块。端点B向SCTP用户发送SCOMMUNCIATION UP通知。
端点A收到COOKIE ACK数据块后,从COOKIE-ECHOED状态迁移到ESTAABLISHED状态,并停止COOKIE定时器。端点A使用COMMUNICATION UP通知SCTP用户偶联建立成功。
相比TCP的一个好处就是,服务器并不保留任何资源,所有东西都交给客户端自己去做,让客户端自己去处理,也就没有了洪泛攻击的危险。
SCTP主要增强了其多宿主特性和多流特性。
多宿主特性就提高了可用性,在TCP上一个连接代表两台主机的网络接口之间的一个套接字,而SCTP的一个联合可以使用每台主机上的多个接口进行写作。其heartbeat机制来监视联合的路径,在检测到一条路径失效时,协议就会通过另外一条路径来发送通信数据。因此有利于网络故障切换,提高网络容错性。
SCTP通过多宿主实现传输路径的冗余,但在传输过程中仅使用主路径传输数据,RFC4960规定在以下情况下启动SCTP的故障切换机制,采用冗余路径传输数据。
超时重传和快重传:重传计时器超时或者收到3个连续的SACK时
主路径出现故障:即连续发送5个HeartBeat而没有收到HeartBeat
多流特性可以避免队头阻塞,TCP虽然是个全双工协议,但是其读写方向各自只有一个流。一个流很多情况下会发生头端阻塞,在TCP里被称为队头阻塞:
SCTP对每个流都给定了一个流编号,它被编码到 SCTP 报文中,通过联合在网络上传送。多流非常重要,因为阻塞的流(例如等待重传的流会导致报文的丢失)不会影响同一联合中的其他流。
TCP中,控制与数据通过相同的连接进行共享,可能产生控制报文处于数据报文之后的问题。而SCTP中,将控制与数据划分为单独的流,控制数据以一种更及时的方式进行处理,从而更好地利用可用资源。
讲者:高士杰
后台开发者
整理:欧霄
领取专属 10元无门槛券
私享最新 技术干货