首页 > 工作 > Android的https请求有机率连接失败

Android的https请求有机率连接失败

很久之前的问题,印象中写过blog存档,今天翻了一下,发现没了,只能按记忆写一下,当初抓的包和分析的几种case也丢了。

问题:Android客户端访问https服务的时候,机率性连接失败,然后忽然在某个时候成功(大概是卡了十分钟以后)。iPhone客户端正常。
想当然的会认为是Android客户端层面的问题,因为iPhone正常。

分析过程:抓包发现Android的tcp报文带了TS(timestamp),而iPhone没带。
处理结果:把第一层反向代理上的timestamp关掉,以解决此问题。

具体:
vi /etc/sysctl.conf
改其中的三个参数:

#关闭timestamps校验,同时意味着TW的重用和快速回收选项被关闭。后面的两个参数调整仅为避免误解。
net.ipv4.tcp_timestamps = 0
#关闭对TIME-WAIT状态连接的重用
net.ipv4.tcp_tw_reuse = 0
#关闭快速回收
net.ipv4.tcp_tw_recycle = 0

问题原因猜想(某资料中说明某版本内核中策略如此):
当多设备通过同一个公网出口访问同一台反向代理时,这台反向代理如果开启了timestamps校验和快速回收。如果有一台设备的时间比较大,而后续的时间新,会导致会拒绝连接。
当时号召大量人力及手机验证此问题,已经证实这个猜想是错误的。后续又证明了另外的三种猜测也是错误的,现在已经想不起来了,后续想到再补充。

当时唯一确认的是:当同一公网ip下仅有一个设备时,无法重现此问题。所以怀疑跟同公网出口ip使用多设备有关。

分类: 工作 标签: , , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.