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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值