通过strace简单的查看

例如执行 netstat -apnt 时, 程序实际做了以下操作

  1. 加载一些链接库, 例如 libselinux.so.1, libc.so.6, libdl.so.2
  2. 读取 /proc/XXX/fd 文件夹下面的信息
  3. 读取 /proc/net/ 下的信息
  4. 向 kernel 发送 PF_NETLINK 类型的 socket 查询一些信息

通过源码查看

netstat的源码是在net-tools中,可从这个页面找到下载链接
netstat命令行的入口在 netstat.c 中
代码的逻辑简单的可以概括为: 解析参数->根据参数查找显示数据
下面以参数”r” 为例子(即 netstat -r 的执行方式)

  1. 读取 /proc/net/route
  2. 根据文件内容格式读取数据, 格式化输出

注:

  • 上面命令最终调用的函数为 lib/inet_gr.c 中的 rprint_fib 函数
  • 从代码中可以看出 route -enetstat -r 最终执行的代码是一样的, 所以两个命令行没有任何区别

下面是 netstat 不同的参数对应的读取方法

参数 读取方法
r /proc/net/route
i socket
t /proc/net/tcp(6)
u /proc/net/udp(6)
w /proc/net/raw(6)
g /proc/net/igmp(6)
p 启动时遍历/proc/XXX/cmdline

扩展

losf

这个命令工作的方式和 netstat 很相像, 下面这个链接很好的说明了 losf 的实现
Guide to Porting lsof 4 to Unix OS Dialects

proc 文件夹

下面的链接详细说了 /proc 是怎么来的

替代 netstat

由于 netstat 工作方式, 导致了在服务器的socket连接数很大时, netstat 的效率大大下降, 我们可以使用 ss 命令来替代 netstat 的工作.
下面的两个链接中都给出了一些数据, 表明 ss 的工作效率比 netstat 高很多

旧的网络相关命令的替代品

一些命令, 例如 arp, ifconfig, iptunnel, iwconfig, nameif, netstat, route 已经很多年都不更新维护了, 我们可以使用一些更新的命令来替代

Deprecated Linux networking commands and their replacements

本文地址 netstat的实现方法分析 转载请注明出处