客户端:10.1.76.193
服务端:10.1.23.12
1、抓包
通过wireshark抓包,设置捕获包含目标主机ip的数据过滤条件,ip.addr == 10.1.23.12
成功包:success_dump.pcapng
失败包:error_dump.pcapng
也可以通过tcpdump获取,然后导入wireshark分析
tcpdump -i ens33 host 10.1.23.12 and port 8081 -n -vvv -X -w ./target.cap
2、比对分析:
成功状态下:服务端收到请求后,会给客户端发送确认收到信息ACK


失败状态下:

现象:1、成功的请求 Timestamp value 值都比较小
2、失败的请求没收到服务端返回ACK的通知
3、客户端补发的请求发生TCP Retransmission 连接超时异常
3、解决方式:
修改服务器/etc/sysctl.conf文件里面的(没有就添加)
net.ipv4.tcp_timestamps=0
再次 抓包测试 TCP 连接没有再出现 超时
timestamp扩展:
同时开启timestamp(时间戳)和tw_recycle(快速回收),会导致在一个MSL时间内只响应timestamp递增的请求,对于时间戳较小的请求都抛弃了(不响应ack)
MSL扩展: RFC793中规定MSL为2分钟,也就是说2分钟内同一个ip的请求的时间戳要求递增,不是递增的话服务器不予响应。

本文详细介绍了通过wireshark和tcpdump抓包工具分析TCP连接超时的情况。在成功状态下,服务端会发送ACK确认。然而,失败状态显示请求未收到ACK且客户端出现重传超时。问题根源在于timestamp和tw_recycle选项导致服务器只响应时间戳递增的请求。解决方案是禁用net.ipv4.tcp_timestamps,从而避免连接超时。
1189

被折叠的 条评论
为什么被折叠?



