Linux
我可以在文件系統的哪個位置獲取有關套接字的元數據?
我知道 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(而且很可能更糟),所以您想使用它-它是由發明核心方面的同一個人所發明的,所以使用它有點道理。