在Linux系统下,可以通过netstat -anop
快速查看当前用户可以看到的所有的socket列表,以及这些socket的状态、使用线程id等信息,那么netstat -anop
实际是如何实现该功能的? 一般来说linux下的proc文件内会有标识系统运行状态的内存文件,与netstat相关的文件有如下几个
/proc/net/tcp , /proc/net/udp 网络相关的文件,这些文件存放了linux系统中tcp/udp的socket 表信息,详细的信息描述可以通过
man proc
查看proc中内存文件的格式信息。其中uid代表创建的用户id,inode字段代表该socket对应的文件句柄信息。从这个文件中可以得到系统当前打开的socket列表1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 3500007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000 101 0 16340 1 ffff912ca9da9a40 100 0 0 10 0
1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 21253 1 ffff912ca9dacec0 100 0 0 10 0
2: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 2084053 1 ffff912ca9da88c0 100 0 0 10 0
3: E30AA8C0:C564 7DA76464:01BB 06 00000000:00000000 03:000007D4 00000000 0 0 0 3 ffff912caca4e7c0
4: E30AA8C0:8BC6 9F9AD374:01BB 06 00000000:00000000 03:0000060B 00000000 0 0 0 3 ffff912caca4ee88
5: E30AA8C0:B3A0 6A2D6464:0050 06 00000000:00000000 03:000001F5 00000000 0 0 0 3 ffff912caca4eba0
6: E30AA8C0:AA0E 7DA76464:01BB 06 00000000:00000000 03:00000603 00000000 0 0 0 3 ffff912caca4e2e8
7: E30AA8C0:EBB4 191E6464:0050 01 00000000:00000000 00:00000000 00000000 0 0 2129881 1 ffff912cacca4600 20 4 24 16 30
8: E30AA8C0:BDA6 31724B92:01BB 01 00000000:00000000 00:00000000 00000000 126 0 412949 1 ffff912c19dfabc0 73 4 30 2 2
9: E30AA8C0:824E 9F9AD374:01BB 06 00000000:00000000 03:000007DC 00000000 0 0 0 3 ffff912caca4e000
10: E30AA8C0:0016 CA4A782A:C98C 01 00000024:00000000 01:00000014 00000000 0 0 2124753 4 ffff912ca9dae040 20 4 31 99 23/proc/pid/fd 目录下有很多链接,这些链接代表的是当前线程打开的文件列表,文件列表包含网络、文件等信息,其中可以看到网卡相关的信息,网卡的信息内可以包含网卡对应的inode信息
1 |
|
根据上述的两个数据进行关联,就可以得到系统当前打开的所有的socket信息,以及打开这些socket的进程以及用户信息。
从linux代码中也可以看到,在通过
socket
系统调用内部会创建socket,并做socket和fd之间的映射。
1 | SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) |