단일 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로 표시되고 피어 "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

파일 은 유닉스 데이터그램 /dev/log입니다 . 스트림(청취 또는 유닉스 스트림) u_dgr처럼 "청취"할 필요는 없습니다 . 데이터그램 서버에는 소켓/바인드/수신 호출 시퀀스(및 그 이상)만 필요한 반면, 스트리밍 서버는 소켓/바인드/수신/수락(및 그 이상)을 수행해야 합니다.u_str/run/systemd/journal/stdout

이와 관련하여 Unix 소켓이 TCP 소켓과 비교하여 작동하는 방식에 근본적인 차이점이 있습니까?

UNIX 도메인개울소켓은 TCP와 유사하게 작동합니다. UNIX 도메인데이터그램소켓은 UDP와 유사하게 작동합니다. 그러나 Unix 도메인 소켓에는 파이프와 유사한 측면이 있습니다. 예를 들어 Unix 데이터그램 소켓은 UDP와 같은 데이터 손실 및 잘못된 전달 문제를 겪지 않는 경향이 있습니다. 그러나 수신(스트림의 경우) 또는 수신하지 않는(데이터그램의 경우) 측면은 유닉스 도메인 소켓과 인터넷 소켓 간에 동일합니다.

어쩌면 물어봐야 할 것 같습니다. ss 출력의 포트 번호는 Unix 도메인 소켓에 대해 무엇을 의미합니까?

이는 아마도 특정 소켓을 식별하기 위해 커널이 발명한 마법의 정수일 것이며 Unix 도메인 소켓은 프로세스 내부에 있거나(파이프와 같은) 파일 시스템을 통해 노출되기 때문에 그다지 중요하지 않을 것입니다. 두 경우 모두 이를 사용하기 위해 도메인 소켓의 매직 넘버를 알 필요가 없습니다.

관련 정보