第1章 SCTP协议概述
1.1 LTE协议栈
UDP: 用于在基站与核心数据网关之间,承载业务用户面数据, 和同步面数据
TCP: 用于在基站与运营商网管中心之间,承载管理面数据,
SCTP: 用于在基站与核心信令网之间,承载信令面数据
由于TCP, UDP,SCTP属于TCP/IP协议栈的一部分,已经有成熟的软件,因此本文不做细节性的参数,重点参数这三种传输层协议之间的差别。
1.2 TCP IP协议栈概述
虽然TCP/IP协议族被称为“TCP/IP”,但除了TCP和IP这两个主要协议外,还有许多其他成员。如下图所示:
下面简单介绍一下图中的每一个协议框。
(1)IPV4 它使用32为地址
IPV4给TCP、UDP、SCTP、ICMP和IGMP提供分组递送服务。
(2)IPV6 使用128位更大地址。
IPV6给TCP、UDP、SCTP和ICMPv6提供分组递送服务。
(3)TCP 传输控制协议:面向连接的协议
TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接字。TCP关心确认、超时、和重传之类的细节。注意,TCP既可以使用IPV4,也可以使用IPV6。
UDP 用户数据包协议。UDP是一个无连接协议。UDP套接字是一种数据报套接字。UDP数据报不能保证最终到达它们的目的地。与TCP一样,UDP既可以使用IPV4,也可以使用IPV6。
(4)SCTP 流控制传输协议
SCTP是一个提供可靠全双工关联的面向连接的协议,我们使用“关联”一词指称SCTP中的连接,因为SCTP是多宿的,从而每个关联的两端均涉及一组IP地址和一个端口号。有点类似隧道。
SCTP提供消息服务,也就是维护来自应用层的记录边界。
与TCP和UDP一样,SCTP既可以使用IPV4,也可以使用IPV6,而且能够在同一个关联中同时使用它们。
(5)ICMP 网际控制消息协议。
ICMP处理在路由器和主机之间流通的错误和控制消息。
这些消息通常由TCP/IP网络支持软件本身(而不是用户进程)产生和处理,不过图中展示的ping和traceroute程序同样使用ICMP。
有时我们称这个协议为ICMPv4,以便与ICMPv6相区别。
IGMP 网际组管理协议。IGMP用于多遍,它在IPV4中是可选的。
(6)ARP 地址解析协议。
ARP把一个IPV4地址映射成一个硬件地址(如以太网地址)。ARP通常用于诸如以太网、令牌环网和FDDI等广播地址,在点对点网络上并不需要。
(7)RARP 反向地址解析协议。
RARP把一个硬件地址映射成一个IPV4地址。它有时用于无盘点的引导。
(8)BPF BSD分组过滤器。
该接口提供对于数据链路层的访问能力。
(9)DLPI 数据链路提供者接口。
该接口也提供对于数据链路层的访问能力,通常随SVR4内核提供。
第2章 三种传输层协议简介
2.1 用户数据包协议(UDP)
UDP是一个简单的传输层协议。
应用进程往一个UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而又被封装成一个IP数据报,然后发往到目的地。
UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。
每个UDP数据报都有一个长度。如果一个数据报正确地到达其目的地,那么该数据报的长度将随数据一道传递给接收端应用进程。
TCP是一个字节流协议,没有任何记录边界,这一点不同于UDP。
UDP提供无连接的服务,因为UDP客户与服务器之间不必存在任何长期的关系。
举例来说,一个UDP客户可以创建一个套接字并发送一个数据报给一个给定的服务器,然后立即用同一个套接字发送另一个数据报给另一个服务器。
同样地,一个UDP服务器可以用同一个UDP套接字从若干个不同的客户接收数据报,每个客户一个数据报。
2.2 传输控制协议(TCP)
由TCP向应用进程提供的服务不同于由UDP提供的服务。
(1)面向连接的通信
TCP提供客户与服务器之间的连接。TCP客户先与某个给定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止这个连接。
(2)可靠性的通信
当TCP向另一端发生数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长的时间。在数次重传失败后,TCP才放弃,如此在尝试发送数据上所花的总时间一般为4~10分钟。
(3)自动排序与重复性检测
TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。
举例来说,假设一个应用写2048字节到一个TCP套接字,导致TCP发送2个分节:第一个分节所含数据的序列号为1~1024,第二个分节所含数据的序列号1025~2048.(分节是TCP传递给IP的数据单元。)如果这些分节非顺序到达,接收端TCP将先根据它们的序列号重新排序,再把结果数据传递给接受应用。如果接收端TCP接收到来自对端的重复数据,它可以判定数据是重复的,从而丢弃重复数据。
(4)TCP提供流量控制。
TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口。
在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。
该窗口时刻动态变化:当接收到来自发送端的数据时,窗口大小就减小,但是当接收端应用从缓冲区中读取数据时,窗口大小就增大。
通告窗口大小减小到0是可能的:当TCP对应某个套接字的接收缓冲区已满,导致它必须等待应用从该缓冲区读取数据时,方能从对端再接收数据。
2.3 流控制传输协议(SCTP)
SCTP提供的服务与UDP和TCP提供的类似。
SCTP在客户和服务器之间提供关联,并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送。
SCTP中使用“关联”一词取代“连接”是为了避免这样的内涵:一个连接口涉及两个IP地址之间的通信。一个关联指代两个系统之间的一次通信,它可能因为SCTP支持多宿而涉及不止两个地址。
(1)SCTP能够在所连接的端点之间提供多个流
下图是一个 SCTP 多重串流的示意图,SCTP 两端点通过一条 SCTP 连线(association)进行通讯,在接收与传送的部分,可使用多个串流进行数据的传送与接收。
一个“关联”Association 是由多个单向的“流”(Stream)组成的。各个流之间相对独立,可以单独发送数据而不受其它流的影响,也可以共同实现用户数据的有序递交。
这样做理论上的好处是,如果其中某一条流由于丢包阻塞了,那只会影响到这一条流,其他的流并不会被阻塞。
只有所有的流都被阻塞,SCTP连接中断。
这种做法与TCP正好相反,就TCP而言,在单一字节流中任何位置的字节丢失都将阻塞该连接上其后所有数据的递送,直到该丢失被修复为止。
SCTP的多重串流特性有别于传统的 TCP 通讯协定单一串流(single-stream):
当端点建立连线时,可预先相互协调将要使用的串流数量,并且能够将不同类型的数据分别以不同的串流传输。
当其中一个串流正在等待重新传送的讯息时,其他串流仍然能够继续传送。
在每个串流中的 data chunk 都会有各自运作的的串流序号(SSN, stream sequence number),因此在某一个串流的封包重送动作并不会使其他串流因等待重送的封包而造成延迟。
如应用于网页伺服器时,不需为了同时传输多个档桉而建立多个连线,网页与图片能够透过不同的串流传输,不需等待网页传输完毕,图片就能透过其他串流同时传输。
多重串流之功能可以改善原本因单一串流时,必须等待遗失封包之重送而产生的 HoL Blocking 延迟。
因此,SCTP连接的多个流特性,非常适合基站与信令网关之间为多用户终端提供信令传输。因为不同的用户之间有需要相互独立传输信令,不能相互干扰。
注:
队首阻塞(Head-of-line blocking, HOL)是一种出现在缓存式通信网络交换中的一种现象。交换结构通常由缓存式先进先出输入端口、一个交换结构以及缓存式先进先出输出端口组成。
由于FIFO(先进先出)队列机制造成的,每个输入端的FIFO首先处理的是在队列中最靠前的数据,而这时队列后面的数据对应的出口缓存可能已经空闲,但因为得不到处理而只能等待,这样既浪费了带宽又降低了系统性能。
举个现实生活中的例子,这就如同你在只有一条行车路线的马路上右转,但你前面有直行车,虽然这时右行线已经空闲,但你也只能等待
(2)面向消息的传输
每个流各自可靠地按序递送消息。
与TCP不同的是,SCTP是面向一个个独立的消息的。与UDP一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。
(3)多流有序传输
SCTP它提供各个记录的按序递送服务。
在同一条stream里面,SCTP支持有序/无序两种传输方式,应用程序在调用sendmsg()的时候,需要指定用哪一条stream传输,以及指定这条要发送的消息是需要有序传输还是无序传输的。
如果在传输过程中丢包,则有序传递模式可能会在接收端被阻塞,而无序传输模式不会在接收端被阻塞。
(4)SCTP提供多宿特性,多路径传输
TCP的两端都只能用一个IP来建立连接,连接建立之后就只能用这一对IP来相互收发消息了。如果这一对IP之间的路径出了问题,那这条TCP连接就不可用了。
SCTP不一样的地方是,两端都可以绑定到多个IP上,只要有其中一对IP网络通路正常,这条SCTP连接就还可以用。
这使得单个SCTP端点能够支持多个IP地址。该特性可以增强应当网络故障的健壮性。
一个端点可能有多个冗余的传输网络连接,每个网络又可能有各自接入因特网基础设施的连接。
当该端点与另一个端点建立一个关联后,如果它的某个网络或某个跨越因特网的通路发生故障,SCTP就可以通过切换到使用已有该关联的另一个地址来规避所发生的故障。
第3章 三种传输层协议比较
UDP:简单的、不可靠的、无连接的、提供消息边界的数据报协议
TCP:复杂的、可靠的、面向连接的、无消息边界的字节流协议
SCTP:可靠的、面向连接的,流控制传输协议,提供消息边界、传输级别多宿支持以及线头阻塞减少到最小的一种方法。
3.1 用户数据包协议(UDP)
(1)不可靠:
不保证UDP数据报会到达最终目的地,不保证各个数据包的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次;
如果一个数据报到达了其最终目的地,但校验和检测发现有错误,或者数据报在网络传输途中被丢弃了,就无法投递给UDP套接字,也不会被源端自动重传;
(2)提供消息边界:
每个数据报都有一个长度。如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一道传递给接收端应用进程;
(3)提供无连接服务:
比如,一个UDP客户可以创建一个套接字并发送一个数据报给一个给定的服务器,然后立即用同一个套接字发送另一个数据报给另一个服务器。
同样的,一个UDP服务器可以用同一个UDP套接字从若干个不同的客户接收数据报,每个客户一个数据报。
3.2 传输控制协议(TCP)
(1)面向连接:
TCP客户先于某个给定的服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止这个连接;
(2)可靠的:
当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长时间。
在数次重传失败后,TCP才放弃,如此尝试发送数据上所花的总时间一般为4-10分钟(依赖于具体实现);
(3)含有用于动态估算客户和服务器之间的往返时间(RTT)的算法;
(4)自动排序:
通过给其中每个字节关联一个序列号对所发送的数据进行排序;
(5)提供流量控制。
总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通过窗口。
(6)连接时全双工的;
3.3 流控制传输协议(SCTP)
(1)可靠性、面向连接:在客户和服务器之间提供关联,并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送;
(2)多用户多IP地址:一个关联指代两个系统之间的一次通信,它可能因为SCTP支持多宿而设计不止两个地址;
(3)面向消息:与TCP面向流不同的是,SCTP是面向消息的。它提供各个记录的按序递送服务;
(4)多流:能够在所连接的端点之间提供多个流,每个流各自可靠第按序递送消息;
(5)提供多宿性,使得单个SCTP端点能够支持多个IP地址;
第4章 Linux下SCTP 协议的使用
在Linux平台,两个方案来实现SCTP协议,LKSCTP (Linux kernel SCTP) 与SCTPLIB。
但无论哪种方案,都提供统一的Socke的编程接口。
4.1 内核空间解决方案: LKSCTP
LKSCTP在内核空间kernel space实现SCTP协议,这种方案把SCTP协议看成是TCP/IP协议栈一部分。
4.2 用户空间解决方案:SCTPLIB
SCTPLIB方案是在用户空间实现SCTP协议。他利用raw socket的方式于user space运作SCTP协议,如下图所示。