一 、之前的旧经验
之前公司发生过wget过慢的情况,经过研究发现wget默认调用系统的getaddrinfo,会同时发送ipv4和ipv6的dns请求,只有当2个都收到或者ipv6超时时,才会进行下载流程。
而公司使用的dns不响应ipv6的请求,导致每次wget前都要在dns阶段卡顿5秒钟(等待超时),解决办法是修改了dns代码,遇到ipv6的请求后,直接返回空数据,有效解决了wget等一系统使用getaddrinfo函数的程序速度慢的问题。
二、第一反应
所以平时在操作中遇到ping首包慢的情况,潜意识里觉得应该是ipv6的问题,没有太过关注。但是帮同事解决问题的时候发现,首包卡顿是不定期的,而不是默认5秒钟。
三、抓包分析
感觉很奇怪,于是抓包看了一下,发现dns返回速度很快,也没有请求ipv6的域名地址,同时ping包的request和reply都很快。可是明明已经收到了reply,ping首包依然处于卡顿状态。
抓包发现icmp瞬间返回。