4

我正在寻找从 WiFi 网络读取数据包丢失计数器的方法。

它应该通过adb shellJavaC (NDK)或您的方式

安卓没有root。

我有一个接入点,我在其中使用服务配置了 2% 的丢包率Dummynet

我使用wget来自 PC 的命令并从本地服务器下载 50 Mb 文件(LAN 的带宽应为 100Mb)。我看到丢包配置带宽从 100Mb 减少到 3Mb 后,这意味着一切正常。

到目前为止,一切都很好,

我的设备(Android)通过 WiFi 连接到上述 AP。

我尝试下载相同的 50 Mb 文件,下载速率为 3M,但我没有看到任何错误或重传计数器上升。

我使用adb shellCLI 并输入到:sys/class/net/eth0/statistics我看到的位置:

-r--r--r-- root     root         4096 2012-12-04 15:42 rx_packets
-r--r--r-- root     root         4096 2012-12-04 15:42 tx_packets
-r--r--r-- root     root         4096 2012-12-04 15:41 rx_bytes
-r--r--r-- root     root         4096 2012-12-04 15:41 tx_bytes
-r--r--r-- root     root         4096 2012-12-04 15:43 rx_errors
-r--r--r-- root     root         4096 2012-12-04 15:43 tx_errors
-r--r--r-- root     root         4096 2012-12-04 15:43 rx_dropped
-r--r--r-- root     root         4096 2012-12-04 15:43 tx_dropped
-r--r--r-- root     root         4096 2012-12-04 15:43 multicast
-r--r--r-- root     root         4096 2012-12-04 15:43 collisions
-r--r--r-- root     root         4096 2012-12-04 15:43 rx_length_errors
-r--r--r-- root     root         4096 2012-12-04 15:43 rx_over_errors
-r--r--r-- root     root         4096 2012-12-04 15:43 rx_crc_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 rx_frame_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 rx_fifo_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 rx_missed_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 tx_aborted_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 tx_carrier_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 tx_fifo_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 tx_heartbeat_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 tx_window_errors
-r--r--r-- root     root         4096 2012-12-04 15:38 rx_compressed
-r--r--r-- root     root         4096 2012-12-04 15:38 tx_compressed

所以我运行cat *并获取除 4 之外的所有上述 0 值的文件:

tx/rx_packets/bytes是活动的,这意味着我使用写接口:

cat rx_packets
9106

如果任何知道其他方法来检测数据包丢失或以编程方式获取它,将不胜感激

4

2 回答 2

3

除非我弄错了你的要求。如果您连接到与移动设备相同的网络,则可以使用wireshark。

或者你可以做一个tcpdump,然后通过wireshark分析得到丢包。

这里有一堆可能对你有帮助的链接。

http://dennismillerdev.wordpress.com/2011/02/03/debug-network-activity-in-android-using-wireshark/ http://mobile.tutsplus.com/tutorials/android/analyzing-android-network-流量/ 在wireshark上捕获手机流量

如果您只是尝试进行通用连接测试。您可以尝试简单地将一系列 UDP 数据包发送到服务器,该服务器回显相同的数据包作为响应。有一个单独的线程同时运行,它试图从服务器接收这些数据包。如果您想进行其他测量,请记录时间戳,但如果返回的数据包少于发送的数据包,您就会知道丢失了多少数据包。如果你给数据包一个 1 字节的有效载荷,其中包含一个 id。(即:发送 20 个 id 为 1-20 的数据包),然后当您从服务器收到数据包时,您可以检查有效负载并查看哪些数据包丢失和/或乱序。

除此之外,您在没有植根手机的情况下受到限制。您可以使用 TrafficStats 获取发送的数据包数getTotalRxPackets()getTotalTxPackets()以获取发送/接收的总数据包。或者,如果您使用更高级别的 API,您甚至可以获得每个应用程序的 UDP 数据包数量。因此,您可以找到发送和接收但未丢失的数据包数量。

如果您知道设备发送了多少数据包,并且在服务器端检测到来自该设备的数据包数量,那么差异也应该有助于您了解丢失数据包的数量。(此方法需要您控制服务器并涉及更多设备-服务器通信)

希望这会有所帮助。

于 2012-12-13T00:05:35.317 回答
2

我认为,您需要的计数器在 /proc/net/netstat 文件中。

于 2012-12-14T14:00:34.020 回答