某客户端,下发数据正常,但是不上传数据。 总是心跳超时,被服务端杀掉。 (1)查看日志,发现服务端有下发心跳,客户端也回复了,但是依然被服务端杀掉。 怀疑数据包服务端没有收到。、 (2)双方同时抓包,分析,发现有下发心跳,但是没有回复的心跳。 百思不得其解,然后突然想到,服务端IO线程队列满的话,心跳发不下来。 那么同样的,客户端是不是也是队列满呢…… (3)此时应该客户端做个dump,然后分析。 (4)客户端做netstat,发现有几个last_ack的连接。 (5)这时,在客户端的抓包里发现了,一些红色的重传数据。 开始几秒一次,后来稳定在1分钟一次,持续几分钟。 也就是上传的数据包丢失了,TCP进行重传,依然没有结果,然后加倍时间等待,最后到1分钟重试一次。 所以,原因就清楚了。 ---------------------- 上传数据丢包,TCP进行重传,多次没有结果,最后导致1分钟重试一次。 上传动作完全停滞,所以send指令都堆积在队列里。 然后服务端断开连接,但是因为数据没有发完,所以客户端是last_ack状态,依然在尝试发送。 如此几次,客户端有多个连接在重试。 ---------------------- 尝试修改windows注册表参数,将tcp重传次数改小,让它快速失败,断开连接。 貌似可以了?
|