Linux下排查网络偶现超时问题

目录:

一、问题现象

二、网络丢包测试

1、方法一hping3命令

powershell 复制代码
hping3 -c 1404 -p 65341 -S 10.6.51.xxx

参数说明:

  • -c 1404:发送 1404 个探测包(对应输出中的 1404 probes sent);
  • -p 65341:指定目标 TCP 端口 65341;
  • -S:发送 TCP SYN 包(半开扫描,用于探测端口是否开放,减少被防火墙记录的概率);
  • 10.6.51.xxx:目标 IP 地址。

效果如下:

2、方法二nc命令

powershell 复制代码
nc -v -w3 10.0.0.xxx 65341  

三、测试端口占用(服务起不来)


powershell 复制代码
netstat -tunpl | grep 25  # 查看端口 25(SMTP默认端口)的占用情况

ps aux | grep 3020  #确认该进程是 Postfix(邮件服务,master 进程)
  • 核心错误:

haproxy/nginx 启动失败,提示 bind() to 0.0.0.0:25 failed (98: Address already in use)→ 端口25已被其他进程占用,导致新服务无法绑定。

  • 占用进程定位:

netstat 结果显示 10024/qmgr(进程ID:3020)占用了 0.0.0.0:25,结合 ps aux | grep 3020 确认该进程是 Postfix(邮件服务,master 进程)。

四、tracert、traceroute命令

powershell 复制代码
traceroute www.baidu.com      # 查看我们访问百度经过的网关
traceroute -d www.baidu.com  # 访问百度并且不将地址解析成主机名。

五、网络抓包分析丢包


1、明确测试场景与抓包位置

测试操作:从 10.x.xx.245(客户端)通过 nc 测试 10.x.xx.246(服务器)的 SSH 端口(默认22端口,但截图中显示端口为 65341,可能是自定义SSH端口或测试端口)。

抓包节点:

图1:客户端 245 的抓包结果(仅能看到 245 自身发出/接收的包)。

图2:服务器 246 的抓包结果(仅能看到 246 自身发出/接收的包)。

2、分析客户端(245)的抓包(图1)

关键现象:仅发送SYN,无任何接收包

第1行:245 向 246:65341 发送 TCP SYN包(握手第一步:客户端请求建立连接)。

第2-3行:245 后续多次发送 TCP Retransmission(SYN重传包)。 原因:客户端未收到服务器的SYN-ACK响应,触发超时重传机制(默认TCP重传策略:指数退避,多次尝试后放弃)。

结论(客户端视角):

245 仅发出SYN请求,未接收到任何来自246的响应包(无SYN-ACK,也无RST/ICMP错误包)。

3、分析服务器(246)的抓包(图2)

关键现象:服务器发出SYN-ACK,但客户端无回应

第1行:245 向 246:65341 发送 SYN包(服务器收到客户端请求)。

第2行:246 向 245:56602 发送 SYN, ACK包(握手第二步:服务器同意建立连接,回应SYN+ACK)。

第3-8行:246 后续多次发送 TCP Retransmission(SYN-ACK重传包)。 原因:服务器未收到客户端的ACK确认(握手第三步),触发SYN-ACK重传。

结论(服务器视角):

246 正确收到了客户端的SYN请求,并发出了SYN-ACK响应,但未收到客户端的后续ACK,因此不断重传SYN-ACK。

4、跨节点抓包对比,定位问题

核心矛盾点:

服务器抓包(图2) 显示 246 已发出SYN-ACK包(证明服务器处理正常,网络层以下无问题)。

客户端抓包(图1) 完全没有SYN-ACK包(证明该包未到达客户端,排除客户端本地处理问题)。

推导结论:

SYN-ACK包在从246到245的传输路径中丢失(可能原因:网络拥堵、防火墙拦截、路由故障等),导致客户端收不到响应,服务器持续重传。

5、补充证据:TCP重传机制的验证

