一.查看当前进程的socket对应的fd信息
1. lsof
lsof
(List Open Files)命令可以列出系统中所有打开的文件的信息,包括 socket。
用法
要查看特定进程的 socket 信息,可以使用以下命令:
lsof -p <pid> | grep socket
<pid>: 要查看的进程的进程 ID。
grep socket: 过滤出 socket 相关的信息。
示例
lsof -p 1234 | grep socket
2. netstat
netstat
命令用于显示网络连接、路由表、接口统计等。使用 netstat
可以查看当前进程的 socket 连接。
用法
netstat -anp | grep <pid>
选项说明:
-a: 显示所有连接和监听的端口。
-n: 以数字形式显示地址和端口号。
-p: 显示使用每个 socket 的进程信息。
示例
[email protected]:/proc/8141/fd|⇒ netstat -anp | grep 8141
tcp6 0 0 :::10443 :::* LISTEN 8141/smartapi
unix 3 [ ] STREAM CONNECTED 47938 8141/nn
unix 2 [ ] STREAM CONNECTED 4489953 8141/nn
unix 2 [ ] STREAM CONNECTED 4488523 8141/nn
unix 2 [ ] DGRAM 46849 8141/nn
第一行:TCP6 Socket
tcp6 0 0 :::10443 :::* LISTEN 8141/nn
tcp6:
表明这是一个 TCP socket,且使用的是 IPv6 协议。
0 0:
第一个 0 表示接收队列(recv-q),当前没有待处理的接收数据。
第二个 0 表示发送队列(send-q),当前没有待发送的数据。
:::10443:
该 socket 正在监听所有地址(:::)的 10443 端口,表示它可以接收来自任何 IPv6 地址的连接请求。
:::*:
远程地址,该项显示为 * 表示没有特定的远程地址,因为 LISTEN 状态的 socket 不会连接到特定的远程主机。
LISTEN:
表明这个 socket 是处于监听状态,准备接受连接。
8141/nn:
显示使用该 socket 的进程信息。这里的 8141 是进程 ID,而 nn 是进程的名称。
第二到第五行:UNIX Socket
unix 3 [ ] STREAM CONNECTED 47938 8141/nn
unix 2 [ ] STREAM CONNECTED 4489953 8141/nn
unix 2 [ ] STREAM CONNECTED 4488523 8141/nn
unix 2 [ ] DGRAM 46849 8141/nn
每行的结构相似,逐行分析:
通用部分解释
unix:
表示这一行信息涉及 Unix Domain socket。
3 / 2 / 2 / 2:
这些数字表示接收和发送队列的长度。
第一个数字是接收队列中待处理的数据包数量,第二个数字(如果有)表示发送队列中的数据包数量。
[ ]:
表示当前没有特定的数据在接收队列中也没有存储其他状态的信息。
STREAM / DGRAM:
指明 socket 的类型。
STREAM 表示这是一个流式 socket(用于 TCP 样式的连接)。
DGRAM 表示这是一个数据报式 socket(用于 UDP 样式的连接)。
CONNECTED:
该状态指示 socket 已建立连接。
47938, 4489953, 4488523, 46849:
显示与该 Unix socket 相关的文件描述符(FD)。这些是文件描述符在进程内部的标识符。
8141/nn:
使用该 socket 的进程的信息,显示进程 ID 是 8141,进程名称为 smartapi。
具体分析
第一行(TCP6 设置):
正在监听 IPv6 中的 port 10443,准备接受来自任何地址的连接。
第二行:
一个流式 Unix socket 连接,接收队列中有 3 个待处理数据,进程 smartapi 使用 FD 47938。
第三行:
另一个流式 Unix socket 连接,接收队列中有 2 个待处理数据,进程使用 FD 4489953。
第四行:
第三个流式 Unix socket 连接,接收队列中有 2 个待处理数据,进程使用 FD 4488523。
第五行:
一个数据报式 (DGRAM) Unix socket,连接状态为未填充接收队列,进程使用 FD 46849。
总结
从输出中可以看出,nn 进程同时使用了一些 TCP 和 Unix socket,
包括监听 TCP 连接和若干个已建立的 Unix Domain socket 连接。
Unix sockets 通常在同一台机器的进程之间进行高效的通信。
3. ss
ss
是 netstat
的替代工具,提供更详细的 socket 统计信息,速度更快。
用法
ss -p | grep <pid>
-p: 显示使用 socket 的进程信息。
示例:
[email protected]:/proc/8141/fd|⇒ ss -p | grep 8141
u_str ESTAB 0 0 * 47938 * 47939 users:(("smartapi",pid=8141,fd=20))
u_str ESTAB 0 0 * 4489953 * 0 users:(("smartapi",pid=8141,fd=10))
u_str ESTAB 0 0 * 4488523 * 0 users:(("smartapi",pid=8141,fd=5))
输出解析
- LISTEN / ESTAB: 显示 socket 的状态,
LISTEN
表示正在监听,ESTAB
表示已建立连接。 - 0 / 128: 表示队列的长度。
*:47938
: 表示绑定的地址和端口。users:(...)
: 显示使用该 socket 的进程信息,包括进程名称、PID 和文件描述符(fd)。
一步查看特定 socket 的信息
要详细查看某个 socket 的文件描述符信息,您可以定位到 /proc/<pid>/fd
目录(其中 <pid>
是进程 ID),然后列出文件描述符。
ls -l /proc/1234/fd
4. 使用 ss
命令与 less
首先,可以使用 ss
命令获取 socket 信息,然后通过管道将输出结果传给 less
。
假设您要查看所有进程的 socket 信息:
ss -ap | less
-a: 显示所有 socket,包括监听和已连接的 socket。
-p: 显示使用 socket 的进程信息。
如果您只希望查看特定进程的 socket 信息,可以根据名为特定进程的关键字过滤:
ss -ap | grep <process_name> | less
<process_name>: 要查看的进程名称。
示例查找特定进程
u_str ESTAB 0 0 * 47938 * 47939 users:(("nn",pid=8141,fd=20))
u_str ESTAB 0 0 * 4489953 * 0 users:(("nn",pid=8141,fd=10))
u_str ESTAB 0 0 * 4488523 * 0 users:(("nn",pid=8141,fd=5))
u_dgr UNCONN 0 0 * 46849 * 47423 users:(("nn",pid=8141,fd=6))
u_dgr UNCONN 0 0 * 26270 * 0 users:(("nn",pid=8141,fd=3),("nn",pid=2159,fd=3))
u_dgr UNCONN 0 0 * 31283 * 0 users:(("nn",pid=2159,fd=6))
u_str ESTAB 0 0 * 26318 * 0 users:(("nn",pid=2159,fd=5))
tcp LISTEN 0 128 [::]:10443 [::]:* users:(("n",pid=8141,fd=19))
解析:
逐部分解析
u_dgr:
这一部分表示 Socket 的类型和协议。
u_dgr: 表示使用 Unix Domain Datagram(UDP)类型的 socket。Unix Domain sockets 允许在同一台机器上的进程之间进行通信。
UNCONN:
这表示 socket 的状态。
UNCONN(Unconnected)表示这个 socket 仍然未连接。对于 UDP 类型的 sockets 来说,连接状态通常不如 TCP 重要,但这仍表明这个 socket 并没有处于激活状态来接收或发送数据。
0 0:
这两个数字分别代表接收队列和发送队列的长度。
0 表示接收队列中没有待处理的数据,0 也表示发送队列中没有等待发送的数据。
* 46849:
这是本地地址和本地端口。
* 表示这个 socket 监听所有的地址(即可以接收来自所有 IP 的连接)。
46849 是本地端口号。
* 47423:
这是远程地址和远程端口。
同样,* 表示远程地址(即远程 IP),而 47423 是远程端口号。对于 UDP sockets,这个信息显示的是接收的通信地址。
users:(("nn",pid=8141,fd=6)):
这一部分显示使用该 socket 的进程信息。
("nn", pid=8141, fd=6) 具体表示:
nn: 是使用这个 socket 的进程名称。
pid=8141:表示进程的 ID。
fd=6:表示进程中的文件描述符(File Descriptor)编号,这里的数字 6 是该 socket 在进程中被引用的文件描述符。
5. 使用 /proc
文件系统与 less
如果您知道进程 ID,可以直接从 /proc
文件系统查看 socket 的详细信息。
示例
less /proc/<pid>/net/tcp
- 这将显示 TCP sockets 的详细信息,包括本地地址、远程地址等。
6.其他
使用 netstat
命令可以检查系统中某个特定端口或 IP 地址的状态。以下是一些常用的选项和示例,教您如何使用 netstat
来查看端口或 IP 的状态。
基本用法
1. 查看所有连接和监听状态
要查看所有连接和监听的端口,可以运行以下命令:
netstat -an
-a: 显示所有连接和监听的socket。
-n: 以数字形式显示地址和端口号。
2. 查看特定端口的状态
假设您想查看端口 10443 的状态,您可以使用以下命令:
netstat -an | grep :10000
这条命令会输出与端口 10000 相关的所有连接及其状态。
3. 查看特定 IP 的状态
若您想查看与特定 IP 地址(例如 192.168.1.100)的连接,可以使用:
netstat -anp | grep :10443
-p: 显示使用每个 socket 的进程信息,包括进程 ID 和名称。
5. 查看 TCP 和 UDP 状态
如果您只想查看 TCP 或 UDP 连接,您可以分别使用:
netstat -at # 查看 TCP 连接
netstat -au # 查看 UDP 连接
示例输出解析
假设我们运行以下命令来查看端口 10000 的状态:
netstat -an | grep :10000
可能的输出结果:
tcp6 0 0 :::10000 :::* LISTEN
tcp6: 表示这是一个 IPv6 TCP socket。
0 0: 接收队列和发送队列的长度(都为 0)。
:::10443: 表示监听所有地址的 10000 端口。
LISTEN: 表示该端口当前处于监听状态。
7. 查看所有连接和其进程信息
首先,可以通过 netstat
查看当前系统上所有活动的 TCP 和 UDP 连接,以及它们对应的进程:
-t: 显示 TCP 连接。
-u: 显示 UDP 连接。
-n: 以数字方式显示地址和端口号。
-a: 显示所有连接(包括监听状态的 socket)。
-p: 显示使用每个 socket 的进程信息。
2. 查看特定进程的连接信息
如果您想查看特定进程的连接信息,可以使用 grep
命令来过滤出该进程的名称或进程 ID(PID)。
假设您想查看进程名称为 nn的连接信息:
netstat -tunap | grep nn
或者,如果你知道进程的 PID,例如 8141:
netstat -tunap | grep 8141
示例输出解析
运行上述命令后,您可能会看到类似的输出:
tcp 0 0 192.168.1.5:10000 192.168.1.100:54321 ESTABLISHED 8141/nn
udp 0 0 192.168.1.5:1234 0.0.0.0:* 8141/nn
tcp 或 udp: 表示连接的类型。
0 0: 表示接收和发送队列的长度。
192.168.1.5:10000: 本地地址和本地端口。
192.168.1.100:54321: 远程地址和远程端口(仅在 TCP 连接中显示)。
ESTABLISHED: 表示连接的状态。
8141/nn: 使用该连接的进程 ID 和名称。