Android MTU影响Http请求post timeout 问题

起因

客服上报有个别用户上传图片超时的情况,到访用户家发现,手机上的APP可以正常上传,但是我们设备上就会失败,而回到公司,同样的设备就不复现。

分析过程

在现场抓了tcpdump回来后分析,发现有超大数据包的发送,以及包丢弃的现象。最后查找发现与MTU有关

trinket:/proc/sys/net/ipv4 # cat ip_no_pmtu_disc
0
trinket:/proc/sys/net/ipv4 # cat tcp_mtu_probing 
0
trinket:/proc/sys/net/ipv4 #

tcp_mtu_probing - INTEGER
是否开启 MTU 探测功能(即 PLPMTUD Packetization-Layer Path MTU Discovery)
0: 关闭(默认值)
1: 默认关闭,在检测到 IMCP 黑洞问题时开启
2: 始终开启,使用 tcp_base_mss 作为初始值
注:PLPMTUD 机制在 tcp_base_mss 做了简单介绍
想要启用tcp mtu probe, 先要设置ip_no_pmtu_disc=0(默认值), 表示启用pmtu discovery, 这样tcp发送的时候才会设置DF标记。
通过DF标记,中间路由设备如果需要分片就会返回ICMP消息通知, 但是有可能因为防火墙等原因,发送方收不到ICMP消息,因此发送方一直发送探测包,却一直没收到回应, 这个就称为black hole。
tcp_mtu_probe=1, 表示默认禁用mtu,只有当检测到black hole的时候,才会开启tcp mtu probe。
tcp_mtu_probe=2, 表示一直开启tcp mtu probe。并且以tcp_base_mss 作为初始值,查一下我们设备的tcp_base_mss值,是1024,也就是说,刚开始会以1024发送,逐渐爬坡。

方案一:

tcp_mtu_probe 设置2,一劳永逸。

方案二:

 //packages/modules/NetworkStack/src/android/net/ip/IpClient.java
 1099  if (mDhcpResults.mtu != 0) {
 1100      newLp.setMtu(mDhcpResults.mtu);
 1101    }

在这写死一个值,比如我们分析tcpdump 1320应该就可以过去。不过这种方式比较简单粗暴,它会影响上下行的速度。

参考文章:
https://blog.csdn.net/michaelwoshi/article/details/126924358
https://lotabout.me/2021/Linux-TCP-Options/#tcp-base-mss-integer

你可能感兴趣的:(Android,Framework开发,http,网络,网络协议)