netstat的实现方法分析
通过strace简单的查看
例如执行 netstat -apnt
时, 程序实际做了以下操作
- 加载一些链接库, 例如
libselinux.so.1, libc.so.6, libdl.so.2
等 - 读取
/proc/XXX/fd
文件夹下面的信息 - 读取
/proc/net/
下的信息 - 向 kernel 发送
PF_NETLINK
类型的 socket 查询一些信息
通过源码查看
netstat的源码是在net-tools中,可从这个页面找到下载链接
netstat命令行的入口在 netstat.c 中
代码的逻辑简单的可以概括为: 解析参数->根据参数查找显示数据
下面以参数”r” 为例子(即 netstat -r
的执行方式)
- 读取
/proc/net/route
- 根据文件内容格式读取数据, 格式化输出
注:
- 上面命令最终调用的函数为
lib/inet_gr.c
中的rprint_fib
函数 - 从代码中可以看出
route -e
和netstat -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的实现方法分析 转载请注明出处