我注意到命令比在 MacOS 10.12 上ping6
慢得多。ping
使用ping6
命令:
❯ ping6 localhost
PING6(56=40+8+8 bytes) ::1 --> ::1
16 bytes from ::1, icmp_seq=0 hlim=64 time=0.088 ms
16 bytes from ::1, icmp_seq=1 hlim=64 time=0.092 ms
16 bytes from ::1, icmp_seq=2 hlim=64 time=0.137 ms
16 bytes from ::1, icmp_seq=3 hlim=64 time=0.117 ms
16 bytes from ::1, icmp_seq=4 hlim=64 time=0.116 ms
16 bytes from ::1, icmp_seq=5 hlim=64 time=0.112 ms
16 bytes from ::1, icmp_seq=6 hlim=64 time=0.149 ms
16 bytes from ::1, icmp_seq=7 hlim=64 time=0.116 ms
16 bytes from ::1, icmp_seq=8 hlim=64 time=0.119 ms
16 bytes from ::1, icmp_seq=9 hlim=64 time=0.125 ms
^C
--- localhost ping6 statistics ---
10 packets transmitted, 10 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.088/0.117/0.149/0.017 ms
使用常规ping
命令:
❯ ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.071 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.077 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.083 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.109 ms
64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.076 ms
64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.040 ms
64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.068 ms
^C
--- localhost ping statistics ---
10 packets transmitted, 10 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.040/0.068/0.109/0.020 ms
我想不出为什么使用 IPv6 会比 IPv4 慢,那么使用ping6
会比使用慢的原因是什么呢ping
?
更新
我删除了 ping 远程主机名的示例。它不相关,因为我不能确定在两次测试中到达的机器是否相同。它也可能导致与我的主要问题无关的答案。
答案1
ping
和二进制的实现ping6
不太一样。
此外,两者都没有报告tcpdump
测量的时间。
这里是一个例子,尽管我自己做了几个。这是tcpdump
我使用的命令:
tcpdump -i lo0 -t 5 -nqK
00:00:00.000000 IP6 ::1 > ::1: ICMP6,回显请求,序列号 0,长度 16 00:00:00.000033 IP6 ::1 > ::1: ICMP6,回显答复,序号 0,长度 16
这显示了时间戳增量0.033 毫秒第一个 IPV6 数据包和答复之间。
ping6
然而,往返时间报告为0.109 毫秒。
00:00:00.000000 IP 127.0.0.1 > 127.0.0.1:ICMP 回显请求,ID 17569,序列号 0,长度 64 00:00:00.000034 IP 127.0.0.1 > 127.0.0.1:ICMP 回显答复,ID 17569,序号 0,长度 64
这tcpdump
表明实际 RTT 为0.034 毫秒,但ping
报告 RTT 为0.080 毫秒。
ping
和ping6
是两个不同的二进制文件;IPv6 由于其寻址时间较长,需要更多的 CPU 周期来处理,即使它们在其他所有方面都是相同的二进制文件(事实并非如此)。
但是,数据包捕获表明我的 Mac mini 的网络堆栈相对较快;它的ping
往返ping6
时间计算不正确,ping6
比我预期的要简单得多ping
。
答案2
您正在 ping 2 个不同的服务器,请尝试 ping 这 2 个 Google 服务器以进行比较,您会发现当 IPv6 得到适当支持时,速度会快得多。
IPv6:2001:4860:4860::8888
IPv4:8.8.8.8
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=61 time=3.71 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=61 time=1.67 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=61 time=1.62 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=4 ttl=61 time=3.34 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=5 ttl=61 time=2.63 ms
Reply from 8.8.8.8: bytes=32 time=23ms TTL=59
Reply from 8.8.8.8: bytes=32 time=24ms TTL=59
Reply from 8.8.8.8: bytes=32 time=8ms TTL=59
Reply from 8.8.8.8: bytes=32 time=12ms TTL=59
答案3
IPv6 作为一种协议,确实没有理由比 IPv4 快或慢很多。我猜 IPv6 可能会慢一点,因为它的地址更长,导致开销稍微大一些,但仅此而已。
在给定的流量上,IPv4 或 IPv6 是否更快几乎总是因为网络拓扑/路径的差异,以及端点和中间盒上的 IPv4 和 IPv6 实现的相对质量。
几年前,IPv6 通常是慢点比 IPv4 更优先,因为大多数路由器中的 IPv4 处理路径通常是硬件优化的(“快速路径”),而 IPv6 处理路径全部由软件完成。
目前,IPv6 通常快点IPv6 比 IPv4 更快,因为它不需要经过任何 NAT,而 IPv4 经常需要经过 NAT 网关,而 NAT 网关可能会超载。但目前仍有一些网络路径,其中 IPv4 比 IPv6 更快。这实际上在很大程度上取决于网络拓扑以及端点和中间盒的硬件和软件质量。
请注意,当您向 DNS 询问给定主机名的 IPv4 和 IPv6 地址时,不能保证所有这些地址都转到同一个物理盒子。在处理使用 CDN 的知名网站时尤其如此。即使它们转到同一个物理盒子,也不能保证 IPv4 和 IPv6 会在整个网络中使用相同的路由。事实上,在 IPv4 路径中有 NAT 网关而在 IPv6 路径中没有 NAT 网关的情况很常见。
您记录的 macOS 环回 ping 在 IPv4 和 IPv6 情况下存在很大差异的情况很有趣。看起来这两种情况的速度应该比您看到的速度更接近。