fangpsh's blog

MTR UDP模式固定丢包率的问题

不愿意透露姓名的同事反馈,在任何一台A 服务器上,mtr 另外一台B 服务器,UDP 模式,发包频率只要大于 1s/次,会出现固定丢包,并且丢包总是在最后一跳:

mtr -u {ip} -nz --interval 0.5

但是使用mtr 默认的模式,icmp不会丢包。同事反馈不同厂商的机器,行为一致,那应该就系统内做的限制,所以怀疑我在机器上针对UDP 做了限速。

交叉测试了下, 1. 选择2台同机房的A,B ,A mtr B(公网IP),和反馈现象一致 2. A mtr B (内网IP),和反馈现象一致

当interval 是0.5 的时候,丢包率恰好是50%,在B 上抓包: udp-loss

B 的回ICMP: Destination Unreachable 是间隔性的。 按照icmp ratelist 搜到了,找到了答案。 系统默认的icmp_ratelimit1000,恰好是1s,那为何mtr ICMP 模式不会丢呢? 因为还有一个参数icmp_ratemask ,默认为以下几类包被限制:

       icmp_ratemask (integer; default: see below; since Linux 2.4.10)
              Mask made of ICMP types for which rates are being limited.

              Significant bits: IHGFEDCBA9876543210
              Default mask:     0000001100000011000 (0x1818)

              Bit definitions (see the Linux kernel source file
              include/linux/icmp.h):

                   0 Echo Reply
                   3 Destination Unreachable *
                   4 Source Quench *
                   5 Redirect
                   8 Echo Request
                   B Time Exceeded *
                   C Parameter Problem *
                   D Timestamp Request
                   E Timestamp Reply
                   F Info Request
                   G Info Reply
                   H Address Mask Request
                   I Address Mask Reply

IMCP 模式下回的包是G Info Reply,未在icmp_ratemask 标记范围内。 icmp-reply

感谢细心的同事,又学习到了。