Linux

我可以在文件系統的哪個位置獲取有關套接字的元數據?

  • December 22, 2021

我知道 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。我怎樣才能從套接字:

$$ 3803248 $$到 ss 提供的 tcp 統計資訊?我不打算完全重寫 ss :) 但我很好奇文件系統中存在什麼。

技巧:這樣的事情通常可以通過執行strace -o logfile.txt programname;來解決。在您的情況下,您會發現它ss創建了一個AF_NETLINK套接字,並通過它發送和接收消息。

Netlink是核心的邏輯介面,旨在提供對網路堆棧內部的訪問。

使用ldd $(which ss)你會發現ss似乎使用了libmnl庫——這使得生成、發送、接收和解析這些消息變得可行。從理論上講,您當然可以手工製作此類消息,但是您只是在部分重新實現 libmnl(而且很可能更糟),所以您想使用它-它是由發明核心方面的同一個人所發明的,所以使用它有點道理。

引用自:https://unix.stackexchange.com/questions/683481