编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 5.1如何排查网络故障
  • 5.2Charles抓包步骤&原理

5.1如何排查网络故障

目录介绍

  • 01.学会使用Ping工具
    • 1.1 Ping工具是什么
    • 1.2 Ping工具的用途
    • 1.3 Ping工具使用
    • 1.4 Ping诊断结果分析
    • 1.5 Ping常见案例
    • 1.6 Ping基础的原理
  • 02.用ifconfig查询网络
    • 2.1 ifconfig 是什么
  • 03.netstat和lsof
    • 3.1 netstat和lsof是什么
  • 04.HTTP应用排查工具
    • 4.1 应用层排查工具
    • 4.2 找到有问题服务端IP
    • 4.3 辅助排查网页慢问题
    • 4.4 解决失效Cookie
    • 4.5 查看证书的信息
  • 05.传输层排查工具
    • 5.1 路径可达性测试
    • 5.2 查看当前连接状况
    • 5.3 查看当前连接传输速率
    • 5.4 查看丢包和乱序等统计
  • 06.网络层排查工具
    • 6.1 查看网络路径状况
    • 6.2 查看路由
  • 07.数据链路层工具

01.学会使用Ping工具

1.1 Ping工具是什么

  • Ping工具是一种网络诊断工具,用于测试计算机或设备与目标主机之间的网络连接和延迟。
  • 它通过发送ICMP(Internet Control Message Protocol)回显请求消息(ping请求)到目标主机,并等待目标主机返回ICMP回显应答消息(ping应答)来测量往返时间(Round-Trip Time,RTT)和丢包率。

1.2 Ping工具的用途

  • 测试网络连接:通过向目标主机发送ping请求,可以确定计算机或设备与目标主机之间是否能够建立网络连接。如果目标主机返回ping应答,表示网络连接正常;如果没有应答,可能存在网络故障或目标主机不可达。
  • 测量延迟:通过计算ping请求和应答之间的往返时间(RTT),可以估计计算机或设备与目标主机之间的延迟。较低的延迟通常表示网络连接较好,而较高的延迟可能会影响网络性能和响应时间。
  • 检测丢包:通过比较发送的ping请求和接收到的ping应答数量,可以检测网络中的丢包情况。丢包率较高可能表示网络拥堵、连接不稳定或目标主机负载过高。

1.3 Ping工具使用

  • 通过输入ping命令加上目标主机的IP地址或域名来执行。
    • Ping工具还提供了一些可选参数,如设置ping请求的次数、超时时间、包大小等。
    • 按下Ctrl + C键组合。这将发送中断信号给正在运行的Ping进程,使其停止。
    PING ww1.sinaimg.cn.w.alikunlun.com (61.184.4.235): 56 data bytes
    64 bytes from 61.184.4.235: icmp_seq=0 ttl=64 time=18.723 ms
    64 bytes from 61.184.4.235: icmp_seq=1 ttl=64 time=16.442 ms
    64 bytes from 61.184.4.235: icmp_seq=2 ttl=64 time=11.551 ms
    64 bytes from 61.184.4.235: icmp_seq=3 ttl=64 time=12.709 ms
    64 bytes from 61.184.4.235: icmp_seq=4 ttl=64 time=11.804 ms
    64 bytes from 61.184.4.235: icmp_seq=5 ttl=64 time=10.068 ms
    64 bytes from 61.184.4.235: icmp_seq=6 ttl=64 time=10.179 ms
    64 bytes from 61.184.4.235: icmp_seq=7 ttl=64 time=12.532 ms
    64 bytes from 61.184.4.235: icmp_seq=8 ttl=64 time=12.161 ms
    ^C
    --- ww1.sinaimg.cn.w.alikunlun.com ping statistics ---
    9 packets transmitted, 9 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 10.068/12.908/18.723/2.700 ms
  • 使用 ping 命令探测了和新浪网的网络连通性。
    • 可以看到,每次显示是按照 sequence 序列号排序显示的,一并显示的,也包括 TTL(time to live),反映了两个 IP 地址之间传输的时间。
    • 最后还显示了 ping 命令的统计信息,如最小时间、平均时间等。

