为什么5G N2接口控制面使用SCTP协议?

概述

我们熟知的传输层协议有TCP和UDP,SCTP不太为人所知。但是在4G核心网EPC中,e-NB和MME之间的S1接口传输层使用的是SCTP协议。5G沿用4G的思想,g-NB和AMF之间的N2接口传输层使用的也是SCTP协议。协议栈分别如图1和图2所示。那么电信网络为什么使用SCTP协议而不是TCP或者UDP协议?本文对此问题做一个总结。

图1 4G S1接口控制面(eNB-MME) 图2 5G N2接口控制面(gNB-AMF)
图1 4G S1接口控制面(eNB-MME) 和 5G N2接口控制面(gNB-AMF)

TCP和UDP的定义

TCP和UDP的定义如下:

  • UDP (用户数据报协议):是一种面向消息的协议,它不能确保有序地发送数据,也无法管理网络拥塞的问题;
  • TCP(传输控制协议) :是一种面向连接的、可靠的、基于字节流的协议,它可以确保有序地发送数据,并管理网络中的拥塞问题;

SCTP协议

SCTP协议简介

SCTP(Stream Control Transmission Protocol,流控制传输协议) 是在 IP 网络上使用的一种可靠的通用传输层协议。SCTP是一个面向连接的流传输协议,它可以在两个端点之间提供稳定、有序的数据传递服务。尽管 SCTP 协议最初是为发送电话信号而设计的(RFC 2960),但带来了一个意外的收获:它通过借鉴 UDP 的优点解决了 TCP 的某些局限。SCTP 提供的特性使套接字初始化的可用性、可靠性和安全性都得以提高。图3位IP栈的层次化结构。

在这里插入图片描述
图2 IP 栈的层次化架构

SCTP协议的特点

SCTP提供了像 TCP 一样可靠、有序地发送数据的功能,但却以像 UDP 一样面向消息的方式来进行操作,这可以保护消息边界。SCTP 还提供了几个高级特性:

  • 多宿主(Multi-homing)
  • 多流(Multi-streaming)
  • 初始化保护(Initiation protection)
  • 消息分帧(Message framing)
  • 可配置的无序发送(Configurable unordered delivery)
  • 平滑关闭(Graceful shutdown)

SCTP 相对于传统的传输层协议来说,两个重要的增强是终端主机的多宿主和多流功能。

多宿主

多宿主为应用程序提供了比 TCP 更高的可用性。多宿主主机就是一台具有多个网络接口的主机,因此可以通过多个 IP 地址来访问这台主机。在 TCP 中,连接(connection) 是指两个端点之间的一个通道(在这种情况下,就是两台主机的网络接口之间的一个套接字)。SCTP 引入了 联合(association) 的概念,它也是存在于两台主机之间,但可以使用每台主机上的多个接口进行协作。

在这里插入图片描述

图3 TCP 连接与 SCTP 联合

图4的上面部分是 TCP 连接,每个主机都只包含一个网络接口;连接是在每个客户机和服务器之间的单个接口之间建立的,在建立连接时,就被绑定到了每个接口上。在图4的下面部分中,可以看到这样一个架构:每台主机上都包含两个网络接口。通过独立网络提供了两条路径,一条是从接口 C0 到 S0,另外一条是从接口 C1 到 S1。在 SCTP 中这两条路径可以合并到一个联合中。
SCTP 负责使用内嵌的 heartbeat 机制来监视联合的路径;在检测到一条路径失效时,协议就会通过另外一条路径来发送通信数据。应用程序甚至都不必知道发生了故障恢复。

多流

从某种意义上来讲,SCTP 连接与 TCP 连接类似,不同之处只是 SCTP 能够在一个联合中支持多流机制。一个联合中的所有流都是独立的,但均与该联合相关。

在这里插入图片描述

图4 SCTP 联合与流之间的关系

每个流都给定了一个流编号,它被编码到 SCTP 报文中,通过联合在网络上传送。多流非常重要,因为阻塞的流(例如等待重传的流会导致报文的丢失)不会影响同一联合中的其他流。这个问题统称为 head-of-line blocking(对头阻塞)。TCP 很容易出现这类阻塞问题。

