SCTP

SCTP是一个传输层协议,和UDP,TCP类似

  • TCP是一种面向连接的协议,提供可靠传输,确保数据有序发送;
  • UDP是一种面向消息的协议,不能确保数据有序发送

SCTP是后来引入的一种新的协议,提供了和TCP一样的可靠、有序的数据传输功能,同时却能和UDP一样面对消息的方式来进行操作,保护消息边界,有下面一些特性:

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

相关术语

  • 传送地址:由IP地址、传输层协议类型和传输层端口号定义,可以直接类别TCP/IP

  • 主机:配有一个或多个 IP 地址,是一个典型的物理实体

  • 端点:数据报的逻辑发送者和接收者,是一个典型的逻辑实体

    一个传送地址(IP 地址+SCTP 端口号)唯一标识一个端点。一个端点可以由多个传送地址进行定义,但对于同一个目的端点而言,这些传送地址中的IP地址可以配置成多个,但必须使用相同的SCTP端口。

  • 偶联:两个SCTP端点通过SCTP协议规定的4步握手机制建立起来的进行数据传递的逻辑联系或者通道。并且,任意两个端点只能建立一个偶联,由本地IP地址和SCTP端口号,和对端IP地址和SCTP端口号可唯一标识一个SCTP偶联

  • 流:是一个SCTP偶联中,从一个端点到另一个端点的单向逻辑通道。一个偶联是由多个单向的流组成的。各个流之间相对独立,使用流ID进行标识,每个流可以单独发送数据而不受其他流的影响。

  • 通路:通路是一个端点将 SCTP 分组发送到对端端点特定目的传送地址的路由。如果分组发送到对端端点不同的目的传送地址时,不需要配置单独的通路。

  • 传输控制块TCB:TCB 是一种内部数据结构,是一个SCTP端点为它与其他端点之间已经启动的每一个偶联生成的。

多宿主

SCTP里面引入了联合(Association)的概念.

img

  • TCP连接是在两个主机的单个接口之间建立的
  • SCTP可以把多条路径合并到一个联合中,数据可以在任意一个连接路径上进行传输

多流

SCTP可以在一个联合中支持多流机制,每个流(stream)都是独立的。

在这里插入图片描述

  • 每个流都有各自的编号,编码在SCTP报文中
  • 阻塞的流不会影响同一联合中的其他流,可以并行进行传输

初始化保护(四次握手)

TCP中的三次握手机制会被利用来进行DoS(Denial of Service)攻击,通过发送大量的SYN报文最终耗尽服务器的资源

在这里插入图片描述

该四次握手的详细过程:

  1. 客户端创建一个数据结构TCB(传输控制块)来描述即将发起的这个偶联(包含偶联的基本信息),然后服务器发送一个INIT初始化消息,消息中包含:
    • 启动标签:对端验证标签,是1 到4294967295 中的一个随机数
    • 输出流数量(OS):本端点期望的最大出局流的数量。
    • 输入流数量(MIS):本端点允许入局流的最大数量。
  2. 服务器给客户端回一个INIT ACK来确认刚收到的消息,INIT ACK数据块必须要以下的参数:
    • 目的地 IP 地址:设置成INIT 数据块的起源IP 地址。
    • 启动标签
    • 状态 COOKIE(STATE COOKIE):根据偶联的基本信息生成一个TCB,不过这个TCB 是一个临时TCB。这个TCB 生成以后,将其中的必要信息(包含一个COOKIE生成的时间戳、COOKIE 的生命期)和一个本端的密钥通过 RFC2401 描述的算法计算成一个32 位的摘要MAC(这种计算是不可逆的)。必要信息和MAC组合成STATE COOKIE参数。
    • 本端点传送地址
    • 最大入局流的数量
    • 最大出局流的数量
  3. 客户端收到状态cookie之后,首先停止INIT定时器,离开COOKIE WIT状态,然后给服务器发送一个COOKIE ECHO数据块,将收到INIT ACK 数据块中的STATE COOKIE 参数原封带回,并且此时还可以在此数据包中包含用户数据,最后端点A 启动COOKIE 定时器并进入 COOKIE-ECHOED 状态。
  4. 服务器收到客户端给其发的COOKIE ECHO数据块之后,进行COOKIE验证。验证由算法和时间戳组成。验证通过后,根据TCB 中的信息建立一和客户端的偶联。服务器将状态迁入ESTABLISHED,并发出COOKIE ACK数据块。服务器向SCTP用户发送SCOMMUNCIATION UP 通知,此时同样也可以携带数据

SCTP通过引入4次握手机制来避免这种场景:

  • 服务器的INIT-ACK中会包含cookie(标识这个连接的唯一上下文);
  • 客户端使用这个cookie来进行响应。服务器收到这个响应后,才为这个连接分配资源;
  • 为了解决4次握手机制带来的时延,SCTP协议还允许在COOKIE-ECHO和COOKIE-ACK报文中传输数据包

消息分帧

  • TCP协议是按照字节流的方式进行数据传输的,并不存在消息边界,比如说音频视频都可以通过流的方式进行传递;

  • UDP使用的是消息分帧,发端多大的数据包,收端收到的数据包也是这么大;

    img

    SCTP也提供了这种分帧的机制

可配置的无序发送

TCP能确保数据按照次序发送;UDP无法保证消息有序;SCTP中也可以配置成接受无序的消息;
这样的通信方式对于面向消息的传输非常有用,因为每个消息都是各自独立的,次序并不重要。

平滑关闭(三次挥手)

TCP和SCTP都是基于连接的协议,完成传输后都需要有一个拆除连接的过程。

TCP中连接的删除是半关闭的,服务的某一端可以关闭自己这端的socket,但是可以继续接受数据。

img

详细过程:

  1. 客户端向对端发送SHUTDOWN数据块,但在发送前会将处在队列但未发送完的数据优先发送,这时客户端的状态从ESTBLISHED迁入SHUTDOWN-PENDING状态,在这个状态,SCTP不接受SCTP用户在这个偶联上的任何数据发送请求。客户端启动T2-shutdown定时器进入SHUTDOWN-SEND状态,作用为超时重传
  2. 服务器收到SHUTDOWN 消息后,进入SHOUTDOWN-RECEIVED 状态,不再接收从SCTP 用户发来的的新数据,并且检查数据块的累积TSN ACK 字段,并将处在队列但未发送完的数据优先发送,之后发送 SHUTDOWN ACK 数据块并启动本端T2-SHUTDOWN 定时器,并且进入 SHUTDOWN-ACK-SENT 状态,作用同样为超市重传。
  3. 客户端收到SHUTDOWN ACK 消息后,停止T2-shutdown 定时器,并且向服务器发送SHUTDOWN COMPLETE 数据块,并清除偶联的所有记录。服务器收到SHUTDOWN COMPLETE 数据块后,验证是否处于 SHUTDOWN-ACK-SENT 状态。如果不是处于该状态,则丢弃该数据块;如果端点处于SHUTDOWN-ACK-SENT 状态,服务器则停止T2-shutdown 定时器并清除偶联的所有记录,进入CLOSED 状态。

SCTP协议设计的时候考虑这种半关闭的状态实际上很少使用,所以简化了关闭的过程,一旦某一端发起了连接拆除,对等的两端都关闭,当然处于队列中的数据会被发送。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值