本帖最后由 KYLE_K 于 2020-5-9 09:20 编辑
太长不看版: 由于客户端性能或者网络质量不好,负载均衡原本立即转发给客户端的数据没有转发出去,数据包积压在负载均衡,导致TCP窗口资源耗尽,向后端设备发送TCP的0窗口数据包,造成业务监控系统误判负载均衡性能不足。
详细分析过程: 一.问题描述
根据客户的业务性能监控系统,出现“服务器TCP窗口为0的次数”的警报信息,疑似SSL VPN出现性能不足的情况,触发警报的IP为172.18.35.21、172.18.35.22和172.18.35.23,经确认这三个IP为SSL VPN集群设备IP,需要对这异常情况进行分析。
二.触发“TCP 0窗口”警报情况分析 什么情况下服务器会向客户端发送0窗口报文? 根据TCP滑动窗口机制:某些情况下,服务器无法再处理从客户端发送的数据。可能是由于内存不足,处理能力不够,或其他原因。为避免造成数据被丢弃以及传输中断,服务器会发送窗口为0的报文。当客户端接收到此报文时,它会暂停所有数据传输,会以传输探测(keep-alive)报文的方式,保持与服务器的连接。探测报文在客户端以稳定间隙发送,以查看服务器接收窗口状态。一旦服务器能够再次处理数据,将会返回非零值窗口大小,传输会恢复。
三.数据包采集和分析监测SSL VPN的CPU和内存负载情况,均无异常,则需要对SSL VPN进行网络数据采集分析,定位问题根源。
一. 在SSL VPN 上采集TCP 的0窗口数据包进行分析,发现SSL VPN 向后端设备发送0窗口数据包之前,都会收到来自负载均衡的0窗口数据包,问题疑似与前置设备有关,遂对前置的负载均衡也进行抓包分析;
二.因为负载均衡会将0窗口数据包发送到 SSL VPN上,所以在负载均衡上采集TCP 的0窗口数据包进行分析,发现负载均衡在发送0窗口数据包之前,都会收到来自互联网客户端0窗口数据包或者发现客户端有网络延迟的情况;
数据包关联 数据包经过负载均衡后,会进行目的地址转换,可以通过对比数据内容,将地址转换前和转换后的数据包关联分析,确认是同一个体个数据流,在转换前和转换后的数据包。 数据包采集点1的数据解包情况如下:
数据包采集点2的数据解包情况如下:
数据包关联说明 一.数据包1和数据包2的第一张图进行对比,客户端源地址一致,客户端与服务器载荷长度一致; 二.数据包1和数据包2的第二张图进行对比,数据包时间相差不足0.001秒,MAC地址均和F5关联; 三.数据包1和数据包2的第三张图进行对比,客户端发送的数据内容一致; 四.基于以上三个对比结果,判断两个TCP会话是同一个数据流在不同网段的会话。
数据包分析 一.F5在0.008828秒,已经完整接收SSL VPN发过来的数据包,并向SSL VPN 发送ACK确认包,确认已经完整接收相关数据,数据包截图如下图所示:
二.F5在0.0673秒,将SSL VPN 发送过来的数据转发到客户端,F5从接收SSL VPN完整接收数据数是在0.0088秒完成,中间有0.0585秒的时间间隔;数据包截图如下图所示:
三.互联网客户端与F5在0.058秒建立TCP连接,据数据包截图如下图所示:
四.综合以上情况进行分析,判断客户端与F5建立TCP连接有延迟,F5未能第一时间转发相应的数据,未及时转发的数据暂存在F5相应的缓存中,当缓存空间不足时,导致F5向SSL VPN 发送TCP的0窗口数据包,如下图所示:
五.F5除了会将TCP的0窗口数据包发送到SSL VPN 设备,也会发送到其他设备上,这一点得到F5方面的证实,如下图所示:
四.分析结论 结合以上的数据包分析情况,得出以下结论: 一.互联网客户端与F5建立某个TCP会话,互联网客户端性能不足时,会直接向F5发送TCP的0窗口数据包,客户端不再接收F5发送的数据包,导致F5上会积压SSL VPN 发过来的数据包;
二.互联网客户端与F5建立某个TCP会话,互联网客户端网络质量较差时,接收F5的数据包会产生延迟,导致F5上会积压SSL VPN 发过来的数据包;
三.当F5上积压的数据包到一定的程度,消耗尽某一个TCP会话的TCP窗口,F5就会向SSL VPN 发送TCP0窗口,不再接收SSL VPN 发过来相关的TCP会话数据;
四.当SSL VPN上积压的数据包到一定的程度,消耗尽某一个TCP会话的TCP窗口,SSL VPN 就会向相应的后端设备发送TCP0窗口,不再接收相应后端设备发过来相关的TCP会话数据;
五.TCP窗口发送0窗口,仅针对当前TCP会话,证实F5与SSL VPN上其他已经建立的TCP会话并无影响,也不会影响设备正常运行;
六.综上所述,F5和SSL VPN发送TCP的0窗口数据包的问题,是由于互联网客户端性能不足或者网络延迟引发的。
答疑说明: 为什么负载均衡的数据包没有转发到客户端?因为负载均衡转发一个数据到客户端,必须要收到客户端的确认包(ACK包),才会再转发下一个数据包。可能是客户端网络质量不好或者是客户端性能不足,迟迟没有发送ACK包给负载均衡,导致负载均衡没法转发数据包。 |