最近工做中遇到某个服务器应用程序 UDP 丢包,在排查过程当中查阅了不少资料,总结出来这篇文章,供更多人参考。linux
在开始以前,咱们先用一张图解释 linux 系统接收网络报文的过程。服务器
● 首先网络报文经过物理网线发送到网卡
● 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不须要 CPU 参与
● 内核从 ring buffer 中读取报文进行处理,执行 IP 和 TCP/UDP 层的逻辑,最后把报文放到应用程序的 socket buffer 中网络
● 应用程序从 socket buffer 中读取报文进行处理socket
在接收 UDP 报文的过程当中,图中任何一个过程均可能会主动或者被动地把报文丢弃,所以丢包可能发生在网卡和驱动,也可能发生在系统和应用。code
之因此没有分析发送数据流程,一是由于发送流程和接收相似,只是方向相反;另外发送流程报文丢失的几率比接收小,只有在应用程序发送的报文速率大于内核和网卡处理速率时才会发生。blog
本篇文章假定机器只有一个名字为 eth0 的 interface,若是有多个 interface 或者 interface 的名字不是 eth0,请按照实际状况进行分析。it
NOTE:文中出现的 RX
(receive) 表示接收报文,TX
(transmit) 表示发送报文。程序
确认有 UDP 丢包发生im