M. Tim Jones, 资深首席软件工程师, eMulex
2006 年 4 月 10 日
流控制传输协议(Stream Control Transmission PRotocol,SCTP)是一种可靠的传输协议,它在两个端点之间提供稳定、有序的数据传递服务(非常类似于 TCP),并且可以保护数据消息边界(例如 UDP)。然而,与 TCP 和 UDP 不同,SCTP 是通过多宿主(Multi-homing)和多流(Multi-streaming)功能提供这些收益的,这两种功能均可提高可用性。在本文中,我们将学习 linux® 2.6 内核中 SCTP 的要害特性,并通过服务器和客户机的源代码了解该协议提供多流的能力。
SCTP 是在 ip 网络上使用的一种可靠的通用传输层协议。尽管 SCTP 协议最初是为发送电话信号而设计的(RFC 2960),但带来了一个意外的收获:它通过借鉴 UDP 的优点解决了 TCP 的某些局限。SCTP 提供的特性使套接字初始化的可用性、可靠性和安全性都得以提高。(图 1 给出了 IP 堆栈的层次化架构。)
图 1. IP 栈的层次化架构
本文简要介绍了 Linux 2.6 内核中 SCTP 的概念,重点介绍了一些高级特性(例如多宿主和多流),并且给出了服务器和客户机的部分代码片断(并给出了一个可以获得更多代码的 URL),从而展示了这种协议提供多流的能力。
下面让我们开始介绍 IP 堆栈的内容。
IP 堆栈
Internet 协议套件被划分成几层;每层都提供特定功能,如图 1 所示。
自下而上:
链路层(link layer) 提供了通信介质的物理接口(例如以太网设备)。
网络层(network layer) 负责治理网络中的报文移动,具体来说就是确保报文都到达自己的目标(也称为路由)。
传输层(transport layer) 为应用层控制了报文在两台主机之间的流动。它还代表通信的应用程序端点,称为 端口(port)。
最后,应用层(application layer) 对通过套接字传递数据具有深刻的意义。这些数据可能包括通过简单邮件传输协议(Simple Mail Transport Protocol,SMTP)发送的 e-mail 消息,或通过超文本传输协议(Hypertext Transport Protocol,HTTP)呈现的 Web 页面。
所有应用层协议都使用套接字层作为与传输层协议之间的接口。Sockets API 是由 UC Berkeley 在 BSD UNIX® 操作系统上开发的。
在深入钻研 SCTP 之前,让我们首先简单回顾一下传统的传输层协议。
传输层协议
两种最流行的传输层协议是传输控制协议(TCP)和用户数据报协议(UDP):
TCP 是一种可靠的协议,它可以确保有序地发送数据,并治理网络中的拥塞问题。
UDP 是一种面向消息的协议,它不能确保有序地发送数据,也无法治理网络拥塞的问题。
然而,UDP 是一种快速协议,可以保护自己传输的消息的边界。
本文引出了另外一个选择:SCTP。它提供了像 TCP 一样可靠、有序地发送数据的功能,但却以像 UDP 一样面向消息的方式来进行操作,这可以保护消息边界。SCTP 还提供了几个高级特性:
多宿主(Multi-homing)
多流(Multi-streaming)
初始化保护(Initiation protection)
消息分帧(Message framing)
可配置的无序发送(Configurable unordered delivery)
平滑关闭(Graceful shutdown)