客户端(245) 的SYN重传:因未收到SYN-ACK,客户端按TCP协议重传SYN(图1第2-3行)。

服务器(246) 的SYN-ACK重传:因未收到客户端ACK,服务器按TCP协议重传SYN-ACK(图2第3-8行)。 两者的重传行为均符合"未收到预期响应"的TCP标准处理逻辑,进一步印证了"SYN-ACK包未送达客户端"的结论。

总结分析逻辑

单节点抓包确认行为:客户端仅发SYN,服务器发SYN-ACK并重传;

跨节点对比定位丢失点:服务器发出的包在客户端抓包中缺失,排除本地问题;

结合TCP协议规则:重传行为证明双方均未收到对方的后续响应,最终锁定"SYN-ACK包传输丢失"。

因此,结论"246节点发出了【SYN,ACK】包,245节点没有收到"成立。

六、linux命令分析丢包

1、如何判断存在 rx_dropped?

关键依据:/proc/net/dev 文件的接收丢包统计

/proc/net/dev 是Linux系统中反映网络接口收发数据包详细状态的核心文件,其中 drop 列 直接表示因各种原因被内核丢弃的接收包数量(即 rx_dropped)。

从提供的 第二张截图(/proc/net/dev 输出) 中,eno1 接口 的接收统计行(第2行)明确显示:

补充验证:ifconfig 输出的 RX dropped

第一张截图的 ifconfig eno1 输出中也有对应体现:

  • dropped:数值 与 /proc/net/dev 中的 drop 列数值完全一致,进一步确认接收丢包的存在。

2、rx_dropped 产生的可能原因(结合244节点背景)

  • 接收缓冲区不足(最可能)

ethtool -g eno1 显示:eno1接口的 当前接收缓冲区(RX Buff)为512("Current hardware settings" → RX Buf: 512),而默认最大值(Pre-set maximums)为4096。

若节点网络流量较大(/proc/net/dev 显示eno1接收字节数达 403GB, packets超5.4亿),512的缓冲区可能不足以应对突发流量,导致内核因"缓冲区溢出"丢弃数据包。

  • 硬件或驱动问题

节点未重启可能导致网络驱动异常(如固件bug、资源泄漏),或网卡硬件临时故障,引发数据包处理异常丢包。

  • 系统资源耗尽

故障后未重启可能残留进程占用CPU/内存,导致内核网络栈(如软中断处理)无法及时处理接收包,触发丢包。

3、建议的处理措施

  • 临时缓解:

调整eno1接收缓冲区至最大值:ethtool -G eno1 rx 4096(需root权限),观察 rx_dropped 是否减少。

  • 根本解决:

重启节点:解决因未重启导致的驱动/资源异常(故障后未重启是关键背景,重启通常能修复大部分临时软件问题)。

  • 长期监控:

重启后持续跟踪 rx_dropped 数值(watch -n 1 cat /proc/net/dev),若仍高频出现,需排查网卡硬件或更换驱动。

相关推荐
几道之旅2 小时前
websocket.WebSocketApp是全双工的吗?
网络·websocket·网络协议
阿豪只会阿巴2 小时前
【多喝热水系列】从零开始的ROS2之旅——Day3
linux·笔记·ubuntu·ros2
OpenMiniServer2 小时前
JsonKV协议技术文档
linux·服务器·网络
小鹏linux2 小时前
【linux】进程与服务管理命令 - chkconfig
linux·运维·服务器
2501_924064112 小时前
2025年APP隐私合规测试主流方法与工具深度对比
大数据·网络·人工智能
开开心心就好3 小时前
OCR识别工具可加AI接口,快捷键截图翻译便捷
java·网络·windows·随机森林·电脑·excel·推荐算法
DeeplyMind3 小时前
linux VMA创建场景详解
linux·mmap·vma
扛枪的书生3 小时前
Ansible 学习总结
linux
赵民勇3 小时前
cut命令详解
linux·shell