也談wifi斷流問題 (by quqi99)
阿新 • • 發佈:2018-11-11
版權宣告:可以任意轉載,轉載時請務必以超連結形式標明文章原始出處和作者資訊及本版權宣告 (作者:張華 發表於:2018-09-03)
問題
筆者最近應該是遇到了常聽大家說起的wifi斷流問題, 新入一款安卓原生系統手機, 但是在使用wifi上網時會感覺到某些APP上網不流暢, 尤其是使用京東APP搜尋商品時會總說找不著網路, 但此時顯然是有網路的. 為此, 筆者先做了一系統排除性實驗:
- 排除法測試, 使用京東APP搜尋商品時說找不著網路, 但使用京東APP的其他功能沒有問題, 並且使用京東以外的其他APP也沒問題
- 排除法測試, 切換為4G網路使用京東APP搜尋商品正常, 僅僅只是使用WIFI網路時才會出問題.
- 排除法測試, 去麥當勞使用WIFI確認無問題, 但速度也不快, 但能開啟頁面.
- 排除法測試, 難道是家裡的WIFI有問題嗎? 但換個手機型號使用京東APP搜尋商品卻又正常.
- 排除法測試, 難道是VPN的問題? 關掉VPN, 恢復DNS國內設定依然有問題.
- 排除法測試, 繼續換一個沒有VPN的乾淨的OpenWRT路由器依然有問題, 可惜家裡沒有Non-OpenWRT路由器可供測試.
- 排除法測試, 路由器上修改802.11g, 802.11n, 802.11ac等設定後問題依舊.
- 排除法測試, 檢查了路由器上的MAC地址是否與其他機器重複, 未發現異常
- 排除法測試, 使用114.114.114.114作為DNS, 問題依舊
- 排除法測試, OpenWRT路由器使用tcpdump抓包, 干擾條目過多, 未深入
- 排除法測試, 現在問題看起來只是發生在這款特定手機型號與特定的OpenWRT路由器與特定的某些APP如京東, 手機刷機到android 8.1與7.1兩個版本問題依舊.
- 排除法測試, google搜尋大量京東或別的某些應用在各種手機型號上出問題的帖子, 試著更改帖子中的各種切換手機配置的操作, 如不對京東使用電源優化,問題依舊.
- 排除法測試, 絕大多數時候打不開京東的這個搜尋商品的功能, 但極少數情況又能開啟, 但非常慢, 使用別家的wifi網路時也是非常慢, 很難說清楚現象.
解決
上述一系列排除性測試讓我相信該問題僅和我使用特定的手機型號, 使用特定的OpenWRT路由器, 使用特定的某些APP如京東有關.
京東APP, 一個上層應用而已, 理論上只有下列幾個因素會影響到上層應用:
- DNS
- IPv6/IPv4 fallback
- MTU
理論讓我將目光回到MTU, 修改OpenWRT路由器WAN口的MTU=1492後問題依舊.繼續深挖: - 路由器背後的手機作業系統應該有/proc/sys/net/ipv4/ip_no_pmtu_disc=0讓手機可以根據pmtu來確實應用所需的mss值. 遺憾地是, 手機沒有root, 無法檢查此項值.
- OpenWRT路由器tcpdump抓包, 看到的mss值確實不小. 既然無root許可權無法修改手機的ip_no_pmtu_disc引數, 那有沒有方法直接修改OpenWRT路由器強迫修改mss值呢?
OK, 在路由器上新增如下兩個命令, 問題就這麼解決了:
#iptables -A FORWARD -j ACCEPT
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
root@OpenWrt:~# iptables-save |grep mss
:mssfix - [0:0]
-A FORWARD -j mssfix
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A mssfix -o pppoe-wan -p tcp -m tcp --tcp-flags SYN,RST SYN -m comment --comment "wan (mtu_fix)" -j TCPMSS --clamp-mss-to-pmtu
root@OpenWrt:~# tcpdump -ni br-lan src host 192.168.99.194 and dst host 111.13.24.129 and dst port 443
06:37:42.085674 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [S], seq 140081180, win 65535, options [mss 1460,sackOK,TS val 8629819 ecr 0,nop,wscale 8], length 0
06:37:42.092397 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [.], ack 2370816066, win 343, length 0
06:37:42.095245 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [P.], seq 0:173, ack 1, win 343, length 173
06:37:42.141194 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [.], ack 1453, win 354, length 0
06:37:42.141396 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [.], ack 2905, win 365, length 0
06:37:42.141536 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [.], ack 3472, win 377, length 0
06:37:42.147373 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [P.], seq 173:491, ack 3472, win 377, length 318
06:37:42.185607 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [P.], seq 491:1736, ack 3714, win 388, length 1245
06:37:42.194932 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [P.], seq 1736:1767, ack 4065, win 388, length 31
06:37:42.195258 IP 192.168.99.194.39494 > 111.13.24.129.443: Flags [R.], seq 1767, ack 4065, win 388, length 0
總結
這款手機的作業系統沒有設定ip_no_pmtu_disc引數去協商mss值, 而OpenWRT路由器剛好缺一條iptables rule (iptables -t mangle -A FORWARD -p tcp –tcp-flags SYN,RST SYN -j TCPMSS –clamp-mss-to-pmtu), 這樣遭遇了pppoe的1492 MTU問題.
換句話說, 當我外出時, 如果所連的路由器沒有加這條設定, 那麼這個問題仍然又遇到. 手機作業系統ip_no_pmtu_disc設定才能徹底解決某些應用wifi網路不能上網的問題.