为什么 Android 丢弃 TCP 数据包发生在 droid 5.x 中,而不是 4.x 中?

2023-12-21

我有一部 Android 智能手机,通过 WIFI 连接到嵌入式 AP。我正在使用 Linux 上运行 Tshark 的笔记本电脑嗅探 WIFI 流量。我每 100 毫秒传输小(234 字节)TCP 数据包 5 次,然后是 500 毫秒,没有数据。数据包将定期被忽略,从而强制重新传输。通过 TCP 套接字传输数据时,预计会出现一定程度的数据包重传,但这已经过多了。特别是因为嗅探器毫无问题地接收了数据包(即,没有“飞行中”损坏),并且后续重新传输的数据包也会被 android 忽略(丢弃)。

请注意:当我说“忽略”时,我的意思是我没有看到any来自接收无线电 (802.11 ACK) 或来自 Wireshark 跟踪中的接收 TCP 堆栈 (TCP ACK) 的确认。下图中,数据包599立即被确认,而下一个数据包(606)被忽略,接下来的四次重传(607-610)也是如此。

Wireshark日志 https://i.stack.imgur.com/ElUCh.png

在 Android v4.x(已测试 4.0.4 和 4.2.2)上运行的相同 APK 以及在 iOS 上运行的类似应用程序上都不会发生这种情况。在这两种情况下,都会出现预期丢弃的 TCP 数据包,然后重传,但几乎总是立即得到确认。

由于我正在传输的数据包没有什么特别之处,并且 TCP 数据包的无缝重传有望在某种程度上解决数据包丢失问题,因此我怀疑许多应用程序都遇到了同样的问题,但只是接受总体传输速率的降低,归因于传输速度较慢为“WIFI拥塞”。

就我而言,WIFI 硬件/固件解决方案(由第三方提供)因 TCP 积压过多而堵塞。他们有一个带有创可贴修复的新解决方案,似乎有助于恢复,但这并不能解决现场已有硬件的问题。

我相信在 android 5.x 下发生了一些变化,例如无线电会定期关闭或移出频道。由于它似乎定期发生,我认为这可能是由于信道扫描造成的(期望在扫描间隔期间丢失的任何数据包都将在无线电返回时通过重传来恢复)。我无法找到 Android 通道扫描行为的明确定义(我有一篇单独的文章对此进行了阐述)。

当失败时,将以 4 或 5 个数据包的突发形式重传,中间间隔几毫秒,然后 1 秒内没有任何内容,然后是另一个突发。通常,重传的数据包会被忽略一段时间(可能是几秒)。最终,重传数据包得到确认,并继续传输下一个数据包。

我注意到还发生了定期的 DNS 探测(下面是通过 DNS 查询定期探测的 URL 列表)。有些可能是已安装的应用程序,而另一些可能是操作系统(例如,“connectivitycheck.android.com”可能会用于验证 AP 是否确实提供互联网连接,但在我的情况下则不提供)。

    android.clients.google.com  
    android.googleapis.com  
    clients3.google.com  
    cmdts.ksmobile.com  
    connectivitycheck.android.com  
    graph.facebook.com  
    mtalk.google.com  
    px.demdex.net  
    weather.ksmobile.com  

px.demdex.net 条目引起了我的注意,因为我不知道它代表谁。原来是Adobe。由于明显有一些我不知道的代码在主动探测,并且为了确保我的问题纯粹是 Android 问题,我将 Nexus 4 智能手机恢复出厂设置,并拒绝任何可能与 WIFI 通信问题有关的初始化选项(例如例如 Google 位置服务,即使关闭时也允许使用 WIFI 等)。 TCP 数据包仍然被丢弃。

在android方面,我有: - 将位置设置为“仅限设备”(GPS) - 禁用 WIFI“扫描始终可用” - 每当套接字打开时,就在应用程序内获取“WIFI_MODE_FULL_HIGH_PERF”锁。 - 当应用程序开始通信时套接字打开,并保持打开状态直到应用程序关闭。如果一段时间内没有数据包出现(当前为 3 秒),应用程序将关闭套接字并打开一个新套接字,以尝试强制重新建立通信。

我发现了 IWifiManager 的“setAllowScansWithTraffic()”函数,听起来它会给我扫描的明确控制(从列表中删除这种可能性),但似乎实现这个会很困难,并且不能成为我的一部分应用程序 (?)。我相信 IWifiManager 为 android 实现者提供了一个存根来构建他们自己的 WIFI 管理器(操作系统)服务,并且它不打算在应用程序级别使用。

我将不胜感激任何意见/建议。

UPDATE

