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

관련 정보