对于 Android 应用开发,免不了进行网络通信,其中,大大小小都有涉及到套接字的使用,(Ps:对于通信方面尽量使用 Netty 框架能缩短业务逻辑实现的周期)但使用不当往往会出现各种问题。例如:TCP 的粘包、拆包问题;TCP 连接丢失问题等。但如果经验不够或者涉及到底层的问题该怎么办呢?这时候可以利用抓包去尝试定位问题。当然,对于计算机网络的一些基础问题是前置技能,这里不再概述,本文主要介绍抓包的大致思路。
抓包,顾名思义就是获取网络通信的报文。众所周知,一个 PC 想要连接上互联网必须要有网卡以及相应的配置。换句话说,只要我们能拦截网卡或者路由器的消息并加以解析就能得到一定的信息。大部分的抓包工具都是基于这个思路,挂载到网卡上去嗅探数据包,简称抓包。
PC 上的工具五花八门,这里主要介绍 Android 上如何抓包。首先,Android是基于 Linux 的系统,Linux上抓包,我们需要去下载一个 tcpdump 的文件,但这个工具基本Linux上都有。
如果你开发的 Android 是嵌入式设备的系统,那么极有可能这个系统被裁剪过。此时可以利用 Android Studio 的调试栏把 tcpdump 传到 Android 中,之后通过 adb shell 进入Linux命令行,然后 根据 tcpdump 的命令进行抓包,例如:『tcpdump -i any -p -s 0 -w /tmp/netCapture.pcap』表示把所有包抓取并存到「/tmp」目录下,然后把这个.pcap文件下载到本地进行分析。
但如果你遇到一个第三方设备,并且不是 Android 设备而是纯 Linux 系统的嵌入式设备,此时可以通过工具 xshell 进行访问,当然你需要有 ip+端口+账号+密码。(注意:如果是 Telnet 的协议可能连接没 ssh 协议快)剩下的抓包操作和 Android 设备一样。最后,抓包文件可以通过 ftp 传出来,但前提是要开启 ftp 的服务,否则就要去手动开启,配置相应的文件,具体移步 Linux 教程。
对于分析就是常规的计算机网络的知识,例如:套接字连接可以看 TCP 的部分,其中三次握手,四次挥手表示连接的建立和断开。注意对于一个服务套接字启动监听后,运输层就开始不断接收握手,这一块 Java 的 Socket API无法控制,不要混淆了,并不是说你不执行 socket.accept 底层就不进行握手了。
wireshark 工具,主流,免费。