/proc/net/udp
Linux 上有一个“drops”栏:
cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
16151: 00000000:CB53 00000000:0000 07 00000000:00000000 00:00000000 00000000 1000 0 39947169 2 ffff88084c108080 0
如果某个套接字的丢弃计数器为 0,我能否确定合法 UDP 数据包的发送者和应用程序之间发生的任何丢弃都发生在我的盒子之外,比如在某些交换机或路由器等中?
或者可能是我的网卡驱动程序出于某种原因默默地丢弃了一个数据包,而不影响计数器?
我知道,在 Windows 上,即使接收缓冲区中仍有大量空间,数据包也可能会被丢弃,不确定 Linux 上是否存在类似的情况。
答案1
不。
数据包在被多路分解到用户套接字之前可能会丢失。
当内核由于某种原因无法足够快地从网卡读取数据包时,就会发生这种情况。
网卡不会计算每个端口丢失的数据包...至少不一定,而且我不相信类似的东西会集成到/proc/net/udp
.
2015年有一篇文档详细介绍了丢包,不知道你是否觉得有趣。 https://access.redhat.com/sites/default/files/attachments/20150325_network_performance_tuning.pdf
答案2
根据定义,UDP 是一种无连接协议。根据定义,在系统级别,发送方只关心发送,而不关心确认接收。所以对于发送方来说,只要能够发送UDP数据包,就成功了。
由于可能的拥塞/错误,或者由于多种因素(包括多路径路由和不同程度的拥塞),无法保证接收方将收到所有这些数据包,或者按照它们的发送顺序。
缓冲区的大小也是有限的,如果数据包超出缓冲区,它们也会丢失。
要回答您的问题,请处理不面向连接的协议,在系统级别查看数据包丢失计数器为 0,仅在连接的一侧(发送方或接收方,甚至是)执行两侧,并不能说明全貌。
因此,虽然统计数据反映了缓冲区中丢弃的数据包,但它们不会考虑传输中丢失的所有数据包。
除此之外,您可能还想查看两种大小的发送和接收的数据包数量。
进入上层,即在应用程序级别,即 DNS 或 NTP,例如,可以有额外的控制来获取更有意义的服务统计数据。
UDP使用简单的无连接传输模型和最少的协议机制。它没有握手对话,因此使用户的程序面临底层网络协议的任何不可靠性。不保证交付、订购或重复保护。 UDP 提供数据完整性校验和以及用于在数据报的源和目的地寻址不同功能的端口号。
堆栈溢出中的相关线程如何监控Linux UDP缓冲区可用空间?