fangpsh's blog

一个双向MTR仅单向丢包的问题

现象:

  1. A 机器ping B 机器丢包,触发A MTR B,最后一跳丢包;
  2. B 机器ping A 机器丢包,触发B MTR A,最后一跳不丢包;

mtr-a2b mtr-b2a

按照之前的理解,A MTR B 和 B MTR ,最后一跳应该是镜像对等的:

A  MTR B :

A                   B
|--------->---------|  < icmp request  package1
|--------<----------|  < icmp reply    package2

B MTR A:

B                   A
|--------->---------|  < icmp request  package3
|--------<----------|  < icmp reply    package4

如果A MTR B出现丢包,那么可能出现在 去程,也可能是回程,所以才需要B MTR A 来判断断点。 可以认为:

package1 走的路径 == package4 走的路径
package2 走的路径 == package3 走的路径

A MTR B 丢包,意味着package1 或者package2 出现了丢,那么B MTR A 也应该会影响才对。 既然事实不符合这个假设,那么说明这个假设是错的。那么是什么影响到了?

猜想:

  1. 交换机会针对五元组负载均衡导致?,可是ICMP不带端口,MTR 默认是ICMP;
  2. 交换机对icmp request 和reply 包的策略不同?B Ping A 也是丢包,排除这个猜想;

既然B ping A 和 B MTR A 表现不一样,那么Ping 和MTR 有什么差异?

包大小?mtr 看了下icmp 包大小,ping 指定了下,B ping A,还是丢包。
TTL?ping 默认ttl = 64,mtr 的ttl 是从1 开始逐渐探测,拿到对端地址回包为止,在这个场景里,B MTR A ,最后一跳ttl = 15。

ping -t 指定ttl = 15,果然不丢,ttl > 15,即丢包。

package1 的ttl = 去程最大,package4 的ttl = 64;
package2 的ttl = 64,package3 的ttl = 回程最大。

怀疑是ICMP 包的TTL 影响到了QoS 策略。用关键词搜索了下,发现了好像可以基于TTL 设置:

cisco:QoS

Time-to-Live Classification
You can classify packets based on the ACL map. You can set Time-to_live (TTL) as a criterion in the ACL list and perform a TTL check on the incoming packet. The access control entry is used to check the IPv4 TTL to match the value on the incoming packet. The classified packet is either marked or policed based on the policy-map action. Queueing cannot be configured on this classification.

The following is an example of TTL classification:

policy-map TTL_MATCH
    class IPV4_TTL
        police rate 6000000000
        set dscp af23

ip access-list extended IPV4_TTL
    permit ip any any ttl eq 100
    permit tcp any any ttl ne 150
...

不了解路由器和交换机的配置,咨询下两个云/IDC 厂商的网工,没有得到很多信息,姑且这么怀疑吧。