Update:續篇請參考「PChome 24h 連線會慢的原因... (續篇)」。
tl;dr:因為他們的 DNS servers 不會對 IPv6 的 AAAA
record 正確的回應 NXDOMAIN
,導致 DNS resolver 會不斷嘗試。
好像一行就把原因講完了啊,還是多寫一些細節好了。
起因於我的電腦連 PChome 24h 時常常會卡住,Google Chrome 會寫「Resolving host...」,於是就花了些時間找這個問題。
一開始先用幾個工具測試,發現 host 會卡,但不知道卡什麼:
$ host 24h.pchome.com.tw
拿 tcpdump 出來聽的時候發現 host 會跑 A
、AAAA
以及 MX
三個種類,而後面兩個都會卡住:
24h.pchome.com.tw is an alias for shopping.gs1.pchome.com.tw. shopping.gs1.pchome.com.tw has address 210.242.43.53 ;; connection timed out; no servers could be reached ;; connection timed out; no servers could be reached
這樣就有方向了... 我的電腦是 Dual-stack network (同時有 IPv4 address 與 IPv6 address),所以可以預期 Google Chrome 會去查 IPv6 address。而國內很多網站都還沒有把有 IPv6 的情境當標準測試,很容易中獎...
有了方向後,用 dig 測試 IPv6 的 AAAA
,發現都是給 SERVFAIL
,而且多跑幾次就發現會卡住:
$ dig 24h.pchome.com.tw aaaa @168.95.192.1
然後對 {cheetah,dns,dns2,dns3,wolf}.pchome.com.tw
(上層登記的) 與 dns4.pchome.com.tw
(實際多的) 測,可以拿到 CNAME
record,像是這樣:
$ dig 24h.pchome.com.tw aaaa @dns.pchome.com.tw ; <<>> DiG 9.9.5-3ubuntu0.16-Ubuntu <<>> 24h.pchome.com.tw aaaa @dns.pchome.com.tw ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26037 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 6 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;24h.pchome.com.tw. IN AAAA ;; ANSWER SECTION: 24h.pchome.com.tw. 300 IN CNAME shopping.gs1.pchome.com.tw. ;; AUTHORITY SECTION: gs1.pchome.com.tw. 300 IN NS ns3.gs1.pchome.com.tw. gs1.pchome.com.tw. 300 IN NS ns1.gs1.pchome.com.tw. gs1.pchome.com.tw. 300 IN NS ns4.gs1.pchome.com.tw. gs1.pchome.com.tw. 300 IN NS ns5.gs1.pchome.com.tw. gs1.pchome.com.tw. 300 IN NS ns2.gs1.pchome.com.tw. ;; ADDITIONAL SECTION: ns1.gs1.pchome.com.tw. 300 IN A 210.242.216.91 ns2.gs1.pchome.com.tw. 300 IN A 210.242.216.92 ns3.gs1.pchome.com.tw. 300 IN A 210.242.43.93 ns4.gs1.pchome.com.tw. 300 IN A 203.69.38.91 ns5.gs1.pchome.com.tw. 300 IN A 210.71.147.91 ;; Query time: 12 msec ;; SERVER: 210.59.230.85#53(210.59.230.85) ;; WHEN: Wed Nov 22 11:05:24 CST 2017 ;; MSG SIZE rcvd: 243
但往 ns{1,2,3,4,5}.gs1.pchome.com.tw
問的時候給不出答案,也不給 NXDOMAIN
,像是這樣:
$ dig shopping.gs1.pchome.com.tw aaaa @ns1.gs1.pchome.com.tw ; <<>> DiG 9.9.5-3ubuntu0.16-Ubuntu <<>> shopping.gs1.pchome.com.tw aaaa @ns1.gs1.pchome.com.tw ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36249 ;; flags: qr rd ad; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 6 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1280 ;; QUESTION SECTION: ;shopping.gs1.pchome.com.tw. IN AAAA ;; AUTHORITY SECTION: gs1.pchome.com.tw. 3600 IN NS ns3.gs1.pchome.com.tw. gs1.pchome.com.tw. 3600 IN NS ns4.gs1.pchome.com.tw. gs1.pchome.com.tw. 3600 IN NS ns5.gs1.pchome.com.tw. gs1.pchome.com.tw. 3600 IN NS ns1.gs1.pchome.com.tw. gs1.pchome.com.tw. 3600 IN NS ns2.gs1.pchome.com.tw. ;; ADDITIONAL SECTION: ns3.gs1.pchome.com.tw. 3600 IN A 210.242.43.93 ns4.gs1.pchome.com.tw. 3600 IN A 203.69.38.91 ns5.gs1.pchome.com.tw. 3600 IN A 210.71.147.91 ns1.gs1.pchome.com.tw. 3600 IN A 210.242.216.91 ns2.gs1.pchome.com.tw. 3600 IN A 210.242.216.92 ;; Query time: 11 msec ;; SERVER: 210.242.216.91#53(210.242.216.91) ;; WHEN: Wed Nov 22 11:07:17 CST 2017 ;; MSG SIZE rcvd: 310
於是 DNS resolver 就倒在路邊了...
Hi,據我所知 Google Chrome 已經實作了 Happy Eyeballs,如果 IPv6 解析出問題,那麼應該會嘗試使用 IPv4 連接?
所以是「很慢」而不是不能連...
Hi,
我人在美國出差,公司有ipv6用你的方法測試,沒有這個問題。
因為已經修正了...