TCP打开的连接存储在Linux内核的哪里?

问题描述 投票:0回答:1

TCP 打开连接(尚未收到最终 ACK 的套接字)存储在 Linux 内核中的位置?是否有任何函数仅根据侦听端口返回打开的套接字?

PS:内核4.15

linux network-programming tcp linux-kernel
1个回答
0
投票

与各个进程的套接字相关的信息存储在内核数据结构中的 struct sock* 中。这是 pt_regs 数据结构中的第一个参数,可通过寄存器 rdi 访问,或者更好地通过 PT_REGS_PARM1 宏访问。

#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG)

// Expands to
((ctx)->di)

当进程调用诸如 tcp_set_state 或 tcp_v4_connect 等内核函数时,所有这些 sock 结构都可以通过进程访问(尽管在后者中,它们还没有端口和许多其他套接字信息,因为 tcp_v4_connect 是进程调用时调用的第一个函数)发起连接)。但是,您也可以在其他地方找到这些袜子结构。 所有这些带有套接字信息的 sock 结构也可以在 struct netns(网络命名空间)中找到,该结构存储在 struct sock_common 中的 skc_net 字段中,struct sock_common 是 Stuct sock 的一部分。

在 netns 结构中,您有 tcp_hashinfo 和 udp_table,其中包含所有已建立连接的所有 struct sock。

根据您的内核版本,您可能可以使用 tcp_iterate() 或 inet_sock_diag_find_openreq() 来使用 bpf 程序迭代这些数据结构。

但是,如果您想采取简单的方法,您可以迭代包含所有 pid 的 /proc 文件夹,并在 fd 目录中查找它的 inode,并使用 inode 将它们与 proc/net/tcp 中的套接字信息相关联或 proc/net/udp。

© www.soinside.com 2019 - 2024. All rights reserved.