要说网络协议,肯定离不开OSI(开放系统互连)的七层模型。我们一般关注网络层以上的层,比如IPV4和IPV6所在的网络层,TCP和UDP所在的传输层,HTTP和FTP所在的应用层。今天要说的sctp协议,全称是StreamControlTransmissionProtocol,翻译成中文就是流控制传输协议。由IETF在RFC4960中提出。传输层已经有广泛使用的TCP和UDP协议,为什么还要发明SCTP协议呢?很明显SCTP协议是对TCP和UDP协议的改进。具体来说,SCTP协议不仅提供了UDP协议的面向消息的特性,还具有TCP协议的可靠性、顺序传输和拥塞控制功能,还提供了Multihoming和冗余路径能力以增加弹性和可靠性。本文将详细讲解SCTP的实现原理和协议细节。TCP有什么问题TCP有什么问题?TCP当然好,我们知道UDP是不可靠的报文传输方式,而TCP是可靠的报文传输方式。UDP和TCP的应用场景非常广泛。但是,一个产品或协议不可能是完美的,必然存在一些不足之处。让我们来看看TCP的缺点。TCP和UDP最大的区别在于TCP是可靠的,也就是说TCP提供了一种在Internet上可靠传输数据的方法。但是,为了保证可靠的数据传输,TCP对传输进行了一些限制。例如,为了保证数据传输的可靠性,TCP需要严格要求数据传输的顺序。例如,一个数据包被分成三部分,分别标记为A、B、C。那么对于接收方来说,它必须首先接受数据包A,然后是B和C。如果先接收到B,那么接收方将需要请求发送方重新发送数据包。在这种对数据包的顺序有严格要求的情况下,可能会造成不必要的数据延迟和消息阻塞。因为TCP是面向数据流的,为了在数据流中标记不同的记录,TCP中的数据需要添加一些额外的标记或代码来区分记录。另外,为了提高传输效率,避免发送多个小数据包,TCP还可能对其进行优化,即等待多个小数据包合并为一个大数据包。如果不需要这样的优化,需要在TCP报文中设置PSH标志,明确该请求是一个无延时传输请求。最后,TCP也容易受到DOS(拒绝服务)攻击。sctp的特点既然TCP还有很多缺点,那么新的SCTP协议有什么特点呢?SCTP有两个主要特点。第一个特性是Message-based,也就是说SCTP是面向消息的。SCTP传输的是一系列的消息,一个消息就是一组字节。相反,TCP传输字节流。SCTP中的一条消息可以拆分成多个数据块,每个数据块中的所有数据都来自同一个用户。当这些数据需要在IP中传输时,SCTP会将这些数据包打包成SCTP包,每个SCTP包包含一个包头,如果需要,还可以包含一个控制块,最后是一个数据块。如何理解TCP数据包和SCTP数据包的区别?例如,当客户端使用TCP协议向服务器发送多条消息时,如果消息很短,为了提高传输效率,TCP可能会将这些具有不同功能的小数据放在同一个TCP数据包中。在服务端接收的过程中,TCP包中的所有数据也是一次收集,然后应用程序自己拆分TCP包中的底层数据。对于SCTP包来说,一个SCTP包可以包含多个datachunk,不同的datachunk可以包含来自不同用户的不同消息,因为SCTP包已经区分了不同的消息,所以服务器读取起来比较容易。下面是一个SCTP数据包的基本结构:从上图可以看出,前面蓝色部分的12个字节是SCTP数据包的包头,前两个字节是源端口号,后面两个字节bytes是目标端口号,然后4个字节是校验标志,最后4个是直接校验位,一共12个字节。header之后是datachunk,即数据块。每个块包含一个类型位、标志位和长度位,后面是该块的具体数据。SCTP的另一个特点是多流。多流是指SCTP可以并行传输多个独立的数据流。为什么可以这样做?这也是由SCTP数据包的结构决定的。我们可以看到SCTP数据包可以包含多个数据块,而这些数据块可以包含来自不同数据流的数据,因此面向消息的SCTP可以实现并行传输来自不同数据源的数据的特点。SCTP的另一个特点是多宿主。Multihoming是multiple+homing的复合词,字面意思是多个家。这是什么意思?我们知道,对于TCP协议来说,只有一个客户端和服务器,是一对一的连接。如果连接两端的任何一个IP或端口不可用,那么整个TCP连接就会崩溃。那么TCP能否发展成类似LSB负载均衡的模式呢?如果一个IP不可用,自动重新连接到备用IP地址。SCTP是TCP协议的升级版,经过优化提高了可靠性。具体来说,每个SCTP节点都使用心跳机制定期检查远程节点的主IP地址和备用冗余IP地址的可达性。在SCTP中,一个节点可以绑定多个IP地址。SCTP节点会根据从远程节点收到的心跳返回值来确认具体的访问信息。由于客户端节点和服务器节点的数量可能不同,SCTP可以分为对称多宿主和非对称多宿主。下面三张图分别展示了对称多归属和两个非对称多归属的情况:最后,SCTP的安全性也得到了提升。与TCP的三次握手相比,SCTP多了一次四次握手。TCP的三次握手会导致SYN攻击。什么是SYN攻击?让我们回顾一下TCP的三次握手过程。首先,客户端向服务器发送SYNA请求。服务器收到SYN请求后,将SYN请求缓存起来,然后返回SYNB,ACKA+1给客户端,客户端收到回复后,验证ACK的值,然后再次向服务器发送ACKB+1。服务器收到B+1请求后,最终确认客户端身份,连接建立。在上述过程中,由于服务端需要缓存TCP客户端的SYN报文,如果服务端收到大量的SYN报文,就会引起SYN攻击。相比之下,SCTP在收到客户端的连接请求后,并不是立即分配内存给缓存,而是返回一个COOKIE给客户端。当客户端再次请求时,需要带上这个cookie信息,服务端通过cookie验证来验证客户端身份后,最终建立连接。从而避免了TCP的SYN攻击。总结综上所述,SCTP可以保证有序、无数数据流的可靠传输,并且可以支持Multihoming。每个节点可以包含多个IP地址,从而实现冗余网络路径之间的透明故障转移。并改进了验证确认机制,防止SYN攻击。SCTP是一个非常好的协议。对于常用的操作系统,特定版本也提供了对SCTP的支持。例如在Linux中,2.4以上的内核版本就支持SCTP协议。如果是windows或者MAC,需要额外安装第三方驱动。windows上的驱动叫做SctpDrvkerneldriver,MAC上的驱动叫做SCTPNetworkKernelExtensionforMacOSX。这篇文章已经收录在http://www.flydean.com/21-sctp/最流行的解读,最深奥的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!
