1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 首先,我们通过开启监听一个端口
$> nc -4 -l 10089

# 然后我们过滤出这个进程的 PID
$> ps -ef | grep "nc -4 -l 10089" | grep -v grep
UID        PID  PPID  C STIME TTY          TIME CMD
root     15279 15247  0 21:59 pts/0    00:00:00 nc -4 -l 10089

# 然后我们进入这个文件夹
$> cd /proc/15279
$> ll
total 0
dr-xr-xr-x 2 root root 0 Nov 13 22:00 attr
-rw-r--r-- 1 root root 0 Nov 13 22:00 autogroup
-r-------- 1 root root 0 Nov 13 22:00 auxv
-r--r--r-- 1 root root 0 Nov 13 21:59 cgroup
--w------- 1 root root 0 Nov 13 22:00 clear_refs
-r--r--r-- 1 root root 0 Nov 13 21:59 cmdline
-rw-r--r-- 1 root root 0 Nov 13 22:00 comm
-rw-r--r-- 1 root root 0 Nov 13 22:00 coredump_filter
-r--r--r-- 1 root root 0 Nov 13 22:00 cpuset
lrwxrwxrwx 1 root root 0 Nov 13 21:59 cwd -> /root
-r-------- 1 root root 0 Nov 13 22:00 environ
lrwxrwxrwx 1 root root 0 Nov 13 21:59 exe -> /usr/bin/ncat
dr-x------ 2 root root 0 Nov 13 21:59 fd
dr-x------ 2 root root 0 Nov 13 22:00 fdinfo
-rw-r--r-- 1 root root 0 Nov 13 22:00 gid_map
...
# 注意到其中有个 fd 文件夹,这个目录表示进程打开的所有文件
$> cd fd 
$> ll 
total 0
lrwx------ 1 root root 64 Nov 13 21:59 0 -> /dev/pts/0
lrwx------ 1 root root 64 Nov 13 21:59 1 -> /dev/pts/0
lrwx------ 1 root root 64 Nov 13 21:59 2 -> /dev/pts/0
lrwx------ 1 root root 64 Nov 13 21:59 3 -> socket:[37387329]
# fd 为 0,1,2 的分别表示标准输入 stdin (0)、标准输出 stdout (1)、
# 错误输出 stderr (2)。fd 为 3 表示 nc 监听的套接字 fd,后面跟了一
# 个神奇的数字 37387329,这个数字表示 socket 的 inode 号,我们可以
# 通过这个 inode 号来找改 socket 的信息。

$> cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:2769 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 37387329 1 ffffa09ab9cf9f00 100 0 0 10 0
   1: 0100007F:05EA 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 66045 1 ffffa09abb75f640 100 0 0 10 0
   2: 00000000:18EB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 3862183 1 ffffa09ab9d65740 100 0 0 10 0
   3: 00000000:18EC 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4023570 1 ffffa09abac22e80 100 0 0 10 0
   4: 00000000:1F90 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 37064996 1 ffffa09aba9247c0 100 0 0 10 0
   5: 00000000:2711 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 37084757 1 ffffa09abb168f80 100 0 0 10 0
   6: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 37077833 1 ffffa09abb169740 100 0 0 10 0
   7: 0100007F:7D00 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 22005 1 ffffa09abb75c000 100 0 0 10 0
   8: B22A11AC:1F90 2DF3642F:A714 05 00000000:00000000 00:00000000 00000000     0        0 37153219 1 ffffa09abb168000 20 0 0 10 -1
   9: B22A11AC:1F90 2DF3642F:CD50 05 00000000:00000000 00:00000000 00000000     0        0 37180618 1 ffffa09aba9c9740 20 0 0 10 -1
  10: B22A11AC:1F90 2DF3642F:A280 05 00000000:00000000 00:00000000 00000000     0        0 37070925 1 ffffa09abb16a6c0 20 0 0 10 -1
  ...
# 可以找到 inode 为 37387329 的套接字。其中 local_address 为 00000000:2769,
# rem_address 为 00000000:0000,表示四元祖(0.0.0.0:10089, 0.0.0.0:0),st 
# 是 state,0A 表示 TCP_LISTEN 状态。

参考资料

  1. 深入理解 TCP 协议:从原理到实战