源数据获取(/proc/net)
- 通过读取/proc/net中的文件来获取链接信息, 现仅实现了tcp链接的获取,既读取 /proc/net/tcp、/proc/net/tcp6文件
tcp记录字段简介(tcp6相差无几)
例子:local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode EE33A8C0:91EC 7C1BA8C0:0185 01 00000000:00000000 00:00000000 00000000 22108254 0 3724516236 1 0000000000000000 20 4 24 12 -1
字段解释:
字段 释义 sl 连接的编号 local_address 本地地址和端口号,以十六进制表示 rem_address 远程地址和端口号,以十六进制表示 st 连接状态 tx_queue 发送队列的长度(字节数) rx_queue 接收队列的长度(字节数) tr 传输控制块的状态 tm->when 传输控制块上一次变化的时间 retrnsmt 传输控制块需要重新传输的次数 uid 连接所属用户的 UID timeout 传输控制块超时时间 inode 连接对应的 inode 编号
在inode之后的依次排列的信息如下
- 套接字引用数
- 套接字实例地址
- RTO
- 计算延时的估值
- 快速确认数和是否启用的标志位的或运算结果
- 当前拥塞窗口大小
- 慢启动阈值
数据解析
- 指标数据维度中包括 链接状态、端口、监听地址、类型、方向,解析过程中会记录这些维度
端口、监听地址的解析:反解析本地地址、本地端口、远程地址、远程端口成可阅读的样式(IP格式、端口整型格式)
- 地址-网络字节序解析:采用大端字节序的方式解析
- 端口-主机字节序解析:采用小端字节序的方式解析
链接状态的解析:从映射表中获取得出
序号 链接状态 释义 00 Established TCP_ESTABLISHED(已建立连接) 01 SynSent TCP_SYN_SENT(SYN 已发送) 02 SyncRecv TCP_SYN_RECV(SYN 已接收) 03 FinWait1 TCP_FIN_WAIT1(等待远程 TCP 发送 FIN) 04 FinWait2 TCP_FIN_WAIT2(等待远程 TCP 发送 ACK) 05 TimeWait TCP_TIME_WAIT(等待一段时间后关闭连接) 06 Close TCP_CLOSE(连接已关闭) 07 CloseWait TCP_CLOSE_WAIT(等待远程 TCP 发送 FIN) 08 LastACL TCP_LAST_ACK(等待远程 TCP 发送 ACK) 09 Listen TCP_LISTEN(正在监听连接) 0A Closing TCP_CLOSING(等待远程 TCP 发送 FIN-ACK)
方向判定出或入:
- 过程中会优先筛选本地监听地址以及监听端口
- 如果本地地址+本地端口是所属于本机的监听端口,就会判定为“被访问”的“入”
- 如果本地地址+本地端口不属于本机监听端口,就会判定为“向外访问”的“出”
- 如果监听地址为0.0.0.0时,仅需本地端口为监听端口既判断该链接为“入”
流程简介
- 读取/proc/net/tcp,如果开启tcp6会读取 /proc/net/tcp6
- 解析文件获取原始数据(类似快照)
- 解析原始数据,优先筛选出本地监听地址和监听端口,记录本机监听地址池
- 解析其余记录,以IP、端口、方向、链接状态、类型进行统计
- 输出结果(prometheus exporter 数据格式或其他的)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。