当执行以下命令查看netstat统计信息来源时,发现一个重要的来源是/proc/net/snmp接口的输出信息
因此在刨根问底分析源码的过程中,找到了这个接口对应的RFC2012文档。本wiki就记录下
相关的解读,以便后续更加透彻的立即netstat的统计信息。
# strace -e open netstat -s
注:netstat -s的另一个重要的数据来源是/proc/net/netstat下的信息,但鉴于
该接口信息量较大,因此会单独独立整理。
snmp4_tcp_list数组元素解析
netstat -s的Tcp类选的数据均来自内核中定义的snmp4_tcp_list数组。
snmp4_tcp_list数组的每一个成员都是一个snmp_mib结构体
struct snmp_mib {
const char *name;
int entry;
};
snmp4_tcp_list数组就是/proc/net/snmp接口输出的TCP部分内容
名称 | 描述 | Linux 3.10实现 |
---|---|---|
RtoAlgorithm | 用于计算RTO的算法 | RTO算法遵循RFC2698,对应值为1. |
RtoMin | 限定RTO的最小值 | 使用常量HZ/5限定,即200ms |
RtoMax | 限定RTO的最大值 | 使用常量120HZ限定,即120s |
MaxConn | TCP流数量的上限 | 并不会在协议栈层限制,默认值为-1 |
ActiveOpens | CLOSE => SYN-SENT次数 可理解为主动建联数 |
在tcp_connect()函数中计数 相当于SYN包的发送次数(但不包含重传次数) |
PassiveOpens | LISTEN => SYN-RECV次数 可理解为被动建联数 |
实现上则是在三次握手成功后, 建立tcp_sock结构体后才加1 在tcp_create_openreq_child()函数中调用 |
AttemptFails | SYN-SENT => CLOSE次数 加上SYN-RECV => CLOSE次数 加上SYN-RECV => LISTEN次数 建联失败的次数 |
回CLOSE部分在tcp_done()函数中计数, 回LISTEN部分在tcp_check_req()中计数 |
EstabResets | ESTABLISHED => CLOSE次数 加上CLOSE-WAIT => CLOSE次数 这些情况,基本都是reset导致的 |
在tcp_set_state()函数中,如果之前的状态是 TCP_CLOSE_WAIT或TCP_ESTABLISHED就加1 |
CurrEstab | ESTABLISHED和CLOSE-WAIT 状态的TCP流数 |
在tcp_set_state()中处理 实现体现的是进入ESTABLISHED之后 进入CLOSE之前的TCP流数 |
InSegs | 所有收到的TCP包 即使是个错误包 |
在tcp_v4_rcv()和tcp_v6_rcv()中计数 |
OutSegs | 所有发送出去的TCP包 包括新数据包、重传数据包 、syn包、synack包和reset包 |
tcp_v4_send_reset()中统计reset包 tcp_v4_send_ack()中统计SYN-RECV和TIME-WAIT状态下发送的ACK包 tcp_v6_send_response()中统计ipv6相应数据 tcp_make_synack()中统计发送的SYNACK包 tcp_transmit_skb()中统计所有的其他包 |
RetransSegs | 所有重传出去的TCP包 | tcp_v4_rtx_synack()和tcp_v6_rtx_synack()中 统计重传的SYNACK包, tcp_retransmit_skb()中统计其他重传包 |
InErrs | 所有收到的有问题的TCP包数量 比如checksum有问题 |
tcp_validate_incoming()中统计seq有问题的包 tcp_rcv_established()、tcp_v4_do_rcv()、tcp_v4_rcv()、 tcp_v6_do_rcv()、tcp_v6_rcv()中根据checksum来判断出错误包 |
OutRsts | 发送的带RST标记的TCP包数量 | 在tcp_v4_send_reset()、tcp_send_active_reset()、 tcp_v6_send_response()中统计 |
InCsumErrors | checksum有问题的数据包数量 | 是3.10相对于2.6.32新增的内容,算是细化InErrs统计 |
snmp4_tcp_list统计结果实例一则
# cat /proc/net/snmp |grep Tcp /* 适当调整了输个格式,以增加可读性 */
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails
Tcp: 1 200 120000 -1 818674494 564859834 83498657
EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts InCsumErrors
38663863 4790 213696000469 253602471635 2134386615 18675977 171550781 125433
参考资料
RFC 2012: SNMPv2 Management Information Base for the Transmission Control Protocol using SMIv2