単一のUNIXドメインソケットが複数のピアに同時に接続できますか?

単一のUNIXドメインソケットが複数のピアに同時に接続できますか?

syslogこれはsがシンボリックリンクソケットであるため、/dev/log少なくとも1つの受信ソケットがあると予想されsystemd-journald、おそらく異なる「ポート」番号を持ついくつかの異なる接続ソケットがあると予想されます。/run/systemd/journal/stdoutそれがまさにそのことです。

リスニングソケット:

# ss -xpl | grep stdout
u_str LISTEN 0      4096                      /run/systemd/journal/stdout 15240            * 0    users:(("systemd-journal",pid=254,fd=5),("systemd",pid=1,fd=38)) 

接続ペアの例:

# ss -xp | grep 19637
u_str ESTAB 0      0                                         * 20872             * 19637  users:(("dbus-daemon",pid=701,fd=2),("dbus-daemon",pid=701,fd=1))                                                                                                                                                                                                                                                                                                                                                                                    
u_str ESTAB 0      0               /run/systemd/journal/stdout 19637             * 20872  users:(("systemd-journal",pid=254,fd=73),("systemd",pid=1,fd=78))

しかし、の場合、dev-logリスニングソケットがないようです。 systemd-journaldの単一のソケット( "port" = 15236)が複数のピアに接続されている次のセルフレコードでは、ソケットはESTABとしてマークされ、ピア "port"は0として表示されます。どうやってこれができますか?これに関して、UnixソケットがTCPソケットと比較して機能する方法に根本的な違いはありますか?

おそらく尋ねなければならないようです。出力のポート番号はssUnixドメインソケットについて何を意味しますか?

# ss -xpl | grep dev-log
# ss -xp | grep dev-log
u_dgr ESTAB 0      0              /run/systemd/journal/dev-log 15236             * 0      users:(("systemd-journal",pid=254,fd=3),("systemd",pid=1,fd=36))                                                                                                                                                                                                                                                                                 
# ss -xp | grep 15236
u_dgr ESTAB 0      0              /run/systemd/journal/dev-log 15236             * 0      users:(("systemd-journal",pid=254,fd=3),("systemd",pid=1,fd=36))                                                                                                                                                                                                                                                                                 
u_dgr ESTAB 0      0                                         * 19250             * 15236  users:(("dbus-daemon",pid=369,fd=14))                                                                                                                                                                                                                                                                                                            
u_dgr ESTAB 0      0                                         * 101364            * 15236  users:(("su",pid=4448,fd=3))                                                                                                                                                                                                                                                                                                                     
u_dgr ESTAB 0      0                                         * 22068             * 15236  users:(("gdm",pid=373,fd=13))                                                                                                                                                                                                                                                                                                                    
u_dgr ESTAB 0      0                                         * 20801             * 15236  users:(("(sd-pam",pid=692,fd=8))                                                                                                                                                                                                                                                                                                                 
u_dgr ESTAB 0      0                                         * 21686             * 15236  users:(("dbus-daemon",pid=701,fd=10))                                                                                                                                                                                                                                                                                                            
u_dgr ESTAB 0      0                                         * 19589             * 15236  users:(("gdm-session-wor",pid=680,fd=9))                                                                                                                                                                                                                                                                                                         
u_dgr ESTAB 0      0                                         * 104580            * 15236  users:(("sudo",pid=4447,fd=8))                                                                                                                                                                                                                                                                                                                   
u_dgr ESTAB 0      0                                         * 14305             * 15236  users:(("polkitd",pid=450,fd=10))                                                                                                                                                                                                                                                                                                                
u_dgr ESTAB 0      0                                         * 23001             * 15236  users:(("gnome-session-b",pid=727,fd=17))  

答え1

ファイルはUnixデータグラム/dev/logです。ストリーム(リスニングまたはUnixストリーム)u_dgrのように「リスニング」する必要はありません。データグラムサーバーにはソケット/バインド/受信呼び出しシーケンス(およびそれ以上)のみが必要ですが、ストリーミングサーバーはソケット/バインド/受信/受け入れ(およびそれ以上)を実行する必要があります。u_str/run/systemd/journal/stdout

これに関して、UnixソケットがTCPソケットと比較して機能する方法に根本的な違いはありますか?

UNIXドメイン小川ソケットはTCPと同様に動作します。 UNIXドメインデータグラムソケットはUDPと同様に動作します。しかし、Unixドメインソケットにはパイプに似た側面があります。たとえば、Unixデータグラムソケットは、UDPなどのデータ損失や誤った配信の問題を経験しない傾向があります。ただし、受信(ストリームの場合)または受信しない(データグラムの場合)の側面は、Unixドメインソケットとインターネットソケットの間で同じです。

たぶん尋ねるべきだと思います。 ss出力のポート番号は、Unixドメインソケットについて何を意味しますか?

これはおそらく特定のソケットを識別するためにカーネルによって発明された魔法の整数であり、Unixドメインソケットはプロセス内にあるか(パイプなど)ファイルシステムを介して公開されるため、それほど重要ではありません。どちらの場合も、これを使用するためにドメインソケットのマジックナンバーを知る必要はありません。

関連情報