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입니다. 이는 소켓에 데이터를 쓸 공간이 없음을 의미합니다(즉, 전송 버퍼가 가득 찼음).