在文件系统中的哪里可以获取有关套接字的元数据?

在文件系统中的哪里可以获取有关套接字的元数据?

我知道 lsof 和 ss 提供有关连接的元数据。他们从哪里得到它?

例如,这表示一个连接:

ls -al /proc/102922/fd/98
lrwx------ 1 me me 64 dic 21 06:06 /proc/102922/fd/74 -> 'socket:[3803248]'

通过 ss 我可以看到更多信息:

tcp   ESTAB      0      0                192.168.68.108:33966      198.252.206.25:https  users:(("chrome",pid=102922,fd=98)) cubic wscale:9,7 rto:296 rtt:92.785/24.455 ato:40 mss:1448 pmtu:1500 rcvmss:536 advmss:1448 cwnd:10 bytes_sent:1463 bytes_acked:1464 bytes_received:336 segs_out:11 segs_in:7 data_segs_out:6 data_segs_in:2 send 1.25Mbps lastsnd:71284 lastrcv:71292 lastack:26068 pacing_rate 2.5Mbps delivery_rate 271kbps delivered:7 app_limited busy:308ms rcv_space:14480 rcv_ssthresh:64088 minrtt:86.996     

但是,假设我的应用程序运行的系统由于某种原因没有 ss。我怎样才能从socket:[3803248]转到ss提供的tcp统计信息?我不打算完全重写 ss :) 但我很好奇文件系统中存在什么。

答案1

窍门:这样的事情通常可以通过运行strace -o logfile.txt programname;来解决。在您的情况下,您会发现ss创建一个AF_NETLINK套接字,并通过它发送和接收消息。

网联是内核的逻辑接口,旨在提供对网络堆栈内部的访问。

使用ldd $(which ss)你可以发现ss好像使用了库姆尼库——它使得生成、发送、接收和解析这些消息变得可行。理论上你当然可以手工制作这样的消息,但你只是部分地重新实现 libmnl (而且很可能更糟),所以你想使用它 - 它是由发明内核部分的同一个人完成的,所以使用它是有意义的。

相关内容