背景:
我们有一款私有化部署系统,服务于用户购买的智能终端(简单理解为顺丰小哥手持的扫码枪)。周六接到端开发工程师反馈,此批设备续航异常,理论数据两周,但实际只有三至四天。
经过监测电量、抓包手段,电流的峰谷交替约为20秒
端上抓包也显示每20秒收到来自服务器的keepalive报文,此原因导致设备无法休眠!
排查过程:
- 首先去服务端抓包,很清晰也能看到每20秒。当我看到抓包结果时,马上自信的答复,这是端上发来的keepalive包呀,肯定端上问题,不查端查服务器干嘛- -!
- battle,端开发工程师回怼,“我抓包是从服务器端返回的”,仔细一看还真是。这时候懵圈,证据显示都是对方发来的,且正确响应
- 没头绪时,在想经历的中间环节。智能终端---aws NLB---mqtt服务器,NLB配置了标准的tls,卸载证书后转发到mqtt,功能测试都正常,且NLB用了这么久,不应该有问题
- 难道是运营商或者网络设备发送?想想不可能,tcp无法伪造IP,持续没头绪
- 中间环节只有NLB,进一步排查发现aws的NLB有区别于其他云的独特“机制”
- 接下来就是验证EIP直接暴露,问题消失。问题确认
总结:
aws NLB产品如果配置了tls监听,会主动20秒为周期发送keepalive!!!
客户端发送Keep-Alive包
AWS NLB行为时间线
时间点 | 行为描述 |
---|
第0秒 | 客户端发送Keep-Alive包,NLB接收到并立即返回。 |
第20秒 | NLB发送Keep-Alive包到前端和后端。 |
第40秒 | NLB再次发送Keep-Alive包到前端和后端。 |
第60秒 | 客户端再次发送Keep-Alive包,NLB接收到并重置计时。 |
第80秒 | NLB发送Keep-Alive包到前端和后端。 |
... | 重复每20秒发送Keep-Alive包的过程,直到客户端停止发送。 |
阿里云NLB行为时间线
时间点 | 行为描述 |
---|
第0秒 | 客户端发送Keep-Alive包,NLB接收到并保持连接。 |
第60秒 | 客户端再次发送Keep-Alive包,NLB接收到并保持连接。 |
第120秒 | 客户端再次发送Keep-Alive包,NLB接收到并保持连接。 |
... | 重复每60秒发送Keep-Alive包的过程,直到客户端停止发送。 |
客户端不发送Keep-Alive包
AWS NLB行为时间线
时间点 | 行为描述 |
---|
第0秒 | 客户端与NLB建立连接。 |
第350秒 | 没有数据包发送,NLB关闭连接并发送TCP RST包。 |
第351秒 | 连接关闭,客户端无法继续发送数据。 |
阿里云NLB行为时间线
时间点 | 行为描述 |
---|
第0秒 | 客户端与NLB建立连接。 |
第900秒 | 没有数据包发送,NLB关闭连接。 |
第901秒 | 连接关闭,客户端无法继续发送数据。 |