客户反映,接口访问不定期的会出现慢响应的情况,单个请求,耗时近10s。
用 WireShark 抓包并过滤本地端口,单个访问流:
包序列解析:
(1)No.9813:第一个包是 [SYN, ECN, CwR] 包,说明启用了 ECN,发送带有 ECN 位设置的包;
(2)正常情况下,目标会返回一个[ACK]包,告知当前链路上的拥塞情况,但这里并没有收到响应包;
(3)No.9815:重新发送一次 ECN 包,也无响应;
(4)No.9855:这时,距离第一次请求已经过去了9s,之后,放弃ECN,直接尝试建立连接;
(5)No.9855 ~ No.9865:建立TCP连接,建立Https通讯,完成数据交互;
(6)No.9866:RST包,请求完成。
分析:
两次 ECN 都无响应,判断是,通路上,某个设备不支持 ECN 或出错了,发现有 ECN位设置的包就直接丢弃。
解决办法:
关闭服务器的 ECN,问题解决,响应耗时正常。
ECN关闭方法为:
netsh interface tcp set global ecncapability=disabled
附上ECN的简介
Explicit Congestion Notification(显示拥塞通知)
基本原理:路由器在出现拥塞时通知TCP。
(1)TCP段传递时,路由器使用IP首部中的2位来记录拥塞;
(2)TCP段到达后,接收方知道报文段是否在某个位置经历过拥塞。
然而,需要了解拥塞发生情况的是发送方,而非接收方。
因此,接收方使用下一个ACK通知发送方有拥塞发生,然后,发送方做出响应,缩小自己的拥塞窗口。