TCP_FLAGS_INVALID_13_Flag SYN,ACK
测试目的
验证TCP协议栈在LAST-ACK状态下,收到一个携带SYN和ACK标志、且序列号不合法的数据段时,能否正确响应并保持连接状态不变。
UT测试方法
Precondition:
DUT正常通信,UT正常运行,DUT处于LAST-ACK状态
Step to reproduce:
Step1,UT使DUT进入LAST-ACK状态(DUT发送FIN后等待ACK)
Step2,测试端发送SYN+ACK(SEQ=4194342,在接收窗口外,RST=0)
Step3,测试端监听DUT接口
Step4,测试端验证DUT是否仍处于LAST-ACK状态
Expected results:
At Step3,DUT应回复ACK(SEQ=3066232763, ACK=2)指示正确的预期SEQ号
At Step4,DUT应保持在LAST-ACK状态
需求出处:
TC8 5.8.6.6.13 p342 (MUST) / RFC 793 s3.9 p69
非UT测试方法
Precondition:
一台Ubuntu电脑,T1转RJ45转换器,Ubuntu电脑可与DUT正常通信
Step to reproduce:
1、在Ubuntu系统配置vlan2网卡,ip=172.16.2.97
2、编译运行EthUnitTest,执行如下
3、在DUT系统执行如下
4、当Ubuntu执行完close接口,发送FIN后,立即在DUT系统端输入如下命令
bash
iptables -A INPUT -s 172.16.2.97 -d 172.16.2.99 -p tcp --tcp-flags ACK ACK -j DROP
以此过滤Ubuntu发给DUT的ACK报文,这样当DUT收到FIN+ACK后,调用close接口回复FIN+ACK时,Ubuntu回复的ACK报文就会被过滤,导致DUT测试程序处于LAST_ACK状态。
以下是用netstat命令确认LAST_ACK状态的过程
这时,Ubuntu端再输入指令发送SYN+ACK验证DUT是否会回复ACK并指示正确的预期SEQ号。
注意这里发送SYN+ACK前要先在DUT系统端执行iptables -F关闭防火墙(注意要眼疾手快 ),否则会被过滤。
之所以要眼疾手快,因为DUT调用close接口回复FIN+ACK后,一直没有收到Ubuntu的ACK,会触发FIN+ACK重传。如果恰好在关闭防火墙时有FIN+ACK重传并且收到了ACK,DUT就会进入TIME_WAIT状态,不符合测试要求。
报文分析

测试源码请见后续博文