如何从Linux进程外部的套接字上获取套接字信息?


2

我对侦听TCP套接字特别感兴趣,但是获取套接字的所有和任何套接字(struct sock,如Kernel的include / net / sock.h中定义的)信息都会很好。

例如,此ss输出显示绑定到8080的TCP套接字。

tcp    LISTEN     20     128                    *:8080                  *:*      uid:500 ino:32355 sk:ffff8801b11ca880
      rto:1000 mss:536 cwnd:10

我假设sk:***是此套接字的(struct sock)结构的地址。我没有找到任何可以抓住sk结构并打印其字段的工具。我可以使用某些内容进入(是内核还是进程?)内存,并将ffff8801b11ca880中的数据解释为(struct sock)?


你有没有考虑过使用 -p netstat的选项? (例如。 netstat -lnap )这将为您提供拥有过程的名称/ PID。
hololeap

Answers:


3

地址在内核空间中,因为设置了最高16位(FFFF)。要继续进行,您需要为正在运行的内核使用GDB和调试符号。我正在使用CentOS,所以以下内容对我有用:

# yum install gdb
# yum install --enablerepo=base-debuginfo kernel-debuginfo
# gdb /usr/lib/debug/lib/modules/`uname -r`/vmlinux /proc/kcore

之后,您可以像使用用户空间进程一样使用GDB,除了它是内核:

(gdb) explore (struct sock *)0xffff8801b11ca880

1
我会用 debuginfo-install 代替 yum - 不需要指定repo,而且它试图找到与当前安装的包匹配的debuginfo(虽然并不总是成功)
Pawel Veselov

当然,这听起来是一种更好的方式。我不知道那个命令,但我确实知道了debuginfo repos,所以这就是我提出的。
Steve McKay

0

这取决于你需要什么。

struct sock中包含的大部分信息( struct socket)仅用于调试。 TCP套接字表的转储包含在 的/ proc /净/ TCP ,同样适用于UDP,IGMP,raw,arp,UNIX-domain。这是一个简单的ascii表, 其内容由本输出第1行的标题简要总结:

 more /proc/net/tcp
 sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
 0: 00000000:228B 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 15159 1 ffff8801a1ee2300 100 0 0 10 0                     
 1: 00000000:CC4B 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 13835 1 ffff8801a1ee0700 100 0 0 10 0    

并且稍微更广泛地描述了 man proc(5) 页面如下:

的/ proc /净/ TCP

保存TCP套接字表的转储。除了调试之外,大部分信息都没有用。 “sl”值是套接字的内核哈希槽,“local_address”是本地地址和端口号对。 “rem_address”是远程地址和端口号对(如果已连接)。 “St”是套接字的内部状态。根据内核内存使用情况,“tx_queue”和“rx_queue”是传出和传入数据队列。 “tr”,“tm-> when”和“rexmits”字段保存内核套接字状态的内部信息,仅用于调试。 “uid”字段保存套接字创建者的有效UID。

通过如下命令读取和更方便地显示此信息 lsof -i 要么 netstat -4


在这个特殊情况下,我对像这样的东西很感兴趣 sk_ack_backlogsk_max_ack_backlog,我不认为那些出现在任何过程条目中。
Pawel Veselov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.