最近在项目中遇到这样的一个问题,客户端收到一个rst包之后(在网卡上抓包),收到包之后客户端继续发送消息(send 是异步的)没有返回失败,甚是疑惑啊,最后查看包发现收到的rst包的seq和之前收到的包的seq一样,并且中间有数据收发,如下图所示
注意N. 9971和10180
起初以为即使rst包的seq和之前的重复,协议栈也应该正常处理,但是经过如下方式的验证:
伪造异常seq的rst包给客户端
1, 写一个客户端和服务端程序,服务端和服务器分别部署到两个机器上(这样抓包看起来比较明确)
2,写一个原始套接字程序,该程序功能是伪造rst包(随机seq)发送给客户端
3,客户端无响应,客户端和服务端仍然能正常收发数据
伪造正常seq的rst包给客户端
1, 写一个客户端和服务端程序,服务端和服务器分别部署到两个机器上
2,通过在客户端抓包拿到正确的seq, 套接字程序伪造一个正确的seq的rst包发送给客户端
3,客户端响应服务端关闭连接
通过以上验证得出如下结论:
rst包的seq异常的话协议栈会把该包丢弃,后续在详细写为何客户端会收到异常的rst(seq 和之前包的seq一样)包