在寻找“通道扫描”可能性时,我用数据包嗅探器在 WIFI 通道 3 上记录了 ACK 数据包,而被测硬件在 WIFI 通道 8 上运行。这可以解释丢失的 ACK - 它们是在错误的 WIFI 通道上发送的。我已经开了一个安卓错误 https://code.google.com/p/android/issues/detail?id=189016


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Android 丢弃 TCP 数据包发生在 droid 5.x 中,而不是 4.x 中? 的相关文章

  • IntentService、Service 或 AsyncTask

    实现这一点的最佳方法是什么 我有一个 Android 应用程序 它将使用我的 python 服务器来允许两部手机之间进行轮流通信 回合意味着他们在一轮开始之前不能互相交谈 一旦他们发送一条消息 他们就不能发送另一条消息 直到对方做出回应 然
  • 在Android内存中存储gif图像

    我对安卓还很陌生 我想将图像保存到内存中 然后从内存中检索图像并将其加载到图像视图中 我已使用以下代码成功将图像存储在内存中 void saveImage String fileName img cnt jpg File file new
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • 从 sockaddr_storage 检索 ip 和端口

    我有一个sockaddr storage包含远程主机的 ipv4 地址和端口 我没见过这些struct但之前我不知道如何将它转换成struct我可以直接检索IP地址和端口号 我尝试过谷歌搜索struct但还没有发现任何东西 关于如何执行此操
  • 如何更改对话框的默认黑色暗淡背景“颜色”(而不是暗淡量)?

    这是随机显示的图像Dialog在网上找到的 我一直在实施一个自定义Dialog 我可以处理对话框上的几乎所有内容 除了对话框本身下方的默认黑色昏暗背景之外 但在其后面的整个屏幕上 基本上我想改变它color和阿尔法值 我一直在 StackO
  • Android 导航回到 Activity;不要重新加载父级

    我有一个场景 我单击 ListFragment 并启动一个新的 Activity 如下所示 public void onListItemClick ListView l View v int position long id super o
  • 如何找到特定路线上两点之间的距离?

    我正在为我的大学开发一个 Android 应用程序 可以帮助学生跟踪大学巴士的当前位置 并为他们提供巴士到达他们的预计时间 截至目前 我获取了公交车的当前位置 通过公交车上的设备 和学生的位置 我陷入了必须找到两个 GPS 坐标之间的距离的
  • 仅在 Android 应用程序中使用 XHDPI 可绘制对象?

    如果您计划在不久的将来支持 LDPI MDPI HPDI 或许还有 XHDPI 那么是否可以在项目中仅包含 XHDPI 可绘制对象并让设备将其缩放到所需的分辨率 我已经测试过在 Photoshop 中将可绘制对象的大小调整为 MDPI 和
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • Kotlin 和惯用的书写方式,基于可变值“如果不为空,则...”

    假设我们有这样的代码 class QuickExample fun function argument SomeOtherClass if argument mutableProperty null doSomething argument
  • 使用 DiffUtil 在 RecyclerView 上添加拖放

    我有一个从房间数据库更新的列表 我从 Room 收到更新的数据作为新列表 然后将其传递给列表适配器 https developer android com reference androidx recyclerview widget Lis
  • Proguard - 找不到任何超级类

    我收到此错误 Unexpected error while performing partial evaluation Class org apache log4j chainsaw Main Method
  • Ruby on Rails:如何使用 TCP 套接字连接 GPS 设备

    ruby 2 3 0p0 2015 12 25 修订版 53290 x86 64 linux 轨道 4 2 4 我正在使用 cloud9 IDE 和 webrick 服务器 我的项目是实时跟踪GPS 我想使用TCP连接与GPS跟踪设备进行通
  • popupBackground 与 Material Design 相关的问题

    我一直致力于将我的应用程序更新为 Material Design 我有一个使用选项卡的应用程序 由于某种原因 每当我使用 android popupBackground 设置下拉菜单颜色时 它就会崩溃 我设置了一个带有选项卡的默认项目并使用
  • Android - 正确使用 invalidateOptionsMenu()

    我一直在寻找很多invalidateOptionsMenu 我知道它的作用 但我想不出这种方法在现实生活中有用的任何例子 我的意思是 例如 假设我们要添加一个新的MenuItem to our ActionBar 我们可以简单地获取菜单on
  • InAppMessage 一旦显示就会自动消失

    您好 我最近将 InAppMessaging 添加到我的项目中 这似乎很容易集成 但对我来说并没有按预期工作 首先 我将其添加到 build gradle 中 implementation com google firebase fireb
  • firebase中按范围查询

    我有一个食品价格范围滑块 根据滑块的最小值和最大值 我想显示此范围内的食品 滑块代码 multiSlider setOnThumbValueChangeListener new MultiSlider SimpleChangeListene
  • 如何使用 VB.NET 打开受密码保护的共享网络文件夹?

    我需要在网络上打开受密码保护的共享文件夹才能访问 Access 97 数据库 如何打开文件夹并输入密码 在这里找到http www mredkj com vbnet vbnetmapdrive html http www mredkj co
  • 画布:尝试使用回收的位图错误

    我是一个相当新的程序员 所以任何建议将不胜感激 我有一个类 每次调用它时都会在循环中运行 AsyncTask AsyncTask 看起来像这样 public class LoadImageTask extends AsyncTask
  • 在DialogFragment中,onCreate应该做什么?

    我目前正在摆弄 DialogFragment 以学习使用它 我假设相比onCreateView onCreate 可以这样做 public void onCreate Bundle savedInstanceState super onCr

随机推荐