不一样的java.net.SocketTimeoutException: timeout

android客户端连接使用的OKhttp连接后台接口,连接其中一个接口的时候出现了如下报错:
java.net.SocketTimeoutException: timeout

发生这个问题,其实很简单嘛,只需要

OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60000, TimeUnit.MILLISECONDS)
                .readTimeout(60000, TimeUnit.MILLISECONDS)
                .build();

没想到还是继续报:
java.net.SocketTimeoutException: timeout

继续查找问题的所在,在测试了多次之后,发现了连接了热点之后就不会报这样的问题。难道是因为本地路由做了什么限制,于是顺藤摸瓜,终于发现了这个MTU 值,要将这个值重新设置一下。最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。

MTU的单位是字节。大部分网络设备的MTU都是1500。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。

如何检测网关的MTU?
在本机打开dos窗口,执行:
ping -f -l 1452 192.168.1.1
其中192.168.1.1是网关IP地址,1452是数据包的长度。请注意,上面的参数是“-l”(小写的L),而不是“-1”。 如果能ping通,表示数据包不需要拆包,可以通过网关发送出去。 如果出现:
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
表示数据包需要拆开来发送。此时,减少数据包长度,再执行上面的ping命令。从1400到1472之间多试几次,就能找到合适的数据包长度了。把数据包长度加上数据包头28字节,就得到MTU的值。 如果检测到网关的MTU值是1500,不需要修改。如果网关有防火墙ping不通,可以试试直接把MTU设为1400。
C:\Documents and Settings\Administrator>ping -f -l 1452 192.168.1.1
Pinging 192.168.1.1 with 1452 bytes of data:
Reply from 192.168.1.1: bytes=1452 time=5ms TTL=64
Reply from 192.168.1.1: bytes=1452 time=5ms TTL=64
Reply from 192.168.1.1: bytes=1452 time=5ms TTL=64
Reply from 192.168.1.1: bytes=1452 time=1ms TTL=64
结果出现了回应了!这表示这一个 MTU 值是可行的!不过,强烈建议找出可行的最大 MTU 值!这样一来,在设定的时候,才可以达到最佳的网速!
找出 MTU 值:利用上面这个方法找到的数值还不是 MTU 喔!由于一些封包上面的问题,上面这个值再加上 28 才是我们所需要的 MTU 值!所以,在上面的例子中,我们所需要的 MTU 值是 1464+28=1492!
附注:我设置为1452+28=1480后,还是会出现有些网站打不开、远程桌面无法通过域名登陆的问题(通过ip可以正常远程桌面登陆),而把MTU设置为1452后,反而这些问题都迎刃而解了,并且,此时,登陆zlbog后台正常、使用域名登陆远程桌面正常。
一般来讲,设计好本机的MTU值,可以解决部分网站打不开的情况,但是如果你的共享主机或路由器的MTU设置有问题,有时问题仍然存或,或者出现网速过慢的情况。合理的设置路由器与本机的MTU值,就可以完全解决上述问题,使上网速度达到最大化。
如何修改本机的MTU?修改方法如下:
(1)、运行regedit
(2)、浏览到: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
(3)、Interfaces下有多个子项,每个子项对应一个网卡。请按如下方法选择网卡:
(a)确定本机用来连接Internet的网卡或拨号连接的IP,如192.168.0.19;
(b)用鼠标点击Interfaces上的子项,查看键值列表中的IPAddress项;
(c)如果IPAddress的键值与(a)中的IP相同,即192.168.0.19,则该子项就是要找的网卡。
(4)、进入该子项,在右边的窗口里按鼠标右键,选择“新建”->“双字节值”,输入名称“MTU”,按回车。再用鼠标双击“MTU”,弹出修改窗口: 如图3: 填入MTU的值。填写前请先把基数设为十进制。 设置好后,需要重启机器才能生效。
实践、重启、测试,最后得出最佳的网络状态,探索无极限,努力,终会有好结果。

最后附上路由器中修改MTU的方法,来自百度经验:
https://jingyan.baidu.com/article/ca2d939d79e4e3eb6c31ce1f.html

你可能感兴趣的:(安卓开发)