FantasticMao 技术笔记
BlogGitHub
  • README
  • C & Unix
    • C
      • 《C 程序设计语言》笔记
      • C 语言中的陷阱
      • CMake 示例
      • GNU make
      • LLVM Clang
      • Nginx 常用模块
      • Vim 常用命令
    • Unix-like
      • 《深入理解计算机系统》笔记
      • 《UNIX 环境高级编程》笔记 - UNIX 基础知识
      • 《UNIX 环境高级编程》笔记 - 文件 IO
      • 《UNIX 环境高级编程》笔记 - 标准 IO 库
      • 《鳥哥的 Linux 私房菜》笔记 - 目录配置
      • 《鳥哥的 Linux 私房菜》笔记 - 认识与学习 bash
      • 《鳥哥的 Linux 私房菜》笔记 - 任务管理
      • OpenWrt 中的陷阱
      • iptables 工作机制
  • Go
    • 《A Tour of Go》笔记
    • Go vs C vsJava
    • Go 常用命令
    • Go 语言中的陷阱
  • Java
    • JDK
      • 《Java 并发编程实战》笔记 - 线程池的使用
      • 设计模式概览
      • 集合概览
      • HashMap 内部算法
      • ThreadLocal 工作机制
      • Java Agent
    • JVM
      • 《深入理解 Java 虚拟机》笔记 - Java 内存模型与线程
      • JVM 运行时数据区
      • 类加载机制
      • 垃圾回收算法
      • 引用类型
      • 垃圾收集算法
      • 垃圾收集器
    • Spring
      • Spring IoC 容器扩展点
      • Spring Transaction 声明式事务管理
      • Spring Web MVC DispatcherServlet 工作机制
      • Spring Security Servlet 实现原理
    • 其它
      • 《Netty - One Framework to rule them all》演讲笔记
      • Hystrix 设计与实现
  • JavaScript
    • 《写给大家看的设计书》笔记 - 设计原则
    • 《JavaScript 权威指南》笔记 - jQuery 类库
  • 数据库
    • ElasticSearch
      • ElasticSearch 概览
    • HBase
      • HBase 数据模型
    • Prometheus
      • Prometheus 概览
      • Prometheus 数据模型和指标类型
      • Prometheus 查询语法
      • Prometheus 存储原理
      • Prometheus vs InfluxDB
    • Redis
      • 《Redis 设计与实现》笔记 - 简单动态字符串
      • 《Redis 设计与实现》笔记 - 链表
      • 《Redis 设计与实现》笔记 - 字典
      • 《Redis 设计与实现》笔记 - 跳跃表
      • 《Redis 设计与实现》笔记 - 整数集合
      • 《Redis 设计与实现》笔记 - 压缩列表
      • 《Redis 设计与实现》笔记 - 对象
      • Redis 内存回收策略
      • Redis 实现分布式锁
      • Redis 持久化机制
      • Redis 数据分片方案
      • 使用缓存的常见问题
    • MySQL
      • 《高性能 MySQL》笔记 - Schema 与数据类型优化
      • 《高性能 MySQL》笔记 - 创建高性能的索引
      • 《MySQL Reference Manual》笔记 - InnoDB 和 ACID 模型
      • 《MySQL Reference Manual》笔记 - InnoDB 多版本
      • 《MySQL Reference Manual》笔记 - InnoDB 锁
      • 《MySQL Reference Manual》笔记 - InnoDB 事务模型
      • B-Tree 简述
      • 理解查询执行计划
  • 中间件
    • gRPC
      • gRPC 负载均衡
    • ZooKeeper
      • ZooKeeper 数据模型
    • 消息队列
      • 消息积压解决策略
      • RocketMQ 架构设计
      • RocketMQ 功能特性
      • RocketMQ 消息存储
  • 分布式系统
    • 《凤凰架构》笔记
    • 系统设计思路
    • 系统优化思路
    • 分布式事务协议:二阶段提交和三阶段提交
    • 分布式系统的技术栈
    • 分布式系统的弹性设计
    • 单点登录解决方案
    • 容错,高可用和灾备
  • 数据结构和算法
    • 一致性哈希
    • 布隆过滤器
    • 散列表
  • 网络协议
    • 诊断工具
    • TCP 协议
      • TCP 报文结构
      • TCP 连接管理
由 GitBook 提供支持
在本页
  • curl
  • 查看 ip 信息
  • ss
  • nslookup
  • ping
  • traceroute
  • tcptraceroute
  • mtr
  • tcpdump
  • iperf3
  1. 网络协议

诊断工具

最后更新于10个月前

curl

curl 命令是一个从服务器传输数据,或者向服务器传输数据的工具,支持多种协议:DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET、TFTP。curl 命令被设计成无需用户交互即可工作的。

更多信息请见 。

