### Linux SCTP 实现概述
本篇文章主要介绍了 Linux 下 SCTP(Stream Control Transmission Protocol)协议的基本概念、数据传输机制以及关联状态机等重要内容。
#### 基本概念
在介绍 SCTP 协议之前,首先需要了解一些基本概念。一个 SCTP 关联由四个关键标识符来确定:
1. **源 IP (Source IP)**:发起通信的一方的 IP 地址。
2. **源端口 (Source Port)**:发起通信的一方使用的端口号。
3. **目的 IP (Destination IP)**:接收通信的一方的 IP 地址。
4. **目的端口 (Destination Port)**:接收通信的一方监听的端口号。
此外,还有一个**验证标签 (Verification Tag)**,用于区分新旧关联。
#### SCTP 端点与路径
SCTP 支持多宿主,即可以在多个 IP 地址之间建立关联。每个 SCTP 端点由 IP 地址和端口号共同标识,例如:
- SCTP 端点:`IP1, IP2, Port1`
- SCTP 端点:`IP3, IP4, Port2`
每个关联可以包含多个路径,路径之间的状态通过心跳消息进行探测和确认。
#### SCTP 数据包格式
SCTP 数据包包括以下几个部分:
- **SACK**:用于确认接收到了 DATA 分组。
- **TSN**:用于唯一标识一个 DATA 分组。
- **ORDERED 或 UNORDERED**:表示数据分组的发送方式。
- **HEARTBEAT**:用于探测路径状态,并通过 HEARTBEAT-ACK 进行确认。
#### SCTP 数据传输
SCTP 的数据传输机制具有以下特点:
- **流 (Stream)**:SCTP 允许在一个关联中同时存在多个独立的逻辑流。
- **流序列号 (Stream Sequence Number, SSN)**:用于标识属于哪个流的数据分组。
- **分组序列号 (Transmission Sequence Number, TSN)**:用于标识每一个 DATA 分组。
- **有序或无序传输**:对于同一个流内的数据分组,可以根据应用需求选择是否需要按顺序接收。
#### 关联状态机
SCTP 协议定义了一个复杂的关联状态机,它根据不同的事件进行状态转换。状态包括但不限于:
- **CLOSED**:初始状态。
- **COOKIE_WAIT**:等待客户端发送 COOKIE ECHO。
- **COOKIE_ECHOED**:客户端已经发送了 COOKIE ECHO。
- **ESTABLISHED**:关联已经建立。
- **SHUTDOWN_PENDING**:正在等待关闭确认。
- **SHUTDOWN_SENT**:已经发送了 SHUTDOWN 分组。
- **SHUTDOWN_RECEIVED**:已经接收到 SHUTDOWN 分组。
- **SHUTDOWN_ACK_SENT**:已经发送了 SHUTDOWN ACK 分组。
事件包括但不限于:
- **SCTP 用户原语调用**:如 [ASSOCIATE]、[SHUTDOWN]、[ABORT] 等。
- **控制分组接收**:如 INIT、COOKIE ECHO、ABORT、SHUTDOWN 等。
- **超时事件**:如定时器超时。
#### 关联状态机处理
为了处理不同状态下的各种事件,SCTP 定义了一系列函数来更新状态机的状态。这些函数通常定义在 `sm_statetable.c` 文件中,例如:
- `chunk_event_table`:处理不同类型的控制分组。
- `prsctp_chunk_event_table`:处理部分可靠 SCTP 控制分组。
- `addip_chunk_event_table`:处理添加 IP 地址相关的控制分组。
- `auth_chunk_event_table`:处理认证相关的控制分组。
- `chunk_event_table_unknown`:处理未知类型的控制分组。
- `timeout_event_table`:处理各种超时事件。
- `primitive_event_table`:处理用户原语事件。
- `other_event_table`:处理其他类型的事件。
通过以上结构和函数,SCTP 协议能够在 Linux 内核中高效地管理关联状态和事件,确保数据的可靠传输。这些机制是 SCTP 在高可用性网络应用中的基础,为现代互联网服务提供了强大的支持。