tcpSCTP

简要介绍SCTP协议(RFC2960)的跟踪, 分析其建立连接和断开连接的详细过程.

SCTP协议跟踪

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: yfydz_no1@https://www.360docs.net/doc/1e7752773.html,
来源:https://www.360docs.net/doc/1e7752773.html,

参考文献: RFC2960, 3309

1. SCTP(Stream Control Transmission Protocol)位于IP层与应用层之间,和TCP/UDP等并列,IP协议号:132,SCTP协议设计中考虑到了TCP协议SYN Flood攻击的问题,并进行相应的改进,目前在Linux2.6内核中已经有了SCTP的实现。

2. SCTP数据包包括通用数据头和一个到多个CHUNK,CHUNK可为数据CHUNK和控制CHUNK

3. 和TCP/UDP一样,SCTP也使用16位的端口以进行不同的应用

4. SCTP通用头
SCTP Common Header Format

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port Number | Destination Port Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Verification Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

注意: SCTP的checksum是32位的,不象TCP/UDP是16位的,范围包括全部SCTP包,但不包括IP头,因此不会象TCP和UDP那样在IPv4下和IPv6下不同.checksum计算方法在RFC2960中是用alder32算法,但发现有问题,在3309中进行了修改,使用和以太网校验类似的CRC32算法

5. CHUNK通用头

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk Type | Chunk Flags | Chunk Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

/ Chunk Value /

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

ID Value Chunk Type
----- ----------
0 - Payload Data (DATA)
1 - Initiation (INIT)
2 - Initiation Acknowledgement (INIT ACK)
3 - Selective Acknowledgement (SACK)
4 - Heartbeat Request (HEARTBEAT)
5 - Heartbeat Acknowledgement (HEARTBEAT ACK)
6 - Abort (ABORT)
7 - Shutdown (SHUTDOWN)
8 - Shutdown Acknowledgement (SHUTDOWN ACK)
9 -

Operation Error (ERROR)
10 - State Cookie (COOKIE ECHO)
11 - Cookie Acknowledgement (COOKIE ACK)
12 - Reserved for Explicit Congestion Notification Echo (ECNE)
13 - Reserved for Congestion Window Reduced (CWR)
14 - Shutdown Complete (SHUTDOWN COMPLETE)
15 to 62 - reserved by IETF
63 - IETF-defined Chunk Extensions
64 to 126 - reserved by IETF
127 - IETF-defined Chunk Extensions
128 to 190 - reserved by IETF
191 - IETF-defined Chunk Extensions
192 to 254 - reserved by IETF
255 - IETF-defined Chunk Extensions


CHUNK是描述SCTP的数据结构,分控制CHUNK和数据CHUNK,控制CHUNK一般用于连接的建立和断开,数据CHUNK用于描述数据,因此数据CHUNK就类似于TCP包中的TCP标志位,除了INIT,INIT_ACK和SHUTDOWN_COMPLETE三种CHUNK必须单独发送外,其他类型的CHUNK可以捆绑在同一个包中发送以提高效率

6. 状态机


----- -------- (frm any state)
/ / rcv ABORT [ABORT]
rcv INIT | | | ---------- or ----------
--------------- | v v delete TCB snd ABORT
generate Cookie +---------+ delete TCB
snd INIT ACK ---| CLOSED |
+---------+
/ [ASSOCIATE]
/ ---------------
| | create TCB
| | snd INIT
| | strt init timer
rcv valid | |
COOKIE ECHO | v
(1) ---------------- | +------------+
create TCB | | COOKIE-WAIT| (2)
snd COOKIE ACK | +------------+
| |
| | rcv INIT ACK
| | -----------------
| | snd COOKIE ECHO
| | stop init timer
| | strt cookie timer
| v
| +--------------+
| | COOKIE-ECHOED| (3)
| +--------------+
| |
| | rcv COOKIE ACK
| | -----------------
| | stop cookie timer
v v
+---------------+
| ESTABLISHED |
+---------------+
(from the ESTABLISHED state only)
|
|
/--------+--------
[S

HUTDOWN] /
-------------------| |
check outstanding | |
DATA chunks | |
v |
+---------+ |
|SHUTDOWN-| | rcv SHUTDOWN/check
|PENDING | | outstanding DATA
+---------+ | chunks
| |------------------
No more outstanding | |
---------------------| |
snd SHUTDOWN | |
strt shutdown timer | |
v v
+---------+ +-----------+
(4) |SHUTDOWN-| | SHUTDOWN- | (5,6)
|SENT | | RECEIVED |
+---------+ +-----------+
| |
(A) rcv SHUTDOWN ACK | |
----------------------| |
stop shutdown timer | cv:SHUTDOWN |
send SHUTDOWN COMPLETE| (B) |
delete TCB | |
| | No more outstanding
| |-----------------
| | send SHUTDOWN ACK
(B)rcv SHUTDOWN | | strt shutdown timer
----------------------| |
send SHUTDOWN ACK | |
start shutdown timer | |
move to SHUTDOWN- | |
ACK-SENT | | |
| v |
| +-----------+
| | SHUTDOWN- | (7)
| | ACK-SENT |
| +----------+-
| | (C)rcv SHUTDOWN COMPLETE
| |-----------------
| | stop shutdown timer
| | delete TCB
| |
| | (D)rcv SHUTDOWN ACK
| |--------------
| | stop shutdown timer
| | send SHUTDOWN COMPLETE
| | delete TCB
| |
+---------+ /
-->| CLOSED |<--/
+---------+

Figure 3: State Transition Diagram of SCTP


7. 建立连接


