通过/proc/net/netstat文件详解

/proc/net/netstat 是一个内核提供的虚拟文件,包含详细的网络协议栈统计信息,是监控和分析系统网络性能与状态的关键来源。其内容主要分为以下四部分:
1、TcpExt (TCP 扩展统计):

  • 提供 TCP 协议扩展的性能和状态指标。
  • 包含连接管理(如 SYN Cookie、TIME_WAIT 状态)、重传机制(快速重传、超时重传、SACK)、队列管理(溢出、丢弃)、内存压力事件等深层统计。
  • 用途: 诊断 TCP 连接性能问题(如丢包、重传、延迟)、识别资源瓶颈(内存、队列溢出)、检测潜在攻击(SYN Flood)。

2、IpExt (IP 扩展统计):

  • 提供 IP 层(网络层)的扩展流量和错误统计。
  • 包含接收/发送的字节数 (Octets)、组播/广播包计数、路由失败 (InNoRoutes)、校验和错误 (InCsumErrors)、分片重组问题 (ReasmOverlaps)、显式拥塞通知 (ECN) 相关计数等。
  • 用途: 监控 IP 层整体流量、检测底层网络问题(如路由失效、校验和错误、分片异常)、分析拥塞情况 (ECN)。

3、Udp (UDP 基本统计):

  • 提供 UDP 协议的核心流量和错误统计。
  • 包含接收/发送的数据包数量、无法交付到应用端口的数据包数量 (UDP 层“找不到端口”的错误)。
  • 用途: 监控 UDP 流量规模、识别目标端口不可达等常见 UDP 错误。

4、Tcp (TCP 基本统计):

  • 提供 TCP 协议的核心连接状态和流量统计。
  • 包含各 TCP 状态(如 ESTABLISHED, LISTEN, TIME_WAIT)的连接数、传输的报文段数量、发生的错误数量等基础信息。
  • 用途: 了解系统 TCP 连接的总量、状态分布、基本数据传输量和错误概况。
 

在我们查看计数器文件/proc/net/netstat,通过cat命令直接查看会发现很乱(如下图)给我们分析网络原因时造成一些困境,那有没有方法让他更通俗易懂?

cat /proc/net/netstat 
TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed EmbryonicRsts PruneCalled RcvPruned OfoPruned OutOfWindowIcmps LockDroppedIcmps ArpFilter TW TWRecycled TWKilled PAWSPassive PAWSActive PAWSEstab DelayedACKs DelayedACKLocked DelayedACKLost ListenOverflows ListenDrops TCPPrequeued TCPDirectCopyFromBacklog TCPDirectCopyFromPrequeue TCPPrequeueDropped TCPHPHits TCPHPHitsToUser TCPPureAcks TCPHPAcks TCPRenoRecovery TCPSackRecovery TCPSACKReneging TCPFACKReorder TCPSACKReorder TCPRenoReorder TCPTSReorder TCPFullUndo TCPPartialUndo TCPDSACKUndo TCPLossUndo TCPLostRetransmit TCPRenoFailures TCPSackFailures TCPLossFailures TCPFastRetrans TCPForwardRetrans TCPSlowStartRetrans TCPTimeouts TCPLossProbes TCPLossProbeRecovery TCPRenoRecoveryFail TCPSackRecoveryFail TCPSchedulerFailed TCPRcvCollapsed TCPDSACKOldSent TCPDSACKOfoSent TCPDSACKRecv TCPDSACKOfoRecv TCPAbortOnData TCPAbortOnClose TCPAbortOnMemory TCPAbortOnTimeout TCPAbortOnLinger TCPAbortFailed TCPMemoryPressures TCPSACKDiscard TCPDSACKIgnoredOld TCPDSACKIgnoredNoUndo TCPSpuriousRTOs TCPMD5NotFound TCPMD5Unexpected TCPSackShifted TCPSackMerged TCPSackShiftFallback TCPBacklogDrop PFMemallocDrop TCPMinTTLDrop TCPDeferAcceptDrop IPReversePathFilter TCPTimeWaitOverflow TCPReqQFullDoCookies TCPReqQFullDrop TCPRetransFail TCPRcvCoalesce TCPOFOQueue TCPOFODrop TCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenActiveFail TCPFastOpenPassive TCPFastOpenPassiveFail TCPFastOpenListenOverflow TCPFastOpenCookieReqd TCPSpuriousRtxHostQueues BusyPollRxPackets TCPAutoCorking TCPFromZeroWindowAdv TCPToZeroWindowAdv TCPWantZeroWindowAdv TCPSynRetrans TCPOrigDataSent TCPHystartTrainDetect TCPHystartTrainCwnd TCPHystartDelayDetect TCPHystartDelayCwnd TCPACKSkippedSynRecv TCPACKSkippedPAWS TCPACKSkippedSeq TCPACKSkippedFinWait2 TCPACKSkippedTimeWait TCPACKSkippedChallenge TCPWqueueTooBig
TcpExt: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 0 0 0 0 0 0 0 0 339 0 111 381 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 565 0 0 0 0 0 0 0 0 0 0 0
IpExt: InNoRoutes InTruncatedPkts InMcastPkts OutMcastPkts InBcastPkts OutBcastPkts InOctets OutOctets InMcastOctets OutMcastOctets InBcastOctets OutBcastOctets InCsumErrors InNoECTPkts InECT1Pkts InECT0Pkts InCEPkts ReasmOverlaps
IpExt: 3 0 0 0 265 0 90641 134044 0 0 18251 0 0 1304 0 0 0 0

 我们可以通过awk命令来进行格式化输出

