Linux系统下如何仅获取TCP协议的网络统计数据(排除UDP)?
分离TCP与UDP流量统计及netstat "segment" 含义解答
一、分离TCP/UDP流量统计的方法
可以通过以下几种方式实现精准统计:
- 使用
ss命令(netstat的现代替代工具)ss -ti可查看单条TCP连接的收发字节数,结合awk可汇总全局TCP总流量:
对应UDP统计可替换为# 统计TCP接收总字节数 ss -ti | awk '/recv_bytes/ {sum += $2} END {print "TCP接收总字节: " sum}' # 统计TCP发送总字节数 ss -ti | awk '/send_bytes/ {sum += $2} END {print "TCP发送总字节: " sum}'ss -ui。 - 读取内核
/proc/net/snmp统计文件
内核维护了TCP、UDP的全局字节统计,直接读取即可:
其中# 提取TCP收发字节数 grep -A 10 TCP /proc/net/snmp | awk '/InOctets/ {print "TCP接收字节: " $2} /OutOctets/ {print "TCP发送字节: " $4}' # 提取UDP收发字节数 grep -A 10 UDP /proc/net/snmp | awk '/InOctets/ {print "UDP接收字节: " $2} /OutOctets/ {print "UDP发送字节: " $4}'InOctets和OutOctets就是对应协议的字节统计值,单位为字节,完全可以替代你之前用的网卡全局rx_bytes/tx_bytes。 - tcpdump临时过滤统计
若需统计特定时间段的TCP流量,可使用tcpdump实时过滤:# 统计eno1网卡TCP接收字节数 tcpdump -i eno1 tcp -w /dev/null 2>&1 | awk '/captured/ {split($6,a,"."); print "TCP接收字节: " a[1]}'
二、netstat中"segment"的含义
netstat -st里的"segment"指TCP段,它的大小不是固定MTU:
- TCP段的最大长度由MSS(最大段大小)决定,MSS通常是MTU减去IP头和TCP头长度(比如MTU为1500时,MSS一般为1460)。
- 实际传输中,TCP段大小可以小于MSS,比如数据量不足、拥塞控制、分段重传场景下,都会产生更小的段。
- 所以
segments received/sent out是TCP段的数量统计,和字节数属于不同维度的指标,无法直接换算成固定大小的字节值。
内容的提问来源于stack exchange,提问作者wef
相关产品推荐
相关产品推荐