多流如何在传输数据时提供更好的响应性呢?例如,HTTP 协议会在相同套接字上共享控制和数据。Web 客户机从服务器上请求一个文件,服务器通过相同的连接将这个文件发回给客户机。多流的 HTTP 服务器可以提供更好的交互能力,因为在联合中各单独的流上可以处理多个请求。这种功能可以并行化响应,尽管速度不一定会更快,但可以同时加载 HTML 和图像映像,从而表现出更好的响应性。

多流处理是 SCTP 的一个重要特性,尤其是在协议的设计中考虑一些控制和数据的问题时更是如此。在 TCP 中,控制和数据通常都是通过相同的连接进行共享的,这可能会产生问题,因为控制报文可能会在数据报之后延时。如果控制和数据被划分成单独的流,控制数据就可以以一种更及时的方式进行处理,从而可以更好地利用可用资源。

初始化保护

TCP 和 SCTP 中对新连接的初始化是通过报文握手来完成的。在 TCP 中,这种机制称为三次握手(three-way handshake)。客户机向服务器首先发送一个 SYN 报文(Synchronize 的简写),服务器使用一个 SYN-ACK 报文进行响应(Synchronize-Acknowledge)。最后,客户机使用一个 ACK 报文确认已接收到报文。

在这里插入图片描述

图5 TCP 和 STCP 握手使用的报文交换

当恶意客户机使用虚假的源地址来伪造一个 IP 报文时,TCP 就会出现问题了,这会大量 TCP SYN 报文攻击服务器。服务器在接收 SYN 报文之前,要为连接分配资源,但是在大量产生 SYN 报文的情况下,最终会耗尽自己的资源,从而无法处理新的请求。这种情况就称为 服务拒绝(Denial of Service,DoS)攻击。
SCTP 可以通过一种 4 次握手的机制并引入了 cookie 的概念来有效地防止这种攻击的产生。在 SCTP 中,客户机使用一个 INIT 报文发起一个连接。服务器使用一个 INIT-ACK 报文进行响应,其中就包括了 cookie(标识这个连接的惟一上下文)。客户机然后就使用一个 COOKIE-ECHO 报文进行响应,其中包含了服务器所发送的 cookie。现在,服务器要为这个连接分配资源,并通过向客户机发送一个 COOKIE-ACK 报文对其进行响应。
要解决使用这种 4 次握手机制解决延时数据移动的问题,SCTP 允许把数据包含到 COOKIE-ECHO 和 COOKIE-ACK 报文中。

消息分帧

使用消息分帧机制,就可以保护消息只在一个边界内通过 socket 进行通信;这意味着如果客户机向服务器先发送 100 个字节,然后又发送 50 个字节。那么服务器就会在两次读取操作中分别读取到 100 个字节和 50 个字节。UDP 也是这样进行操作,这对于面向消息的协议非常有益。对于面向流的数据来说,例如音频和视频数据,可以没有分帧机制。
与此不同,TCP 是按照字节流的方式进行操作。如果没有分帧机制,一端接收到的数据可能比另外一端发送的数据多或少(这会将一次写操作划分成多次操作,或者将多次写操作合并到一个读操作中)。这种行为需要在 TCP 之上进行操作的面向消息的协议可以在应用层中提供数据缓冲和消息分帧机制(这可能是一项复杂的任务)。
SCTP 在数据传输中提供了消息分帧功能。当一端对一个套接字执行写操作时,可确保对等端读出的数据大小与此相同。

在这里插入图片描述

图6 UDP/SCTP 中的消息分帧与面向字节流协议的比较

可配置的无序发送

SCTP 中的消息的传输十分可靠,但未必是按照想要的次序来传输的。TCP 可以确保数据是按照次序发送的(考虑到 TCP 是一种流协议,这是一件好事)。UDP 无法确保有序地发送数据。但是如果需要,您也可以在 SCTP 中配置流来接受无序的消息。
这种特性在面向消息的协议中可能非常有用,因为其中的消息都是独立的,次序并不重要。另外,可以在一个联合中按照逐个流配置无序发送。

平滑关闭

TCP 和 SCTP 都是基于连接的协议,而 UDP 则是一种无连接的协议。TCP 和 SCTP 都需要在对等的两端建立和拆除连接。SCTP 与 TCP 中关闭连接的不同之处在于 TCP 中连接的删除是半关闭(half-close) 的。

在这里插入图片描述