ubuntu:~$ curl https://httpbin.org/get
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.58.0",
    "X-Amzn-Trace-Id": "Root=1-629c984a-2e1c3936379071cc3f9b3fc4"
  },
  "origin": "121.5.122.78",
  "url": "https://httpbin.org/get"
}
ubuntu:~$ curl -X POST -d 'name=hello' https://httpbin.org/post
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "name": "hello"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "10",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.58.0",
    "X-Amzn-Trace-Id": "Root=1-629c98c0-64e567ec62638cda249d4ed5"
  },
  "json": null,
  "origin": "121.5.122.78",
  "url": "https://httpbin.org/post"
}

查看 ip 信息

ubuntu:~$ curl -L cip.cc
IP	: 60.12.1.178
地址	: 中国  浙江  杭州
运营商	: 联通

数据二	: 浙江省杭州市 | 联通

数据三	: 中国浙江省杭州市 | 联通

URL	: http://www.cip.cc/60.12.1.178
ubuntu:~$
ubuntu:~$ curl -L ipinfo.io
{
  "ip": "60.12.1.178",
  "city": "Hangzhou",
  "region": "Zhejiang",
  "country": "CN",
  "loc": "30.2936,120.1614",
  "org": "AS4837 CHINA UNICOM China169 Backbone",
  "timezone": "Asia/Shanghai",
  "readme": "https://ipinfo.io/missingauth"
}

ss

ss 命令被用于输出 Linux 套接字的统计信息。它显示的信息与 netstat 命令类似,并且可以显示更多的 Tcp 和状态信息。

ubuntu:~$ sudo ss -lntp
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port
LISTEN   0         128                 0.0.0.0:80               0.0.0.0:*        users:(("nginx",pid=10113,fd=12),("nginx",pid=1184,fd=12))
LISTEN   0         128           127.0.0.53%lo:53               0.0.0.0:*        users:(("systemd-resolve",pid=943,fd=13))
LISTEN   0         128                 0.0.0.0:22               0.0.0.0:*        users:(("sshd",pid=1094,fd=3))
LISTEN   0         128                 0.0.0.0:443              0.0.0.0:*        users:(("nginx",pid=10113,fd=11),("nginx",pid=1184,fd=11))
LISTEN   0         128                       *:9100                   *:*        users:(("node_exporter",pid=1042,fd=3))
LISTEN   0         128                       *:1200                   *:*        users:(("frps",pid=1071,fd=9))
LISTEN   0         128                       *:8080                   *:*        users:(("frps",pid=1071,fd=8))
LISTEN   0         128                    [::]:80                  [::]:*        users:(("nginx",pid=10113,fd=13),("nginx",pid=1184,fd=13))
LISTEN   0         100                       *:1234                   *:*        users:(("java",pid=3640,fd=21))
LISTEN   0         128                       *:8088                   *:*        users:(("node",pid=2249,fd=18))
LISTEN   0         128                       *:7000                   *:*        users:(("frps",pid=1071,fd=3))
LISTEN   0         128                       *:9508                   *:*        users:(("frps",pid=1071,fd=10))

nslookup

nslookup(Name Server Lookup)命令用来从 DNS 中查询域名对应的 ip 地址和其它 DNS 记录信息。

ubuntu:~$ nslookup 3.cn
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	3.cn
Address: 106.39.164.153
Name:	3.cn
Address: 111.13.28.27

ping

ping 命令用来测试数据包能否通过 IP 网络发送到目标主机。

ubuntu:~$ ping 3.cn -t 4
PING 3.cn (106.39.164.153): 56 data bytes
64 bytes from 106.39.164.153: icmp_seq=0 ttl=50 time=39.883 ms
64 bytes from 106.39.164.153: icmp_seq=1 ttl=50 time=43.923 ms
64 bytes from 106.39.164.153: icmp_seq=2 ttl=50 time=39.428 ms
64 bytes from 106.39.164.153: icmp_seq=3 ttl=50 time=47.891 ms

--- 3.cn ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 39.428/42.781/47.891/3.430 ms

traceroute

traceroute 命令用来显示数据包在 IP 网络上发送到目标主机的路由信息。

tcptraceroute

tcptraceroute 命令的效果等同于 traceroute -T 命令。

mtr

mtr 命令是一个将 traceroute 和 ping 功能结合在一起的网络诊断工具。

                             My traceroute  [v0.95]
ubuntu (172.19.159.133) -> 121.5.122.78 (121.5.122.78)2023-07-28T16:54:42+0800
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                       Packets               Pings
 Host                                Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. 172.19.159.254                    0.0%    14    3.4  53.7   3.4 272.2  72.9
 2. (waiting for reply)
 3. 60.12.1.177                       0.0%    14    4.8  15.7   4.8 115.1  28.8
 4. 101.68.76.73                      0.0%    14    5.0  12.2   4.1  33.1  10.7
 5. 124.160.233.157                  64.3%    14    6.0  50.0   4.7 226.7  98.8
 6. 219.158.114.145                  92.3%    14  159.2 159.2 159.2 159.2   0.0
 7. (waiting for reply)
 8. 220.196.197.162                  30.8%    14   79.5  81.5  12.5 219.5  65.4
 9. (waiting for reply)
