Windows下完成SCTP简单抓包
文章目录
一、实验主机信息
二、所使用的程序
sctplib-1.0.4.exe、glib-1.2.zip 、wireshark
http://www.sctp.be/sctplib/
具体软件安装请见:SCTP在windows下简单实现发包
三、程序安装
1.将sctplib-1.0.4.exe和glib-1.2.zip下载到本地计算机上。
2.安装 sctplib-1.0.4.exe到本机器上,安装完后将glib-1.2.zip解压到它的安装目录下,例如:E:/Program Files/sctplib下面。
3.这个SCTP的实现是在两个机器之间进行的,所以要另外一台机器也要和你自己安装相同的工具(以上两个)。
四、实验过程
- 由于Windows自带防火墙的存在,当带有防火墙的主机收到了SCTP的INIT信息后,防火墙会直接将该包丢弃,所以在实验开始前关闭两个主机的防火墙
- S端先以管理员模式打开echo_server,C端在命令提示符窗口中打开echo_tool(先开S端,再开C端)
- 在C端命令中输入 echo_tool -d 192.168.1.108(S端IP),即可与S端建立连接,并可以在抓包软件中看到SCTP四握手,等待大约30秒即可收到SCTP的heartbeat报文与heartbeat_ACK报文
-
C端命令中输入echo_tool -d 192.168.1.108(S端IP)-n 1,即可在上述过程之外再抓到C端与S端互发的DATA数据块,其中双方的确认方式均为选择确认(确认模式固定,发包内容大小固定,可能无法改变?)
-
由于程序设置的问题,无法主动正常断开链接,只能通过ctrl+c异常断开,故在3.4步骤后续中抓到的包为ICMP协议不可达(C段程序断开,协议信息无法送达)
-
其他参数可由C端指令符中echo_tool/?获得其参数对应的作用
五、报文分析
1.SCTP报文格式
2.SCTP四次握手
SCTP INIT报文
SCTP INIT-ACK 数据报
注:INIT中的验证标志位,因为还未接收到对方ACK中的初始标志,默认为0
字段 | 长度 | 意义 |
---|---|---|
初始标志 | 4 | 用于确定一对连接的值。这个值必须被放置到INIT的接收方发送的与该连接相关的每个SCTP分组中的验证标签字段中。初始标签允许除0以外的的任何值。如果在收到的INIT数据块中的启动标签为0,则接收方发送ABORT数据块中止该连接。 |
窗口大小 | 4 | 表示指定的缓冲区的容量,用字节数表示,为INIT发送方为连接预留的窗口大小。 |
输出流 | 2 | 表示发送方希望数据输出流的数量 |
输入流 | 2 | 表示发送方允许接收数据流的数量 |
初始TSN | 4 | 定义发送方的初始TSN,类似于TCP中的序号 |
可变长参数 | 可变 | 参见以下 |
可变长参数:IPv4地址参数(5)
IPv4地址(32bit无符号整数):包含发送方端点的IPv4地址,采用二进制编码。
IPv6地址参数(6)
IPv6地址(128bit的无符号整数):包含发送方端点的IPv6地址,采用二进制编码。
注:多个地址参数体现SCTP的多宿主特点
防止Cookie过期参数(9)
INIT的发送方应使用这个参数来建议INIT的接收方提供较长存活跨度的状态Cookie。
建议的COOKIE存活跨度增量(32bit的无符号整数),该参数用来向接收方指示发送方希望接收方为其缺省的COOKIE的存活跨度增加的毫秒数。
由于失效的cookie操作差错原因,前一次尝试与对等端建立连接失败后,又重新尝试连接建立时,这个任选参数应能由发送方添加到INIT数据块中。
主机名地址(11)
INIT发送方使用这个参数把其主机名(在其IP地址的位置中)传递到对等层。这个对等层负责解析这个主机名,用这个参数可以使连接工作通过NAT box进行工作
主机名:可变长度,该字段包含了按照RFC1123规定的“主机名句法”定义的主机名,主机名地址的解析不在本标准中规定,该参数中至少有一个非空的中止符包含在主机名字符串中,并且应包含长度。
支持的地址类型(12)
NIT的发送方使用该参数列出其所支持的全部地址类型。
地址类型(16bit无符号整数):该参数使用对应的地址类型的类型值(例如:IPv4=5,IPv6=6,主机名=11)
实例分析:
注:Parameter padding字段用于参数填充,使其对齐或成为8的整数倍(二进制),能够进行差错检验和计算
SCTP INIT_ACK 数据报
报文实例:
SCTP COOKIE_ECHO数据报
报文实例:
SCTP COOKIE_ACK 数据报
报文实例:
SCTP SACK数据报
字段 | 长度 | 意义 |
---|---|---|
类型 | 1 | |
标志 | 2 | 设为全0并由接收方忽略 |
长度 | 4 | |
累积TSN确认 | 4 | 该参数包含了在收到TSN序列的间隔前的最后一个TSN值 |
窗口大小 | 2 | 规定了SACK的发送方的接收缓冲容量的字节数。 |
间隔ACK块数 | 2 | 用来指示SACK数据块中包含的间隔证实块的数目 |
重复TSN数 | 2 | 该字段包含了该端点收到的重复的TSN的数目 |
间隔ACK块结束偏移量 | 2 | 该字段用来指示这个间隔整数块的起始TSN偏移,为了计算实际的TSN号码必须要用累积TSN证实加上偏移号码。 |
重复TSN | 4 | 用来指示一个在上一个SACK发送后收到的TSN重复的个数。每次一个接收者收到一个重复的TSN(在发送SACK前),则把这个TSN加到重复的TSN列表中。 |
SCTP DATA块
报文实例:
注:该SACK+DATA中的DATA未发生分片,且按序。
注:以下两个报文为另一次连接建立所抓到的,所以固定首部中的验证标志位与上面不同。
SCTP HEARTBEAT块
(意义:用于检测连接对象是否已经断开)
报文实例:
SCTP HEARTBEAT_ACK块
报文实例: