单个 UNIX 域套接字可以同时连接到多个对等点吗?

单个 UNIX 域套接字可以同时连接到多个对等点吗?

syslog由于这是s符号链接到的套接字/dev/log,我预计至少有一个来自 的侦听套接字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,而对等点“端口”显示为 0。这怎么可能?与 tcp 套接字相比,unix 套接字在这方面的运行方式是否有根本不同?

也许我应该问,输出中的端口号ss对于 unix 域套接字意味着什么?

# 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

/dev/log文件是u_dgrunix数据报;这些不需要像流那样“监听”(正在监听u_str的 或 unix 流 )。/run/systemd/journal/stdout数据报服务器只需要套接字/绑定/接收调用序列(以及更多),而流服务器则需要执行套接字/绑定/监听/接受(以及更多)。

与 tcp 套接字相比,unix 套接字在这方面的运行方式是否有根本不同?

UNIX 域溪流套接字的运行方式与 TCP 类似。 UNIX 域数据报套接字的运行方式类似于 UDP。然而,Unix 域套接字具有类似管道的方面:例如,Unix 数据报套接字往往不会像 UDP 那样出现数据丢失和乱序传送问题。但是unix域套接字和互联网套接字之间的监听(对于流)或不监听(对于数据报)方面是相同的。

也许我应该问,ss 输出中的端口号对于 unix 域套接字意味着什么?

它可能是内核发明的一个神奇的整数,用于识别特定的套接字,并且可能不是很重要,因为 Unix 域套接字要么是进程内部的(就像管道一样),要么是通过文件系统公开的。无论哪种情况,都无需知道域套接字的幻数即可使用它。

相关内容