1.4 Ping诊断结果分析

  • 目标主机的IP地址:
    • Ping命令的结果通常会显示目标主机的IP地址。这可以帮助您确认您正在与正确的主机进行通信。
  • 往返时间(Round-Trip Time,RTT):
    • Ping命令会显示每个ping请求的往返时间,即从发送ping请求到接收到ping应答的时间。较低的RTT通常表示网络连接较好,而较高的RTT可能会影响网络性能和响应时间。
  • 丢包率:
    • Ping命令还会显示每个ping请求的丢包情况,即发送的ping请求中未收到ping应答的比例。较低的丢包率通常表示网络连接较稳定,而较高的丢包率可能表示网络拥堵、连接不稳定或目标主机负载过高。
  • 平均往返时间(Average RTT):
    • 通过分析多个ping请求的RTT,可以计算出平均往返时间。平均RTT可以提供一个更全面的网络连接质量评估,而不仅仅是单个ping请求的结果。
  • 最小和最大往返时间(Minimum和Maximum RTT):
    • Ping命令的结果还会显示多个ping请求中的最小和最大RTT值。这可以帮助您了解网络连接的变化范围和稳定性。

1.5 Ping常见案例

  • 案例1: 连接超时
    • 在这种情况下,Ping命令的结果显示了连续的超时错误。这表示所有的ping请求都未能接收到ping应答。
    • 这可能表示与目标主机之间的网络连接中断或目标主机不可达。可能的原因包括网络故障、目标主机关闭或防火墙设置阻止了ping请求。
    yangchongdeMBP:~ yangchong$ Ping 192.168.0.1
    PING 192.168.0.1 (192.168.0.1): 56 data bytes
    Request timeout for icmp_seq 0
    Request timeout for icmp_seq 1
    Request timeout for icmp_seq 2
  • 案例2: 高延迟和丢包
  • 案例1: 低延迟和无丢包

1.6 Ping基础的原理

  • ping 命令的原理到底是什么呢?它是基于 TCP 还是 UDP 开发的?
    • 都不是。ping 是基于一种叫做 ICMP 的协议开发的,ICMP 又是一种基于 IP 协议的控制协议,翻译为网际控制协议。
  • ICMP 在 IP 报文后加入了新的内容,这些内容包括:
    • 类型:即 ICMP 的类型, 其中 ping 的请求类型为 8,应答为 0。
    • 代码:进一步划分 ICMP 的类型, 用来查找产生错误的原因。
    • 校验和:用于检查错误的数据。
    • 标识符:通过标识符来确认是谁发送的控制协议,可以是进程 ID。
    • 序列号:唯一确定的一个报文,前面 ping 名字执行后显示的 icmp_seq 就是这个值。
  • 发起 ping 命令时,ping 程序实际上会组装成如图的一个 IP 报文。
    • 报文的目的地址为 ping 的目标地址,源地址就是发送 ping 命令时的主机地址,同时按照 ICMP 报文格式填上数据,在可选数据上可以填上发送时的时间戳。
    • IP 报文通过 ARP 协议,源地址和目的地址被翻译成 MAC 地址,经过数据链路层后,报文被传输出去。
    • 当报文到达目的地址之后,目的地址所在的主机也按照 ICMP 协议进行应答。
    • 之所以叫做协议,是因为双方都会遵守这个报文格式,并且也会按照格式进行发送 - 应答。
    • 应答数据到达源地址之后,ping 命令可以通过再次解析 ICMP 报文,对比序列号,计算时间戳等来完成每个发送 - 应答的显示,最终显示的格式就像前面的例子中展示的一样。

02.用ifconfig查询网络

