![当 UNIX 域套接字的套接字缓冲区溢出时,如何检查每个进程/套接字丢弃的数据包?](https://linux22.com/image/98406/%E5%BD%93%20UNIX%20%E5%9F%9F%E5%A5%97%E6%8E%A5%E5%AD%97%E7%9A%84%E5%A5%97%E6%8E%A5%E5%AD%97%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E6%AF%8F%E4%B8%AA%E8%BF%9B%E7%A8%8B%2F%E5%A5%97%E6%8E%A5%E5%AD%97%E4%B8%A2%E5%BC%83%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85%EF%BC%9F.png)
当 unix 域套接字的套接字缓冲区已满时看到消息丢失时,如何检查每个进程/套接字丢失的数据包。 netstat 和 ss 工具根据连接类型提供所有统计信息。但是,当缓冲区已满时,有什么方法可以检查每个进程/套接字丢弃的数据包吗?
答案1
由于 Unix 域套接字本质上是“可靠的”,并且“不应该”丢失数据。 “unix”类型的本地套接字是“内存数据结构”,它们的操作与网络套接字(TCP/UDP 等)略有不同。主要的困惑是套接字抽象试图涵盖数据进出进程(内存、文件、磁盘、网络)的许多不同方式。
由于在这种情况下数据是通过计算机的内存总线传输的,而不是数据包网络(互联网),因此在这种情况下丢弃数据包的概念没有意义。
然而,网络传输却是另一回事。远程网络发送者很可能不知道何时停止,并且数据无处可去。也许网卡缓冲区已满,或者数据在网络传输过程中的某个地方被简单地丢弃了。
Unix 套接字是“可靠的”,但这种抽象涵盖了许多底层传输和缓冲类型。 (数据包网络(ip/x25/等)、协议(udp/tcp/等)或直接通过内存传输(在同一台物理计算机上)。
跟踪这些情况实际上取决于应用程序,尤其是在使用类型为“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
Flags:通常设置为 ACC ,代表 SO_ACCEPTON ,表示套接字正在等待连接请求。 SO_WAITDATA,显示为W,表示有数据等待读取。 SO_NOSPACE为N,表示没有空间可以向套接字写入数据(即发送缓冲区已满)。