cat /proc/net/netstat |  awk '(f==0) {name=$1; i=2; while ( i<=NF) {n[i] = $i; i++ }; f=1; next} (f==1){ i=2; while ( i<=NF){ printf "%s%s = %d\n", name, n[i], $i; i++}; f=0}'
TcpExt:SyncookiesSent = 0  # 表示发送的SYN cookie的数量。SYN cookie是一种防止SYN洪泛攻击的技术。如果这个值很高,可能意味着服务器正在经历SYN洪泛攻击
TcpExt:SyncookiesRecv = 0  # 表示接收到的SYN cookie的数量。如果这个值很高,可能意味着服务器正在经历SYN洪泛攻击。
TcpExt:SyncookiesFailed = 0 # 验证失败的 SYN Cookie 数量(可能因攻击或错误)。
TcpExt:EmbryonicRsts = 0 # 在 SYN-RCVD 状态(半连接)收到的 RST 包数量。
TcpExt:PruneCalled = 0 # 因内存不足触发缓存清理的次数。
TcpExt:RcvPruned = 0 # 接收队列因内存不足被修剪(丢弃数据包)的次数。
TcpExt:OfoPruned = 0 # 乱序队列(Out-of-Order queue)因内存不足被修剪的次数。
TcpExt:OutOfWindowIcmps = 0 # 收到的与当前 TCP 窗口无关的 ICMP 错误报文数量。
TcpExt:LockDroppedIcmps = 0 # 因无法获取 socket 锁而被丢弃的 ICMP 报文数量。
TcpExt:ArpFilter = 0  # 因 ARP 过滤规则而被丢弃的数据包数量。
TcpExt:TW = 0  # 进入 TIME_WAIT 状态的连接数。
TcpExt:TWRecycled = 0 # 通过 tcp_tw_recycle 重用的 TIME_WAIT 连接数(已废弃)
TcpExt:TWKilled = 0 # 因内存不足提前销毁的 TIME_WAIT 连接数。
TcpExt:PAWSPassive = 0
TcpExt:PAWSActive = 0
TcpExt:PAWSEstab = 0
TcpExt:DelayedACKs = 19  # 延迟确认(Delayed ACK)发送次数。
TcpExt:DelayedACKLocked = 0
TcpExt:DelayedACKLost = 0 # 延迟 ACK 丢失导致重传的次数。
TcpExt:ListenOverflows = 0  # 表示在TCP监听队列中发生的溢出次数。如果这个值很高,可能意味着服务器正在经历过载或拒绝服务攻击。
TcpExt:ListenDrops = 0 # 因全连接队列满丢弃的连接总数(含ListenOverflows)。
TcpExt:TCPPrequeued = 0  # 预排队(在软中断处理前)的输入段数量
TcpExt:TCPDirectCopyFromBacklog = 0  # 从backlog队列直接复制到用户空间的数据包数量
TcpExt:TCPDirectCopyFromPrequeue = 0 # 从预排队直接复制到用户空间的数据包数量
TcpExt:TCPPrequeueDropped = 0 # 由于内存不足而从预排队中丢弃的数据包数量
TcpExt:TCPHPHits = 341  # 接收到预测数据包的数量(头部预测,用于快速路径处理)
TcpExt:TCPHPHitsToUser = 0  # 通过头部预测直接传递给用户的数量
TcpExt:TCPPureAcks = 115 # 接收到的纯ACK数量
TcpExt:TCPHPAcks = 383 # 通过头部预测处理的ACK数量
TcpExt:TCPRenoRecovery = 0 # 进入Reno快速恢复状态的次数
TcpExt:TCPSackRecovery = 0 # 进入SACK快速恢复状态的次数
TcpExt:TCPSACKReneging = 0 # 检测到SACK重新协商(接收方否认之前确认的数据)的次数
TcpExt:TCPFACKReorder = 0 # 使用FACK检测到重排序的次数
TcpExt:TCPSACKReorder = 0 # 使用SACK检测到重排序的次数
TcpExt:TCPRenoReorder = 0 # 使用Reno检测到重排序的次数
TcpExt:TCPTSReorder = 0 # 使用时间戳检测到重排序的次数
TcpExt:TCPFullUndo = 0 # 完全撤销(在恢复过程中没有检测到重排序)的次数
TcpExt:TCPPartialUndo = 0 # 部分撤销(在恢复过程中检测到重排序)的次数
TcpExt:TCPDSACKUndo = 0 # 由于收到DSACK而撤销恢复状态的次数
TcpExt:TCPLossUndo = 0 #  在恢复过程中检测到丢失而撤销的次数
TcpExt:TCPLostRetransmit = 0 # 重传丢失的次数
TcpExt:TCPRenoFailures = 0 # 使用Reno恢复失败的次数
TcpExt:TCPSackFailures = 0 # 使用SACK恢复失败的次数
TcpExt:TCPLossFailures = 0 # 丢失恢复失败的次数
TcpExt:TCPFastRetrans = 0 # 快速重传的次数
TcpExt:TCPForwardRetrans = 0 # 前向重传(在恢复状态之外的重传)的次数
TcpExt:TCPSlowStartRetrans = 0 # 慢启动期间重传的次数
TcpExt:TCPTimeouts = 0 # 超时事件的数量(包括重传超时和零窗口探测定时器)
TcpExt:TCPLossProbes = 0
TcpExt:TCPLossProbeRecovery = 0
TcpExt:TCPRenoRecoveryFail = 0 # 在Reno恢复期间失败(超时)的次数
TcpExt:TCPSackRecoveryFail = 0 # 在SACK恢复期间失败(超时)的次数
TcpExt:TCPSchedulerFailed = 0
TcpExt:TCPRcvCollapsed = 0 # 由于内存压力而合并接收队列中数据包的数量
TcpExt:TCPDSACKOldSent = 0 # 发送的DSACK,用于报告旧的重复数据包的数量
TcpExt:TCPDSACKOfoSent = 0 # 发送的DSACK,用于报告乱序的重复数据包的数量
TcpExt:TCPDSACKRecv = 0 # 接收到的DSACK数量
TcpExt:TCPDSACKOfoRecv = 0
TcpExt:TCPAbortOnData = 0  # 表示因为接收到非法数据而中止的TCP连接数。如果这个值很高,可能意味着服务器正在经历攻击。
TcpExt:TCPAbortOnClose = 0 # 表示因为连接关闭而中止的TCP连接数。如果这个值很高,可能意味着服务器正在经历攻击。
TcpExt:TCPAbortOnMemory = 0 # 表示因为内存不足而中止的TCP连接数。如果这个值很高,可能意味着服务器需要更多的内存。
TcpExt:TCPAbortOnTimeout = 0 # 表示因为连接超时而中止的TCP连接数。如果这个值很高,可能意味着服务器正在经历攻击或者网络延迟问题。
TcpExt:TCPAbortOnLinger = 0 # 在LINGER状态下等待超时后中止连接的数量
TcpExt:TCPAbortFailed = 0 # 尝试发送RST中止连接但失败的数量(例如没有内存)
TcpExt:TCPMemoryPressures = 0 # 由于内存压力事件而进入处理流程的次数
TcpExt:TCPSACKDiscard = 0 # 由于SACK块无效而丢弃的数量
TcpExt:TCPDSACKIgnoredOld = 0 # 忽略的旧重复SACK块的数量
TcpExt:TCPDSACKIgnoredNoUndo = 0 # 忽略的SACK块(因为没有撤销点)的数量
TcpExt:TCPSpuriousRTOs = 0 # 虚假重传超时(实际上没有丢失)的数量
TcpExt:TCPMD5NotFound = 0 # 接收到的没有MD5签名的数据包数量(当要求MD5时)
TcpExt:TCPMD5Unexpected = 0 # 接收到的带有MD5签名的数据包数量(当未要求时)
TcpExt:TCPSackShifted = 0 # 由于SACK而移动的数据包数量(重新整理接收队列)
TcpExt:TCPSackMerged = 0 # 合并的SACK块数量
TcpExt:TCPSackShiftFallback = 0 # 无法移动而回退处理的数据包数量
TcpExt:TCPBacklogDrop = 0  # 表示因为TCP连接队列已满而被丢弃的连接数。如果这个值很高,可能意味着服务器正在经历过载或拒绝服务攻击。
TcpExt:PFMemallocDrop = 0
TcpExt:TCPMinTTLDrop = 0 # 由于TTL太小而丢弃的数据包数量
TcpExt:TCPDeferAcceptDrop = 0 # 在延迟接受期间丢弃的数据包数量(等待应用层数据)
TcpExt:IPReversePathFilter = 2 # 由于反向路径过滤而丢弃的数据包数量
TcpExt:TCPTimeWaitOverflow = 0 # 由于TIME_WAIT套接字溢出而拒绝连接的数量
TcpExt:TCPReqQFullDoCookies = 0 # 当 SYN 队列(半连接队列)已满时,内核使用 SYN Cookies 机制来响应新的 SYN 请求的次数。这是一种防御 SYN Flood 攻击的机制。
TcpExt:TCPReqQFullDrop = 0 # 当 SYN 队列已满且无法使用 SYN Cookies(或未启用)时,直接丢弃新 SYN 请求的次数。
TcpExt:TCPRetransFail = 0 # TCP 重传失败导致连接被放弃的次数。这通常发生在达到最大重传次数后仍然没有收到确认。
TcpExt:TCPRcvCoalesce = 8 # 内核在接收路径上成功合并的 TCP 段数量。合并小包可以提高效率。
TcpExt:TCPOFOQueue = 0 # 当前在乱序队列 (Out-Of-Order queue) 中的数据包数量。
TcpExt:TCPOFODrop = 0 # 因为内存不足或队列限制而丢弃的乱序数据包数量。
TcpExt:TCPOFOMerge = 0 # 成功合并到已有乱序队列中的乱序数据包数量。
TcpExt:TCPChallengeACK = 0 # 发送 Challenge ACK 的次数。当收到无效的 ACK(例如序列号不在窗口内)时,为了符合 RFC 标准并防止欺骗,内核会发送一个 Challenge ACK。
TcpExt:TCPSYNChallenge = 0 # 发送 SYN Challenge 的次数。当收到无效的 SYN(例如在已建立的连接上)时,内核会发送一个 SYN-ACK 进行挑战验证。
TcpExt:TCPFastOpenActive = 0 # 客户端 (active open) 成功使用 TCP Fast Open (TFO) 建立连接的次数。
TcpExt:TCPFastOpenActiveFail = 0 # 客户端尝试使用 TCP Fast Open (TFO) 但失败的次数。
TcpExt:TCPFastOpenPassive = 0 # 服务器 (passive open) 成功接受并处理来自客户端的 TCP Fast Open (TFO) Cookie 和数据建立连接的次数。
TcpExt:TCPFastOpenPassiveFail = 0 #  服务器在被动打开时,收到有效的 TFO Cookie 但因某种原因(如资源不足)未能成功处理 TFO 请求的次数。
TcpExt:TCPFastOpenListenOverflow = 0 # 当服务器监听套接字的 TFO 队列(用于存放未完成三次握手的 TFO 请求)已满时,拒绝新 TFO 请求的次数。
TcpExt:TCPFastOpenCookieReqd = 0 # 服务器收到 SYN 包中包含 TFO 选项但没有有效 Cookie 的次数(表明客户端请求一个新的 Cookie)。
TcpExt:TCPSpuriousRtxHostQueues = 0 # 由于主机队列问题(如 qdisc 或设备队列积压)导致的虚假重传次数。这表示重传可能不是因为网络丢包,而是本地发送队列延迟过高。
TcpExt:BusyPollRxPackets = 0 # 通过 busy polling 机制接收到的数据包数量。Busy polling 是一种低延迟网络处理技术,通常在高性能场景下使用。
TcpExt:TCPAutoCorking = 2 # TCP 自动 Corking 优化的次数。Corking 会尝试将多个小的写操作合并成一个大的 TCP 段发送,以提高效率。
TcpExt:TCPFromZeroWindowAdv = 0 # 接收方从零窗口(表示接收缓冲区已满,无法接收更多数据)状态解除的次数(即当接收方有空间后,通过发送窗口更新通知发送方可以继续发送)。
TcpExt:TCPToZeroWindowAdv = 0 # 接收方通告零窗口(通知发送方停止发送数据)的次数。
TcpExt:TCPWantZeroWindowAdv = 0 # 发送方希望通告零窗口(但可能因为某种原因尚未通告)的次数。这是一个内部状态指示。
TcpExt:TCPSynRetrans = 0 # SYN 包(用于发起连接)被重传的次数。
TcpExt:TCPOrigDataSent = 573 # 发送的原始数据包数量(不包括重传的数据包)。这是应用层实际要求发送的新数据包数。
TcpExt:TCPHystartTrainDetect = 0 # 使用 HyStart++ 拥塞控制算法时,通过“带宽增长训练” (bandwidth train) 方式检测到拥塞避免阈值的次数。
TcpExt:TCPHystartTrainCwnd = 0 # 在 HyStart++ 的“带宽增长训练”阶段结束时的拥塞窗口 (cwnd) 大小(通常是平均值或总值,具体实现相关)。这个值通常用于诊断而不是简单计数。 
TcpExt:TCPHystartDelayDetect = 0 # 使用 HyStart++ 拥塞控制算法时,通过“延迟增长” (delay increase) 方式检测到拥塞避免阈值的次数。
TcpExt:TCPHystartDelayCwnd = 0 # 在 HyStart++ 的“延迟增长”阶段结束时的拥塞窗口 (cwnd) 大小(通常是平均值或总值,具体实现相关)。用于诊断。
TcpExt:TCPACKSkippedSynRecv = 0 # 在 SYN-RECV 状态(服务器收到 SYN 后等待 ACK 完成三次握手)下跳过的 ACK 数量。内核有时会延迟或合并 ACK。
TcpExt:TCPACKSkippedPAWS = 0 # TCPACKSkippedPAWS: 因 PAWS (Protection Against Wrapped Sequence numbers) 检查失败而跳过的 ACK 数量。PAWS 防止处理旧的重复报文。
TcpExt:TCPACKSkippedSeq = 0 # 因为序列号检查(如收到的 ACK 确认了尚未发送的数据)而跳过的 ACK 数量。
TcpExt:TCPACKSkippedFinWait2 = 0 # 在 FIN-WAIT-2 状态(主动关闭方已收到对方的 FIN 的 ACK,等待对方 FIN)下跳过的 ACK 数量。
TcpExt:TCPACKSkippedTimeWait = 0 # 在 TIME-WAIT 状态(连接关闭后等待处理可能延迟的报文)下跳过的 ACK 数量。
TcpExt:TCPACKSkippedChallenge = 0 # 在处理 Challenge ACK 过程中跳过的其他 ACK 数量。
TcpExt:TCPWqueueTooBig = 0 # 发送队列 (write queue) 超过其最大允许大小的次数。这通常发生在应用程序写入数据的速度远超网络发送速度时,可能导致数据被丢弃或背压。
IpExt:InNoRoutes = 3 # 没有路由的输入数据包数量
IpExt:InTruncatedPkts = 0 # 被截断的数据包数量
IpExt:InMcastPkts = 0 # 接收到的组播数据包数量
IpExt:OutMcastPkts = 0 # 发送的组播数据包数量
IpExt:InBcastPkts = 268 # 接收到的广播数据包数量
IpExt:OutBcastPkts = 0 # 发送的广播数据包数量
IpExt:InOctets = 91623 # 输入字节数
IpExt:OutOctets = 137640 # 输出字节数
IpExt:InMcastOctets = 0 # 输入的组播字节数
IpExt:OutMcastOctets = 0 # 输出的组播字节数
IpExt:InBcastOctets = 18485 # 输入的广播字节数
IpExt:OutBcastOctets = 0 # 输出的广播字节数
IpExt:InCsumErrors = 0 # 校验和错误的数量
IpExt:InNoECTPkts = 1319 # 接收到的非ECT(ECN-Capable Transport)数据包数量
IpExt:InECT1Pkts = 0 # 接收到的ECT(1)数据包数量
IpExt:InECT0Pkts = 0 # 接收到的ECT(0)数据包数量
IpExt:InCEPkts = 0 # 接收到的CE(Congestion Experienced)数据包数量
IpExt:ReasmOverlaps = 0 # 在重组过程中检测到重叠片段的数量(可能是攻击)

 

posted @ 2025-07-21 09:09  杨灏  阅读(140)  评论(0)    收藏  举报