发起方 接收方
-------------------------------------------------------------------------
发送INIT---------------------------------->
(状态变为COOKIE_WAIT)
<---------------接收INIT,发送INIT_ACK,附带COOKIE
(状态仍为CLOSED)
接收INIT_ACK,发送COOKIE_ECHO----->
(状态变为COOKIE_ECHOED)
<---------------接收COOKIE_ECHO,发送COOKIE_ACK
(状态转为ESTABLISHED)
接收COOKIE_ACK,状态转为ESTABLISHED

由于接收端是收到COOKIE_ECHO包后才认为连接合法,所以某种程度上可以避免类似SYN FLOOD的攻击

8. 正常断开连接
发起方 接收方
-----------------------------------------------------------------------------------------------
发送SHUTDOWN--------------------->
(状态变为SHUTDOWN_SENT)
<---------------接收SHUTDOWN
(状态变为SHUTDOWN_RECEIVED)
<---------------发送SHUTDOWN_ACK
(状态变为SHUTDOWN_ACK_SENT)
接收SHUTDOWN_ACK,发送SHUTDOWN_COMPLETE----->
(状态变为CLOSED)
<---------------接收SHUTDOWN_COMPLETE
(状态转为CLOSED)

同时断开,两边同时发SHUTDOWN,则都发SHUTDOWN_ACK,都转为SHUTDOWN_ACK_SENT状态,发送SHUTDOWN_COMPLETE断开连接

9. 异常断开
接收或发送了ABORT类型的CHUNK,立即断开

10. 控制CHUNK和TCP标志位的类比

CHUNK TCP FLAG
-------------------------------------------------
INIT SYN
INIT_ACK SYN ACK
SACK ACK
SHUTDOWN FIN
ABORT RST
DATA PSH

11. 状态跟踪
主要跟踪INIT,INIT_ACK, COOKIE_ECHO, COOKIE_ACK, SHUTDOWN, SHUTDOWN_ACK, SHUTDOWN_COMPLETE和ABORT这些控制CHUNK来改变连接状态

12. NAT
主要就是修改SCTP的端口,然后计算校验和,和TCP、UDP类似

13. 总结
SCTP的协议跟踪和NAT的实现可以参考TCP协议跟踪的处理,比较麻烦的一点就是各类CHUNK的识别,不象TCP标志那样简单明显,其他处理都比较类似。


--------------------------------------------------------------------------------------------------------------------------

SCTP(STREAM CONTROL TRANSMISSION PROTOCOL,流控制传输协议)是一种在网络连接两端之间同时传输多个数据流

的协议。SCTP有时称“下一代TCP”或TCPng,它设计用于在因特网上支持电话连接,电话连接要求语音及其它数据与信令信息同时发送。SCTP也用于无线网络的连接管理以及多媒体数据管理,它是因特网工程任务组(IETF)开发的标准协议(RFC 2960)。

跟TCP相似,SCTP管理因特网上基本上无连接的网络协议(IP),IP协议负责传输数据但不管理是否所有数据都到达。不同的是,SCTP保证相连两端之间多个数据流的完整同时传输,SCTP也支持多源点,也就是相连端点可具有变化的IP地址以避免网络错误或变化的环境。

SCTP允许数据以多个独立的数据流传输,如果一个数据流发生数据丢失,其它数据流的传输不受影响。

作为一个传输层协议,SCTP可以理解为和TCP及UDP相类似的。事实上,它提供的服务有点像TCP——保证可靠、有序传输消息。同时TCP是面向字节的,而SCTP是针对成帧的消息。

SCTP主要的贡献是对多重联外线路的支持,一个端点可以由多于一个IP地址组成,使得传输可在主机间或网卡间做到透明的网络容错备援。

SCTP最初是被设计用于在IP上传输电话(SS7),把SS7信令网络的一些可靠特性引入IP。IETF的这方面的工作称为信令传输SIGTRAN。与此期间,也提出了这个协议的其他一些用途。

SCTP 提供如下服务:

* 确认用户数据的无错误和无复制传输;
* 数据分段以符合发现路径最大传输单元的大小;
* 在多数据流中用户信息的有序发送,带有一个选项,用户信息可以按到达顺序发送;
* 选择性的将多个用户信息绑定到单个 SCTP 包;
* 通过关联的一个终端或两个终端多重宿主支持来为网络故障规定容度。


SCTP,STREAM CONTROL TRANSMISSION PROTOCOL,流控制传输协议,是提供基于
不可靠传输业务的协议之上的可靠的数据报传输协议.SCTP的设计用于通过IP网传输SCN
窄带信令消息.SCTP实际上是一个面向连接的协议,但SCTP偶联的概念要比TCP的连接具有
更光的概念,SCTP对TCP的缺陷进行了一些完善,使得信令传输具有更高的可靠性,SCTP的设计
包括适当的拥塞控制、防止泛滥和伪装攻击、更优的时时性能和多归属性支持。
SCTP被视为一个传输层协议,他的上层作为SCTP用户应用,下层作为分组网络。


SCTP提供的最基本服务就是为一对SCTP用户之间交互的消息提供可靠的传输。
SCTP实现服务的基础就是一对SCTP端点之间的“连接”(association),因此SCTP是一个面向连接的协议,SCTP的连接是多归属的,也就是说一个连接的任意一端的端点可以具有多个IP地址,但SCTP端口号唯一。
流:是SCTP协议的一个特色术语。是一条SCTP偶联中,从一个端点到另一个端点的单

向逻辑通道。希望顺序传递的数据必须在一个流里面传输


相关主题
相关文档
最新文档