图6 TCP 和 SCTP 的连接结束序列

在 TCP 中,一端可以关闭自己这端的 socket(这样会导致发送一个 FIN 报文),但是仍然可以继续接收数据。FIN 说明这个端点不会再发送数据,但是在这一端关闭自己这端的套接字之前,它一直可以继续传输数据。应用程序很少使用这种半关闭状态,因此 SCTP 的设计者就选择放弃这种状态,并将其替换成了一个显式的终结序列。当一端关闭自己的套接字时(导致产生一个 SHUTDOWN 原语),对等的两端全部需要关闭,将来任何一端都不允许再进行数据的移动了。

N2接口控制面选择SCTP协议的原因

不用UDP协议的原因如下:

  • UDP协议不可靠,UDP没有任何质量保证的,会乱序和丢包。对于控制信令来说是不能接受的。丢了一个消息可能导致整个设备的状态错了,会带来无数意想不到的问题。为了保证消息的正确性,就必须在应用层增加保证机制,例如序列号、重传等等。但是这样增加了协议的复杂性,也增加了实现的复杂性;
  • UDP协议不安全,UDP协议传输之前不需要提前建立连接,没有提供任何认证功能,安全性很差;

不用TCP协议的原因如下:

  • TCP传输的单位是数据流,它没有开头和结尾的标志,而信令是一个个有长度的消息。如果要用TCP传递消息,就必须添加消息的结束开始标志,这个无疑增加了实现的难度;
  • TCP的数据是有序的,如果前面的包丢了,后面的包即使收到了,也不能发给上层应用,必须等丢的包重传后,后面的包才能给上层应用。但是5G控制面传递的一般是不同用户的消息,消息之间没有什么关联,不能够因为A用户的消息堵塞了,就影响B用户。解决的方案是为每个用户建立一个TCP的连接,可是这样就消耗比较多的资源,例如一个AMF可能同时连接几十万个用户,几十万个TCP连接的开销是十分巨大的;

5G N2接口使用SCTP的原因主要是由控制面的特点决定的,由于通信系统中,信令都是要求传输的可靠性需要有高度保证,而UDP的问题在于没有可靠性保证自然首先被信令面淘汰,TCP尽管是面向连接,而且有确认机制,但是TCP在拥塞控制,实时性,以及防止攻击方面做的比较差,而SCTP的设计包括适当的拥塞控制、防止泛滥和伪装攻击、更优的实时性能,综合比较这些传输协议,核心网的信令面设计的时候,选取了更为可靠的SCTP作为传输协议。

SCTP协议为什么不为人所知?

SCTP优点很多,但是主要用在电信领域,没有大量部署使用。主要原因如下:

  • 广泛存在:未广泛集成到TCP/IP协议栈中;
  • 库:在易于使用的语言中很少有高级绑定;
  • NAT:不能很好地穿越NAT;
  • 流行度:没有普通的公共应用程序使用它;
  • 编程范式:它改变了一点:它仍然是一个套接字,但是你可以将许多主机连接到许多主机(多主机),数据报是有序和可靠的,ERC…
  • 复杂性:SCTP堆栈的实现非常复杂;
  • 竞争:多路径TCP即将到来,应该解决多归属需求/功能,因此人们在可能的情况下不执行SCTP,等待MTCP;
  • 生态位:需要SCTP填充是非常特殊的(有序可靠的数据报,多流),并且不需要很多应用程序;
  • 安全性:SCTP逃避安全控制(一些防火墙,大多数IDSes,所有DLP,除了CentOS/Redhat/Fedora…)以外,没有出现在netstat上;
  • 审计能力:世界上有3家公司定期对SCTP安全性进行审计;
  • 学习曲线:没有多少工具链可以玩SCTP;
  • 下盖:主要用于电信领域,每次发送短信、在手机上上网或打电话时,通常都会触发流经SCTP的消息(SIGTRAN/SS7与GSM/UMTS,Diverage与LTE/IMS/RCS,S1AP/X2AP与LTE)。所以你确实经常使用它,但你永远不知道;-)

参考

sctp和tcp的区别
为什么SCTP没有被大量使用/知道?
浅谈LTE–为什么EPC选择了sctp?
LTE学习笔记:LTE S1接口控制面协议选择SCTP的原因
使用 SCTP 优化网络

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值