终端程序中的互联网连接滞后

终端程序中的互联网连接滞后

我每次打开新浏览器选项卡或执行 curl 请求时都会出现 5-10 秒的延迟。我在互联网上发现我应该禁用 IPv6。但当我禁用 IPv6 时,Chrome 选项卡立即开始加载,但连接到互联网的终端命令仍然会受到这种延迟的影响。

我正在使用 Manjaro Linux 23.0.2

以下是我可以向您展示的最小的示例:

卷曲

$ time curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
curl google.com  0,00s user 0,01s system 0% cpu 5,283 total

ping(5秒后打印第一行)

$ time ping -c 5 google.com
PING google.com (142.250.184.142) 56(84) bytes of data.
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=1 ttl=55 time=9.70 ms
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=2 ttl=55 time=12.3 ms
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=3 ttl=55 time=14.4 ms
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=4 ttl=55 time=9.86 ms
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=5 ttl=55 time=11.2 ms

--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 9.696/11.495/14.419/1.746 ms
ping -c 5 google.com  0,01s user 0,00s system 0% cpu 9,043 total

但是这个命令非常快:

$ time nslookup google.com
Server:     1.1.1.1
Address:    1.1.1.1#53

Non-authoritative answer:
Name:   google.com
Address: 142.250.184.142
Name:   google.com
Address: 2a00:1450:4017:814::200e

nslookup google.com  0,01s user 0,03s system 22% cpu 0,147 total

我尝试过的事情:

  • 将我的 DNS 服务器更改为 cloudflare 和 google(在 Wi-Fi 设置中)
  • 已禁用 ipv6

问题是我该如何诊断问题?如果可能的话,我该如何解决?

答案1

问题是我该如何诊断这个问题?

首先我建议你取消禁用所有你尝试禁用的功能。在系统处于正常状态时诊断问题。

由于这看起来像是网络连接超时(可能是 DNS 查询超时),请打开数据包捕获工具(首先是 Wireshark),并在尝试时观察数据包捕获。查找似乎没有回复的传出请求,例如 LLMNR 或 mDNS 或 NBNS 查询,或发送到错误服务器的 DNS 查询。关闭浏览器和curl其他ping可能在捕获中产生大量噪音的程序。

nslookup工具的工作方式与curl或不同ping——它专门是一个 DNS 查询工具,将直接与您配置的 DNS 服务器之一对话,而其他程序这样做;他们使用系统提供的“主机名查找”功能,该功能比 DNS 功能更多。Linux 版本有各种可以通过启用的模块/etc/nsswitch.conf- 除了“文件”(/etc/hosts)和“dns”(/etc/resolv.conf)之外,您可能还有“resolve”(充当本地 DNS 缓存的 systemd-resolved 服务)或“mdns”(本地子网名称查找)之类的东西。您应该查看 nsswitch.conf 文件并尝试使用它getent hosts进行查询。

getent hosts google.com
getent -s dns hosts google.com
getent hosts 1.1.1.1
getent -s dns hosts 1.1.1.1

从 ping 的行为来看,它可能是前向查询或者反向“IP→域名”查询需要一段时间;分别测试两者。

使用更简单的工具(例如ping),运行下面的工具strace可能会揭示它在等待什么;例如,如果它似乎暂停在recv(5, ..)您向上滚动直到找到connect(5, <address>)

相关内容