我有一台带有 (sixxs) IPv6 隧道的服务器,隧道后面有一个本地网络。隧道的 MTU 为 1470,radvd 会通告具有此 MTU 的前缀,并由本地客户端获取:
root@host:~# ip -6 route
2001:xxxx:xxxx::/64 dev eth1 proto kernel metric 256 expires 298sec mtu 1470
fe80::/64 dev eth1 proto kernel metric 256 mtu 1470
default via fe80::dad3:85ff:feaf:7e77 dev eth1 proto kernel metric 1024 expires 28sec mtu 1470 hoplimit 64
客户端接口的 MTU 为 1500,与往常一样。现在,当我将文件传输到远程 IPv6 主机时,会发生以下情况(服务器、LAN 接口上相关部分的 wireshark 数据包转储):
15.034320 host -> remote SSHv2 Encrypted request packet len=2796
15.034408 server -> host ICMPv6 Too big
15.241163 host -> remote SSHv2 [TCP Retransmission] Encrypted request packet len=1398
15.252193 remote -> host TCP ssh > 58188 [ACK] Seq=2658 Ack=121902 Win=64128 Len=0 TSV=2205083594 TSER=4294965684
15.252480 host -> remote SSHv2 [TCP Retransmission] Encrypted request packet len=2796
15.252558 server -> host ICMPv6 Too big
15.461151 host -> remote SSHv2 [TCP Retransmission] Encrypted request packet len=1398
因此,主机发送一个大小为 2796 的数据包(这根本不可能,因为链路 MTU 为 1500),服务器正确地回复了 ICMPv6 Too big。然后以正确的大小重新传输数据包并确认。但是,下一个数据包又太大了,这个过程无限重复,而文件传输速度却很慢……这里发生了什么?路由缓存显示路由的 MTU 被正确获取(IPv6 地址被名称替换):
root@host:~# ip -6 route show cached
remote via fe80::dad3:85ff:feaf:7e77 dev eth1 metric 0
cache mtu 1470 hoplimit 64
server via server dev eth1 metric 0
cache mtu 1470
答案1
好吧,家里的网络出现了更多奇怪的问题。我采用了微软的方法,重启了服务器。问题似乎解决了。