排查网络问题
本文介绍一些工具,这些工具可诊断各种复杂性的网络问题。 这些问题包括各种情况,例如对服务的意外响应值进行故障排除,以及查明导致连接关闭异常的根本原因。
对于客户端故障排除,适用于 Java 的 Azure 客户端库提供了一套一致且强大的日志记录机制,如在 Azure SDK for Java 中配置日志记录所描述。 但是,客户端库通过各种协议进行网络调用,这可能会导致故障排除方案扩展到提供的故障排除范围之外。 出现这些问题时,解决方法是使用本文中所述的外部工具来诊断网络问题。
琴师
Fiddler 是一种 HTTP 调试代理,允许按原样记录通过它的请求和响应。 捕获的原始请求和响应可帮助你排查服务收到意外请求或客户端收到意外响应的情况。 若要使用 Fiddler,需要使用 HTTP 代理配置客户端库。 如果使用 HTTPS,则需要额外的配置来检查解密的请求和响应正文。
添加 HTTP 代理
若要添加 HTTP 代理,请按照 azure SDK for Java中配置代理 localhost
。
启用 HTTPS 解密
默认情况下,Fiddler 只能捕获 HTTP 流量。 如果应用程序使用 HTTPS,则必须采取额外的步骤来信任 Fiddler 的证书,以允许它捕获 HTTPS 流量。 有关详细信息,请参阅 Fiddler 文档中 HTTPS 菜单。
以下步骤演示如何使用 Java 运行时环境(JRE)信任证书。 如果证书不受信任,则通过 Fiddler 的 HTTPS 请求可能会失败并显示安全警告。
导出 Fiddler 的证书。
查找 JRE 的密钥工具(通常位于 jre/bin中)。
查找 JRE 的 cacert(通常位于 jre/lib/security中)。
打开 Bash 窗口并使用以下命令导入证书:
sudo keytool -import -file <location-of-Fiddler-certificate> -keystore <location-of-cacert> -alias Fiddler
输入密码。
信任证书。
Wireshark
Wireshark 是一种网络协议分析器,可以捕获网络流量,而无需更改应用程序代码。 Wireshark 是高度可配置的,可以捕获广泛到特定的低级别网络流量。 此功能在故障排查情境中非常有用,例如远程主机关闭连接或操作过程中断开连接。 Wireshark GUI 使用用于标识唯一捕获事例(例如 TCP 重新传输、RST 等)的配色方案显示捕获。 您还可以在捕获时或分析期间对捕获结果进行筛选。
配置捕获筛选器
捕获筛选器可减少捕获用于分析的网络调用数量。 如果没有捕获筛选器,Wireshark 将捕获通过网络接口的所有流量。 此行为可能会产生大量数据,其中大部分可能对调查而言是无用信息。 使用捕获筛选器有助于抢先确定要捕获的网络流量的范围,以帮助确定调查目标。 有关详细信息,请参阅 Wireshark 文档中的捕获实时网络数据。
以下示例添加一个捕获筛选器,用于捕获发送到特定主机或从特定主机接收的网络流量。
在 Wireshark 中,导航到“捕获”>“捕获筛选器...”,然后添加一个值为 host <host-IP-or-hostname>
的新筛选器。 此筛选器仅捕获传入和传出该主机的流量。 如果应用程序与多个主机通信,可以添加多个捕获筛选器,或者可以使用“OR”运算符添加主机 IP/主机名,以提供松散的捕获筛选。
捕获到磁盘
你可能需要长时间运行应用程序来重现意外的网络异常,并观察导致异常发生的流量。 此外,可能无法在内存中存储所有捕获内容。 幸运的是,Wireshark 可以将捕获记录到磁盘,以便它们可用于后期处理。 此方法可避免在重现问题时内存不足的风险。 有关详细信息,请参阅 Wireshark 文档中 文件输入、输出和打印。
以下示例将设置 Wireshark,从而以多个文件的形式将捕获内容永久保存到磁盘(即在捕获次数达到 100k 或文件大小达到 50 MB 时拆分文件)。
在 Wireshark 中,导航到 捕获 > 选项,找到 输出 选项卡,然后输入要使用的文件名。 此配置会导致 Wireshark 将捕获保存到单个文件。
若要启用捕获到多个文件的功能,请选择“自动创建新文件”,然后选择“在 100000 个数据包后”和“在 50 兆字节后”。 此配置使 Wireshark 在匹配其中一个谓词时创建新文件。 每个新文件使用与输入的文件名相同的基名称,并追加唯一标识符。
如果要限制 Wireshark 可以创建的文件数,请选择 使用带 X 文件的环形缓冲区。 此选项将 Wireshark 限制为仅使用指定数量的文件进行日志记录。 当文件数达到该值时,Wireshark 开始覆盖文件,从最早的文件开始。
筛选捕获
有时,无法严格限制 Wireshark 捕获的流量,例如,如果应用程序使用各种协议与多个主机通信。 在这种情形下,通常使用前面描述的持久捕获方式,在网络捕获后更容易进行分析。 Wireshark 支持使用类似筛选器的语法来分析捕获。 有关详细信息,请参阅 Wireshark 文档中的处理捕获的数据包。
以下示例在 ip.src_host==<IP>
上加载持久捕获文件和筛选器。
在 Wireshark 中,导航到“文件”>“打开”,然后从之前使用的文件位置加载已永久保存的捕获。 在菜单栏下加载文件后,将显示筛选输入框。 在筛选器输入中,输入 ip.src_host==<IP>
。 此筛选器限制捕获视图,以便仅显示源来自具有 IP <IP>
主机的捕获。
后续步骤
本文介绍如何使用各种工具诊断使用适用于 Java 的 Azure SDK 时的网络问题。 熟悉高级使用方案后,可以开始探索 SDK 本身。 要了解可用的 API 的更多信息,请参阅 Azure SDK for Java 库。