Linux
如何確定 TCP 連接的主動/被動結束
sock_diag(7)
如果我檢查由(或)返回的有關已建立 TCP 連接的資訊/proc/net/tcp
,我如何確定給定連接是源自擁有被動偵聽套接字還是主動連接的本地端?更新我有興趣在 API 級別執行此操作,即不啟動諸如
ss
or之類的命令netstat
。
如果您使用相同的本地 IP+本地埠組合檢測到多個連接,那麼當這些連接形成時,該系統就是被動端點。當本地埠+本地 IP 組合用於傳出連接時,沒有其他程序通常可以將具有相同本地 IP 的相同本地埠用於其他任何事情。
一旦建立,TCP 連接應該是完全對稱的,因此可能沒有與連接本身相關的屬性可以判斷連接是在入站還是出站方向建立:如果您檢測到偵聽套接字或其他使用相同的連接本地 IP + 埠對,您可以確定所有這些連接都是傳入的。
但是,如果您只看到一個連接而沒有匹配的偵聽套接字,則無法確定。也許它是一個傳出連接,或者它可能是與目前正在關閉並已停止偵聽新連接的服務的最後一個傳入連接。
可以應用一些基於埠號的啟發式方法:如果本地埠號在 指定的範圍內
/proc/sys/net/ipv4/ip_local_port_range
,則很有可能是傳出連接;或者如果它小於 1024,它可能是一個傳入的,除非您使用需要傳出連接的舊服務必須來自僅根埠(我認為某些 NIS 服務或類似的東西有/有這個要求)。