排查网络问题

本文介绍一些可诊断各种复杂网络问题的工具。 这些问题包括各种场景,从排查服务中的意外响应值,到排查导致连接关闭异常的根本原因。

对于客户端故障排除,适用于 Java 的 Azure 客户端库提供一致可靠的日志记录情景,如在 Azure SDK for Java 中配置日志记录中所述。 但是,客户端库会通过各种协议进行网络调用,这可能会导致故障排除方案超出所提供的故障排除范围。 发生这些问题时,解决方案是使用本文中所述的外部工具来诊断网络问题。

Fiddler

Fiddler 是一个 HTTP 调试代理,允许通过它传递的请求和响应按原样记录。 捕获的原始请求和响应有助于你排查服务收到意外请求或客户端收到意外响应的情况。 若要使用 Fiddler,需要使用 HTTP 代理配置客户端库。 如果使用 HTTPS,则需要额外的配置来检查解密的请求和响应正文。

添加 HTTP 代理

若要添加 HTTP 代理,请按照在 Azure SDK for Java 中配置代理中的指南进行操作。 请务必在端口 8888 上使用默认 Fiddler 地址 localhost

启用 HTTPS 解密

默认情况下,Fiddler 只能捕获 HTTP 流量。 如果应用程序使用 HTTPS,则必须采取额外的措施来信任 Fiddler 的证书,使其能够捕获 HTTPS 流量。 有关详细信息,请参阅 Fiddler 文档中的 HTTPS Menu(HTTPS 菜单)。

以下步骤演示如何使用 Java 运行时环境(JRE)信任证书。 如果证书不受信任,则通过 Fiddler 的 HTTPS 请求可能会失败并显示安全警告。

  1. 导出 Fiddler 的证书。

  2. 查找 JRE 的密钥工具(通常位于 jre/bin 中)。

  3. 查找 JRE 的 cacert(通常以 jre/lib/security 为单位)。

  4. 打开 Bash 窗口并使用以下命令导入证书:

    sudo keytool -import -file <location-of-Fiddler-certificate> -keystore <location-of-cacert> -alias Fiddler
    
  5. 输入密码。

  6. 信任证书。

Wireshark

Wireshark 是一种网络协议分析器,无需更改应用程序代码即可捕获网络流量。 Wireshark 具有高度可配置性,可以捕获广泛的到特定的、低级别的网络流量。 此功能适用于诸如远程主机关闭连接或在操作过程中关闭连接之类的故障排除场景。 Wireshark GUI 使用一种配色方案来显示捕获,该方案可标识唯一捕获事例(如 TCP 重新传输、RST 等)。 你还可以在捕获或分析期间筛选捕获。

配置捕获筛选器

捕获筛选器可减少为分析捕获的网络调用的数量。 如果没有捕获筛选器,Wireshark 将捕获通过网络接口的所有流量。 此行为可能会生成大量数据,其中大部分数据可能会对调查产生干扰。 使用捕获筛选器有助于提前确定要捕获的网络流量的范围,以帮助确定调查目标。 有关详细信息,请参阅 Wireshark 文档中的 Capturing Live Network Data(捕获实时网络数据)。

以下示例添加了一个捕获筛选器,用于捕获发送到特定主机或从特定主机接收的网络流量。

在 Wireshark 中,导航到 “捕获 > 捕获筛选器...” ,并添加新的筛选器和值 host <host-IP-or-hostname>。 此筛选器仅捕获传入和传出该主机的流量。 如果应用程序与多个主机通信,则可添加多个捕获筛选器,也可通过“OR”运算符添加主机 IP/主机名,以提供更松散的捕获筛选。

捕获到磁盘

你可能需要长时间运行一个应用程序来重现意外的网络异常,并查看导致此异常的流量。 此外,你可能无法在内存中保留所有捕获。 幸运的是,Wireshark 可以将捕获记录到磁盘,以便它们可用于后期处理。 此方法可避免在重现问题时耗尽内存的风险。 有关详细信息,请参阅 Wireshark 文档中的 File Input, Output, And Printing(文件输入、输出和打印)。

以下示例将 Wireshark 设置为将捕获保存到包含多个文件的磁盘,其中文件在 100k 捕获或 50 MB 大小上拆分。

在 Wireshark 中,导航到“ 捕获 > 选项 ”并找到 “输出 ”选项卡,然后输入要使用的文件名。 此配置会导致 Wireshark 将捕获保存到单个文件。

若要使用多个文件保存捕获,请选择“自动创建新文件”,然后选择“100000 个数据包后”和“50 兆字节后”。 此配置使 Wireshark 在匹配其中一个谓词时创建新文件。 每个新文件使用与输入的文件名相同的基名称,并追加唯一标识符。

如果要限制 Wireshark 可创建的文件数,请选择“使用带有 X 个文件的环形缓冲区”。 此选项将 Wireshark 限制为仅使用指定数量的文件进行日志记录。 达到该文件数后,Wireshark 开始覆盖文件,从最早开始。

筛选捕获

有时,无法严格限定 Wireshark 捕获的流量的范围,例如,如果应用程序使用各种协议与多个主机通信。 在此方案中,通常使用前面概述的持久捕获,在网络捕获后更容易运行分析。 Wireshark 支持使用类似于筛选器的语法来分析捕获。 有关详细信息,请参阅 Wireshark 文档中的 Working With Captured Packets(处理捕获的数据包)。

以下示例加载持久捕获文件和筛选器 ip.src_host==<IP>

在 Wireshark 中,导航到 “文件 > 打开 ”,并从之前使用的文件位置加载持久捕获。 在菜单栏下加载文件后,将显示筛选器输入。 在筛选器输入中,输入 ip.src_host==<IP>。 此筛选器限制捕获视图,以便仅显示源来自 IP 的主机的 <IP>捕获位置。

后续步骤

本文介绍如何使用各种工具诊断使用适用于 Java 的 Azure SDK 时的网络问题。 现在你已熟悉概要使用方案,接下来可以开始探索 SDK 本身。 有关可用 API 的详细信息,请参阅 Azure SDK for Java 库