2.1 ifconfig 是什么

  • ifconfig是一个用于配置和显示网络接口信息的命令行工具
    • ifconfig命令可以用来查看和配置网络接口的IP地址、子网掩码、广播地址、MAC地址等信息。
    • 它还可以启用或禁用网络接口,设置MTU(最大传输单元)大小,配置静态路由等。
  • 以下是一些常用的ifconfig命令选项和用法:
    • ifconfig:显示所有网络接口的信息。
    • ifconfig eth0:显示特定网络接口(如eth0)的信息。
    • ifconfig eth0 up:启用特定网络接口(如eth0)。
    • ifconfig eth0 down:禁用特定网络接口(如eth0)。
    • ifconfig eth0 192.168.0.10 netmask 255.255.255.0:为特定网络接口(如eth0)配置静态IP地址和子网掩码。
    • ifconfig eth0 hw ether 00:11:22:33:44:55:为特定网络接口(如eth0)配置MAC地址。
    • ifconfig eth0 mtu 1500:设置特定网络接口(如eth0)的MTU大小为1500字节。

03.netstat和lsof

3.1 netstat和lsof是什么

  • netstat和lsof
    • 都是用于查看系统网络连接和打开文件的命令行工具。
  • netstat(网络统计):
    • netstat命令用于显示网络连接、路由表和网络接口统计信息。它可以提供有关当前活动的网络连接、监听端口、网络接口的详细信息,以及网络连接的状态等。
    • netstat命令在不同操作系统上的选项和输出格式可能会有所不同。 一些常见的netstat命令选项和用法包括:
    netstat -a:显示所有活动的网络连接和监听端口。
    netstat -t:显示TCP协议相关的网络连接。
    netstat -u:显示UDP协议相关的网络连接。
    netstat -n:以数字形式显示IP地址和端口号,而不进行反向解析。
    netstat -p:显示与每个网络连接关联的进程ID(PID)和程序名称。
  • lsof(列出打开的文件):
    • lsof命令用于列出当前系统中打开的文件和网络连接。它可以显示哪些进程打开了哪些文件、网络连接和UNIX域套接字。lsof命令对于诊断和排查与文件相关的问题非常有用。
    • 一些常见的lsof命令选项和用法包括:
    lsof:显示所有打开的文件和网络连接。
    lsof -i:显示所有打开的网络连接。
    lsof -i :80:显示使用端口80的网络连接。
    lsof -p <PID>:显示特定进程ID(PID)打开的文件和网络连接。
    lsof /path/to/file:显示打开指定文件的进程。

04.HTTP应用排查工具

4.1 应用层排查工具

  • 现在主流的浏览器是 Google 的 Chrome,它本身就内置了一个开发者工具。
    • 在 Chrome 界面里按下 F12,或者你是苹果系统的话,还可以按下组合键 option + command + I,启动开发者工具。

4.2 找到有问题服务端IP

  • 比如有用户报告死活访问不了你的网站,但是你很清楚这个网站的域名对应了很多 IP 地址,你怎么知道用户连的是哪个 IP 呢?
    • 你可以这样做:让客户启用开发者工具,在 Network 页找到主页对象,在它的 Headers 部分,就能看到 Remote address,这里的 IP 就是当前连接的 IP,比如下面这样:
    • 因为 DNS 解析的关系,你很可能下次重连就不是这个 IP 了,所以每次都应该重新确认一下这个信息。
    • image
      image
  • 这个技巧,在排查公网的访问问题的时候特别有用。
    • 要知道,现在流量大一点的网站都已经上了 CDN,那就必然在全国乃至全球各地,有少则数十个、多则数百个 CDN 终端节点,在给访问者提供就近的服务。
    • 如果有人说他访问不了某个站点了,那么请一定让他用开发者工具,找到他连的远程 IP,然后你再根据这个信息展开排查工作。