10. (waiting for reply)
11. (waiting for reply)
12. (waiting for reply)
13. 121.5.122.78                      0.0%    13   81.6  84.3  15.2 358.9  86.7

tcpdump

tcpdump 命令会打印经过网卡的数据包。

iperf3

iperf3 是一种压测 IP 网络中最大带宽的工具。

iperf3 支持调整时序、协议、缓冲区等等相关的各种参数,对于每个测试用例,它都会输出包含吞吐量 / 比特率、丢失等等参数的测试结果。

ubuntu:~$ iperf3 -s -p 5201 -f Mbits
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.0.67, port 63981
[  5] local 192.168.0.102 port 5201 connected to 192.168.0.67 port 63982
[  8] local 192.168.0.102 port 5201 connected to 192.168.0.67 port 63983
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  35.3 MBytes  35.3 MBytes/sec
[  8]   0.00-1.00   sec  37.8 MBytes  37.8 MBytes/sec
[SUM]   0.00-1.00   sec  73.2 MBytes  73.2 MBytes/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   1.00-2.00   sec  44.2 MBytes  44.2 MBytes/sec
[  8]   1.00-2.00   sec  44.5 MBytes  44.5 MBytes/sec
[SUM]   1.00-2.00   sec  88.7 MBytes  88.7 MBytes/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   2.00-3.00   sec  45.2 MBytes  45.2 MBytes/sec
[  8]   2.00-3.00   sec  47.1 MBytes  47.1 MBytes/sec
[SUM]   2.00-3.00   sec  92.3 MBytes  92.3 MBytes/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   3.00-3.02   sec   584 KBytes  37.4 MBytes/sec
[  8]   3.00-3.02   sec   588 KBytes  37.7 MBytes/sec
[SUM]   3.00-3.02   sec  1.14 MBytes  75.2 MBytes/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-3.02   sec   125 MBytes  41.6 MBytes/sec                  receiver
[  8]   0.00-3.02   sec   130 MBytes  43.1 MBytes/sec                  receiver
[SUM]   0.00-3.02   sec   255 MBytes  84.7 MBytes/sec                  receiver
ubuntu:~$ iperf3 -c 192.168.0.102 -p 5201 -t 3 -P 2
Connecting to host 192.168.0.102, port 5201
[  7] local 192.168.0.67 port 63982 connected to 192.168.0.102 port 5201
[  9] local 192.168.0.67 port 63983 connected to 192.168.0.102 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd          RTT
[  7]   0.00-1.00   sec  38.2 MBytes   320 Mbits/sec    0   2.18 MBytes   57ms
[  9]   0.00-1.00   sec  40.6 MBytes   341 Mbits/sec    0   3.00 MBytes   87ms
[SUM]   0.00-1.00   sec  78.8 MBytes   661 Mbits/sec    0
- - - - - - - - - - - - - - - - - - - - - - - - -
[  7]   1.00-2.00   sec  43.9 MBytes   368 Mbits/sec    0   2.20 MBytes   59ms
[  9]   1.00-2.00   sec  43.9 MBytes   368 Mbits/sec    0   2.67 MBytes   63ms
[SUM]   1.00-2.00   sec  87.9 MBytes   736 Mbits/sec    0
- - - - - - - - - - - - - - - - - - - - - - - - -
[  7]   2.00-3.00   sec  45.7 MBytes   383 Mbits/sec    0   2.19 MBytes   48ms
[  9]   2.00-3.00   sec  48.5 MBytes   408 Mbits/sec    0   2.03 MBytes   38ms
[SUM]   2.00-3.00   sec  94.2 MBytes   791 Mbits/sec    0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  7]   0.00-3.00   sec   128 MBytes   357 Mbits/sec    0             sender
[  7]   0.00-3.02   sec   125 MBytes   349 Mbits/sec                  receiver
[  9]   0.00-3.00   sec   133 MBytes   372 Mbits/sec    0             sender
[  9]   0.00-3.02   sec   130 MBytes   362 Mbits/sec                  receiver
[SUM]   0.00-3.00   sec   261 MBytes   729 Mbits/sec    0             sender
[SUM]   0.00-3.02   sec   255 MBytes   710 Mbits/sec                  receiver

iperf Done.

更多信息请见 。

ping 命令的运行原理是向目标主机发送 协议的 ECHO_REQUEST 数据包,等待接收响应的 ECHO_RESPONSE 数据包,然后按响应时间和成功次数估算丢包率和延时。

更多信息请见 。

更多信息请见 。

tcpdump -i eth0 -w dump.pcapng 命令表示把经过 eth0 网卡上的数据包保存到 dump.pcapng 文件中,后续可以使用 打开该文件来分析记录网络数据包。

更多信息请见 。

curl(1) — Linux manual page
ss(8) — Linux manual page
ICMP
traceroute(8) — Linux manual page
MTR 官方文档
Wireshark
tcpdump(1) — Linux manual page