netstat实现原理
因为最近接手的项目是基于嵌入式Linux openwrt的,一开始以为会跟之前的服务器开发没什么大的区别,但是遇到问题去分析的时候才发现,工具链还是有些差别的,openwrt的netstat是属于一个叫做busybox的工具集的,这个工具集是专门提供给嵌入式Linux,它的参数很简单,居然没有Linux下netstat的-p选项,因此当我想查看是哪些进程在监听哪些端口时,发现只能查看有哪些监听端口,无法得知是属于哪个进程的,lsof也没有-i选项。
但是有时候排查问题又必须知道哪个进程监听了某个端口,因此就想搞清楚Linux下的netstat是怎么实现可以查看监听端口属于哪个进程呢。
首先想法就是去下载busybox的源代码,但是感觉代码太多了,费时费力,于是灵机一动想到Linux下的另一个工具strace(追踪程序调用的系统调用),通过strace来查看netstat执行时都做了什么操作。
截取了strace输出的某一段,可以看到,调用open以及readlink遍历了/proc/3055/fd/目录下的所有文件,大家都知道这个目录是进程打开文件的目录。

在strace输出的最后,可以看到调用了open打开/proc/net/udp文件,并读取里面的内容将其解析输出,这里面就记录了所有udp连接的信息,同时/proc/net/tcp对应tcp连接、/proc/net/unix对应Unix socket连接。

根据这个文件的标头可以知道,第二列是local address,但是由于是16进制编码,所以需要我们手动转换成10进制。
这里其实可以发现,/proc/net/udp这个文件中的信息是不包含进程信息的,所以这也是为什么netstat在开始的时候会先遍历所有/proc/xx/fd目录,因为netstat可以通过inode将/proc/net/udp中的行和/proc/xx/fd中的文件关联起来,这样就可以得到某一行udp连接的进程信息(因为inode是唯一的)。
所以,分析到这里,我猜测busybox中的netstat应该是没有遍历所有/proc/xx/fd这一步,仅仅是读取了/proc/net/udp文件并解析输出。
明白了netstat的原理,那么即使遇到不提供netstat -p选项的嵌入式Linux,我们也能手动分析出自己想要的信息,进而解决问题。
netstat实现原理的更多相关文章
- 理解proc目录与linux进程、ps命令、netstat命令的关系
零.proc目录简介 proc目录是虚拟文件系统(VFS)的一种实现,保存了进程信息(pid目录)和一些系统信息. 一.系统的信息 1.cpuinfo和meminfo两个文件 查看CPU和内存相关信息 ...
- 【夯实Nginx基础】Nginx工作原理和优化、漏洞
本文地址 原文地址 本文提纲: 1. Nginx的模块与工作原理 2. Nginx的进程模型 3 . NginxFastCGI运行原理 3.1 什么是 FastCGI ...
- 深度解析mysql登录原理
使用mysql数据库的第一步必然是建立连接登录,然后在上面执行SQL命令.无论是通过mysql的客户端,还是通过C-API,JDBC标准接口连接数据库,这个过程一定少不了.今天我们聊一聊mysql登陆 ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- DDOS的攻击原理和防护指南(转)
DDOS的攻击原理和防护指南 作者:冰盾防火墙 网站:www.bingdun.com 日期:2008-01-07 我们现在来分析DDOS的攻击原理. 首先,DDOS是英文Distribut ...
- DDOS攻击原理及防护方法论
从 07年的爱沙尼亚DDOS信息战,到今年广西南宁30个网吧遭受到DDOS勒索,再到新浪网遭受DDOS攻击无法提供对外服务500多分钟. DDOS愈演愈烈,攻击事件明显增多,攻击流量也明显增大,形 ...
- Linux-TCP/IP TIME_WAIT状态原理
TIME_WAIT状态原理---------------------------- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态. 客户端主动关闭连接时,会发送最后一个a ...
- Nginx工作原理和优化、漏洞
1. Nginx的模块与工作原理 第三方模块:HTTP Upstream Request Hash模块.Notice模块和HTTP Access Key模块. 图1-1展示了Nginx模块常规的HT ...
- TCP/IP TIME_WAIT状态原理
原文转载:http://elf8848.iteye.com/blog/1739571 IME_WAIT状态原理 ---------------------------- 通信双方建立TCP连接后,主动 ...
随机推荐
- es6那些事儿
一.参考链接 http://www.ecma-international.org/ecma-262/6.0/index.html http://www.ecma-international.org/e ...
- angular笔记_3
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- GIL锁、进程池与线程池
1.什么是GIL? 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multip ...
- F5-VM
如果找不到的话,点击下面的链接.链接包含物理主机镜像和虚机主机镜像,选择virtual Edition. BIG-IP v11.x / Virtual Edition https://download ...
- 2017-9-13-Linux移植:bootloader烧写
首先看一下Linux启动过程: Linux启动过程 刚开始最重要的是Bootloader的启动,Bootloader因你改改存放到哪?怎么执行?作用是啥? bootloader的烧写: 所谓烧写也就是 ...
- MySql基础笔记(二)Mysql语句优化---索引
Mysql语句优化--索引 一.开始优化前的准备 一)explain语句 当MySql要执行一个查询语句的时候,它首先会对语句进行语法检查,然后生成一个QEP(Query Execution Plan ...
- 潭州课堂25班:Ph201805201 django 项目 第十三课 短信验证码后台的实现 (课堂笔记)
d 发送短信验证码之前,后台要得到三个参数 : 1,用户手机吗,, 2,用户输入的图片验证文本, 3,前台的 uuid , 在60秒内是否有发送短信的记录 只有用户输入的手机号,文本信息与 uudi ...
- 树莓派上配置electron记录
首先是最新版本的树莓派镜像默认不开启ssh,所以烧写好系统之后没法ssh登录 解决方法就是在烧写的内存卡分区内建立一个ssh文件(无后缀名),这样启动的时候就有ssh服务了 在~/.bashrc里面添 ...
- C++学习笔记54:关联容器,函数对象
关联容器的特点 1.每个关联容器都有一个键(key) 2.可以根据键高效查找元素 集合set 集合用来存储一组无重复的元素,由于集合的元素本身是有序的,可以高效地查找元素,也可以方便地指定大小范围的元 ...
- Cow Exhibition [POJ2184] [DP] [背包的负数处理]
题意: 有很多羊,每只羊有一个幽默度和智商,要选出一些羊,智商加幽默度总和最大,其中智商总和和幽默度总和都不能是负数. 样例输入: 5 -5 7 8 -6 6 -3 2 1 -8 -5 样例输出: 8 ...