关于client发送rst包

客户端:


image.png

初步猜测,云盾放过了数据包,同样也向双方都发送了rst包。

1533-客户端:发送client hello
1534-云盾:发现未备案,发送rst(客户端close连接),并放行原数据包。
1565-服务器:ack确认收到数据
1566-客户端:连接已断开,响应rst
1567-服务器:响应rst

服务端:


image.png

17868-客户端:发送clent hello(说明客户端发送的未备案的包成功发送到服务器)
隐藏-云盾:发现未备案,发送rst(客户端close连接),并放行原数据包。
17870-服务端:收到数据,发送ack(ack=263=hello.seq+len)
17878-服务端:发送server hello
17879-17880服务端:发送ssl握手第三步-发送证书等数据
17883-云盾:发送rst包给服务器(因为seq理论上应该是263,只有云盾才可能发送seq=1,因为之前没发送过数据包(由于要转发真实数据,所以自己发送的数据肯定要和真实数据隔离,seq会重新计算))
17884-客户端:由于收到17878后已经close,所以响应rst
17885-客户端:由于收到17879后已经close,所以响应rst

多rst怎么解释?


image.png

实际上一个tcp包会被拆分成多个Segment包发送,所以当对方rst时(比如连接被关闭),每接受到一个包就会发送一个rst。而一个Segment包大约为1500,所以如图35988+35989大约是31500+21500 即5个包。因此收到了5个相同seq的rst。

该图和上述客户端的图应该是一套

https://www.zhihu.com/question/48454744

至于上面两个为什么不一样?
可能第一个的场景是客户端先于云盾的rst接受服务器的server hello。所以客户端开始发送第三步握手,而且由于

结论:
1:客户端发送的未备案的包成功发送到服务器。(服务器存在客户端的包)
2:云盾发现未备案后会发送rst包给客户端。(根据场外信息)
3:云盾发现未备案后会发送rst包给服务端。(服务端收到client hello后,第一个收到的rst的seq=1)
4:云盾只拦截第一个client hello,双向发送rst。(因为后面的rst的seq都正常,且不可能一端发送rst,否者会导致资源消耗。)
5:理论上应该只处理握手包,不然太耗资源
1.7:收到云盾的rst,自身close,响应rst

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容