Android网络超时的原因和解决办法
2013-08-04 10:35
190 查看
网站的Android应用向服务器发送请求时,经常出现网路超时的现象,而IPhone应用却一切正常。
起初怀疑是我们Android应用中的BUG,但在排查过程中发现,通过Andorid浏览器访问网站的WEB页面同样会出现网络超时的问题。
这一发现让我们将排查的对象转移到服务器的配置上。最后确定问题的原因是我们将tcp_tw_recycle和tcp_timestamps同时打开了。
之前我们为了服务器性能优化,在nginx所在的机器上修改了内核的tcp设置,开启了tw_reuse和tw_recycle。
tcp_timestamps在CentOS中默认是打开的。
在linux内核中,如果tcp_tw_recyle和tcp_timestamps同时开启,内核会要求在60内同一源发出的tcp请求的timestamp是递增的。NAT下的机器共享同一个对外IP,每个机器的timestamp是随机生成的,这就导致当NAT下多个client同时访问服务器时,timestamp大的client能获得响应,而其他client被拒绝。
可是为什么IPhone应用不受这一限制呢?
原因是tcp_timestamp在IPhone中默认是关闭的,在Android系统中默认却是开启的。
解决办法:将net.ipv4.tcp_tw_recyle设为0, sysctl -p。
重设之后,该问题解决。
起初怀疑是我们Android应用中的BUG,但在排查过程中发现,通过Andorid浏览器访问网站的WEB页面同样会出现网络超时的问题。
这一发现让我们将排查的对象转移到服务器的配置上。最后确定问题的原因是我们将tcp_tw_recycle和tcp_timestamps同时打开了。
之前我们为了服务器性能优化,在nginx所在的机器上修改了内核的tcp设置,开启了tw_reuse和tw_recycle。
net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1
tcp_timestamps在CentOS中默认是打开的。
在linux内核中,如果tcp_tw_recyle和tcp_timestamps同时开启,内核会要求在60内同一源发出的tcp请求的timestamp是递增的。NAT下的机器共享同一个对外IP,每个机器的timestamp是随机生成的,这就导致当NAT下多个client同时访问服务器时,timestamp大的client能获得响应,而其他client被拒绝。
可是为什么IPhone应用不受这一限制呢?
原因是tcp_timestamp在IPhone中默认是关闭的,在Android系统中默认却是开启的。
解决办法:将net.ipv4.tcp_tw_recyle设为0, sysctl -p。
重设之后,该问题解决。
相关文章推荐
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- android监控网络状态变化防止多次广播的一种解决办法
- android程序内存泄漏的原因和解决办法
- Android开发:休眠唤醒或开机后cmwap/cmnet网络不能连接的解决办法
- android中java.lang.IllegalStateException异常产生的原因及解决办法
- Android ANR产生原因和解决办法
- HttpWebRequest的GetRespons偶尔超时、死掉的原因及解决办法
- Android JNI错误--原因和解决办法
- android ANR产生原因和解决办法
- Android中Application的onCreate多次调用的原因和解决办法
- Android 常见 Memory Leak 原因及解决办法总结
- Android在子线创建Handler出现异常的原因及解决办法
- 【介绍笔记本电脑无线网络连接不上的原因及解决办法】_91xcz
- 百度网盘在用qq登录的时候显示由于网络原因无法载入页面的解决办法
- android.database.sqlite.SQLiteException: no such table出现原因与解决办法
- Android手机出现"已安装了存在签名冲突的同名数据包"的原因及解决办法