能,iptraf-ng支持按tcp、udp、icmp等协议分类统计流量,需启动后进入“ip traffic monitor”并选择“filter by protocol”,还可下钻至端口和主机维度。

iptraf-ng 能按协议分类统计流量吗
能,而且是目前最直接支持协议维度分类的命令行工具。它不像 iftop 那样只聚焦连接,也不像 nload 那样只看接口吞吐,而是把流量拆解到 TCP、UDP、ICMP、ARP 等协议层,还能进一步下钻到端口和主机。
常见错误是误以为 iptraf-ng 启动后默认就显示协议统计——其实它默认进的是“General Interface Statistics”主菜单,协议分类藏在子菜单里。
- 安装后运行
sudo iptraf-ng - 按方向键选中 “IP traffic monitor” → 回车
- 再选 “Filter by protocol” → 回车,就能看到 TCP/UDP/ICMP 等实时占比和字节数
- 若想看某协议下的具体端口分布,可在协议视图中按
P键切换到端口视图
注意:它依赖 libpcap 抓包,所以必须用 sudo;某些容器环境或 hardened kernel 可能禁用 raw socket,此时会报错 pcap_open_live: operation not permitted。
iftop 无法直接按协议分类,但能间接推断
iftop 本身不提供协议汇总面板,但它的连接列表里每行都带协议标识(如 tcp、udp),配合 grep 和 awk 可快速统计当前活跃连接的协议分布。
例如,执行以下命令可粗略统计当前 top 10 连接中各协议数量:
sudo iftop -P -n -N -t -L 10 2>/dev/null | grep -E 'tcp|udp|icmp' | awk '{print $5}' | sort | uniq -c | sort -nr
说明:
-
-P强制显示端口号(避免服务名干扰) -
-n关闭 DNS 解析,加速输出 -
-t文本模式输出(适合管道处理) -
-L 10限制只抓前 10 行活跃连接
缺点是它只反映“当前瞬时连接”,不统计已关闭但曾传输大量数据的连接;且 ICMP 流量极少出现在 iftop 列表中(通常被过滤),实际协议占比会被低估。
cat /proc/net/dev 只给总量,没法分协议
cat /proc/net/dev 返回的是每个网卡的原始计数器:总字节数、包数、错误数等。它完全不区分协议,所有流量混在一起。你看到的 bytes 字段是 TCP + UDP + ICMP + 其他一切的总和。
如果硬要“分协议”,唯一办法是结合 ss 或 netstat 查当前 socket 状态,再估算比例,但结果严重失真——比如一个长连接 TCP 流量巨大,但 ss 只告诉你“有 1 个 ESTABLISHED 连接”,无法反推出它占用了多少字节。
所以别指望从 /proc/net/dev 解出协议分布。它适合做脚本监控基线(比如每分钟读一次 rxbyt/s),不适合分析协议构成。
sar -n IP 或 -n EDEV 能查协议级历史统计,但需 sysstat 开启收集
sar 的 -n IP 选项可输出 IPv4 协议栈的收发统计(如 InReceives、OutRequests),-n EDEV 则统计错误(如 InHdrErrs)。但它不是实时流式数据,而是轮询内核计数器,依赖 sysstat 的后台采集进程 sa1 是否已启用。
检查是否可用:
- 运行
sar -n IP 1 1,若报错Requested activities not available,说明未启用 IP 统计 - 编辑
/etc/sysconfig/sysstat(RHEL/CentOS)或/etc/default/sysstat(Debian/Ubuntu),确保ENABLED="true" - 确认
/etc/cron.d/sysstat中的 cron 任务是否激活(通常每 10 分钟跑一次sa1)
启用后,sar -n IP -f /var/log/sa/sa$(date +%d) 才能回溯当天的协议层收发包数。单位是“包数”,不是字节,且不区分上层协议(TCP/UDP),只到 IP 层。
iptraf-ng 是最省事的选择;如果只是临时排查,iftop 加管道也能凑合;别在 /proc/net/dev 上浪费时间试图拆解协议;而 sar 更适合长期趋势归因,不是即时诊断工具。