4.3 辅助排查网页慢问题

  • 访问页面感觉很慢,那么可以借助开发者工具的时间统计功能,找到耗时较高的 HTTP 资源对象,再针对性排查。
    • 比如我觉得访问https://github.com很慢,那么可以先打开开发者工具,然后访问站点,等全部加载完成后,到 Network 页查看这些 HTTP 对象的加载时间。
    • 这个办法只能排查到是哪个资源对象耗时比较长,但更进一步的排查,比如“为什么这个对象的加载时间比别的对象长”这个问题,开发者工具就难以回答了。
    • image
      image

4.4 解决失效Cookie

  • 有时候我们的 Cookie 过期了,导致无法正常登录站点
    • 那么可以打开开发者工具,到 Application 页,找到 Storage -> Cookie,把对应的条目清除。
    • 这样下次你再访问这个站点,就已经“洗心革面”了。对站点来说,你就是一次新的访问,可以生成一次新的 Cookie 了。
  • 当然,你通过删除浏览器缓存的方式,也是可以做到这一点的。
    • 但开发者工具的优点是,可以细粒度到这个网站级别,而删除缓存的方式,删除的就是所有站点的 Cookie 了,这未必是你想要的。

4.5 查看证书的信息

  • 为了对 TLS 的问题进行排查
    • 使用开发者工具的 Security 菜单,还可以查看更为详细的 TLS 信息,包括协议版本、密钥交换算法、证书有效期等等。
    • image
      image

05.传输层排查工具

5.1 路径可达性测试

  • 如果我们要测试 TCP 握手,有 telnet、nc 这两个常规工具。比如 telnet:
    yangchongdeMBP:~ yangchong$ telnet www.baidu.com 443
    Trying 180.101.49.12...
    Connected to www.a.shifen.com.
    Escape character is '^]'.
  • 用 nc 呢,可以这样:
    yangchongdeMBP:~ yangchong$ nc -w 2 -zv www.baidu.com 443
    Connection to www.baidu.com port 443 [tcp/https] succeeded!

5.2 查看当前连接状况

  • netstat 命令是一个经典命令了,很多同学都会使用它来获取当前的 TCP、UDP 等的连接信息,比如:
    yangchongdeMBP:~ yangchong$ netstat -ant
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
    tcp4       0      0  192.168.8.134.52678    124.237.176.160.443    ESTABLISHED
    tcp4       0      0  192.168.255.10.52677   124.237.176.160.443    ESTABLISHED
    tcp4       0      0  192.168.8.134.52495    183.47.99.119.443      ESTABLISHED
    tcp4       0      0  192.168.255.10.52494   183.47.99.119.443      ESTABLISHED
    tcp4       0      0  192.168.8.134.52441    183.47.99.119.443      ESTABLISHED
    tcp4       0      0  192.168.8.134.52438    183.47.99.119.443      ESTABLISHED
    tcp4       0      0  192.168.255.10.52437   183.47.99.119.443      ESTABLISHED
    tcp4       0      0  127.0.0.1.42103        127.0.0.1.52308        ESTABLISHED
    tcp4       0      0  127.0.0.1.52308        127.0.0.1.42103        ESTABLISHED

5.3 查看当前连接传输速率

5.4 查看丢包和乱序等统计

06.网络层排查工具

6.1 查看网络路径状况

6.2 查看路由

  • 01 | 网络模型和工具:网络为什么要分层?
    • https://blog.csdn.net/qq_37756660/article/details/133521069
  • 03 | 握手:TCP连接都是用TCP协议沟通的吗?
    • https://blog.csdn.net/qq_37756660/article/details/133523158
  • 05 | 定位防火墙(一):传输层的对比分析
    • https://blog.csdn.net/qq_37756660/article/details/133526241
  • 08 | 工欲善其事必先利其器:学会使用各种工具
    • https://blog.csdn.net/qq_37756660/article/details/133869405
贡献者: yangchong211
下一篇
5.2Charles抓包步骤&原理