客户端:
初步猜测,云盾放过了数据包,同样也向双方都发送了rst包。
1533-客户端:发送client hello
1534-云盾:发现未备案,发送rst(客户端close连接),并放行原数据包。
1565-服务器:ack确认收到数据
1566-客户端:连接已断开,响应rst
1567-服务器:响应rst
服务端:
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怎么解释?
实际上一个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