Bootstrap

网络编程的进程查看连接描述符信息等

一.查看当前进程的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 和名称。

;