UNIXドメインソケットのソケットバッファオーバーフロー時に、各プロセス/ソケットからドロップされたパケットをどのように確認できますか?

UNIXドメインソケットのソケットバッファオーバーフロー時に、各プロセス/ソケットからドロップされたパケットをどのように確認できますか?

Unixドメインソケットのソケットバッファがいっぱいになったときにメッセージが失われるのを見ると、プロセス/ソケットごとに失われたパケットをどのように確認できますか? netstat および ss ツールは、接続タイプに基づいてすべての統計情報を提供します。しかし、バッファがいっぱいになったときにプロセス/ソケットごとに破棄されたパケットを確認する方法はありますか?

ベストアンサー1

Unixドメインソケットは本質的に「信頼でき、」データを「失うべきではない」からです。 「unix」タイプのローカルソケットは「メモリ内データ構造」であり、ネットワークソケット(TCP / UDPなど)とは若干異なる動作をします。最大の混乱は、ソケット抽象化がデータがプロセス(メモリ、ファイル、ディスク、ネットワーク)の内外に移動できるさまざまな方法に対処しようとしていることです。

この場合、データはパケットネットワーク(インターネット)ではなくコンピュータのメモリバスを介して転送されるため、パケット消去の概念は意味がありません。

しかし、ネットワーク転送は別の話です。リモートネットワークの送信者はいつ停止するかを知ることができず、データはどこにも行くことができません。ネットワークカードバッファがいっぱいになったか、データがネットワークのどこかに削除された可能性があります。

Unixソケットは「安定」ですが、この抽象化は多くの基本的な転送とバッファリングの種類をカバーしています。 (パケットネットワーク(ip/x25/etc.)、プロトコル(udp/tcp/etc.)、またはメモリ転送を介して直接(同じ物理コンピュータ上)。

これらの条件の追跡は実際にはアプリケーションによって異なります。特に、「unix」タイプのUnixドメインソケットを使用する場合はさらにそうです。リンクされたアプリケーションは、これらのイベントを記録したり統計を表示したりできます。

ss -a --unix -p

Netid  State      Recv-Q Send-Q           Local Address:Port                            Peer Address:Port
u_dgr  UNCONN     0      0                /run/systemd/cgroups-agent 9338                                       * 0
u_str  LISTEN     0      128              /run/systemd/private 9339                                       * 0
u_str  ESTAB      300    768             /var/run/dbus/system_bus_socket 13910                                      * 13895

ご覧のとおり、「unix」タイプのドメインソケットの送受信キュー内のデータ量を確認できます。

netstat -x

Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ N ]         DGRAM                    9481     /run/systemd/cgroups-agent
unix  2      [ W ]         DGRAM                    38742    /run/user/0/systemd/notify

フラグ:通常SO_ACCEPTONを表すACCに設定され、ソケットが接続要求を待っていることを示します。 Wとして表示されるSO_WAITDATAは、読み取り待機中のデータがあることを示します。 SO_NOSPACEはNです。これは、ソケットにデータを書き込むスペースがないことを意味します(つまり、転送バッファがいっぱいです)。

おすすめ記事