飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • HTTP 基础

    • 认识HTTP协议与应用层定位
    • HTTP消息格式与报文结构
    • HTTP请求方法与幂等性
    • HTTP状态码详解
  • 连接与缓存

    • HTTP持久连接与版本演进
    • HTTP缓存机制
  • 状态与协商

    • Cookie与Session状态管理
    • HTTP重定向与内容协商
    • HTTP条件请求与范围请求
  • 安全与加密

    • HTTP认证机制
    • HTTPS与TLS握手
  • 协议演进

    • HTTP2核心特性
    • HTTP3与QUIC
  • 架构与实战

    • HTTP代理服务器与Web缓存
    • HTTP常见攻击与防御
    • HTTP实践工具与抓包分析

HTTP实践工具与抓包分析

概念引入

广州飞翔科技的技术部里,航仔(后端)和风速(算法)经常争论一个 API 接口为什么返回 500;空少(前端)抱怨图片加载慢,却不知道瓶颈在哪;凌叔(运维)被叫起来修服务器,首先要判断是网络问题还是应用问题。

这时候,一套趁手的 HTTP 调试工具就像医生的听诊器——curl 是快速问诊,Chrome DevTools 是全面体检,Wireshark 是 CT 扫描,Postman 是专科会诊。本章介绍飞翔公司开发团队日常使用的工具组合。


核心内容

curl:命令行里的"瑞士军刀"

curl 是一个命令行工具,用于发送 HTTP 请求并查看响应。它轻量、跨平台、脚本友好,是凌叔(运维)和航仔(后端)的最爱。

常用参数速查

参数全称作用飞翔公司场景
-v--verbose显示完整请求/响应过程航仔调试 API 时看握手细节
-I--head只获取响应头凌叔检查 CDN 缓存状态
-H--header自定义请求头空少测试带 Token 的接口
-d--dataPOST 提交数据图妹(产品经理)测试表单提交
-L--location跟随重定向检查短链接跳转路径
--http2强制使用 HTTP/2翼王验证协议升级

实战示例

# 1.  verbose模式:看完整交互过程
curl -v https://www.feixiang.net

# 输出中会显示:
# > GET / HTTP/1.1
# > Host: www.feixiang.net
# > User-Agent: curl/7.68.0
# < HTTP/1.1 200 OK
# < Content-Type: text/html; charset=utf-8

# 2. 只获取响应头,检查缓存
curl -I https://www.feixiang.net/logo.png
# 观察:Cache-Control、X-Cache、Age

# 3. POST JSON数据到航仔的API
curl -X POST https://api.feixiang.net/v1/login \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbG..." \
  -d '{"username":"hangzai","password":"***"}'

# 4. 跟随重定向,看跳转链
curl -L -I https://feixiang.net
# 观察:301/302 跳转路径

# 5. 下载文件并显示进度
curl -o feixiang_report.pdf https://www.feixiang.net/reports/2024.pdf

# 6. 测试HTTP/2支持
curl --http2 -I https://www.feixiang.net

Chrome DevTools:前端的"透视眼镜"

Chrome DevTools 是内置于 Chrome 浏览器的开发者工具,空少(前端)每天花一半时间在里面。

Network 面板核心功能

飞翔公司场景:空少发现官网首页加载慢,打开 DevTools → Network → 按 Domain 排序:

  • 发现 cdn.feixiang.net 的图片花了 2s → 联系凌叔检查 CDN
  • 发现 api.feixiang.net 的接口 TTFB 800ms → 航仔去优化数据库查询
  • 发现某个 JS 文件显示 from disk cache → 确认缓存策略生效

Security 面板

查看 TLS 证书链、协议版本、证书有效期:

  • 翼王检查官网是否用了 TLS 1.3
  • 凌叔确认证书是否即将过期(避免网站变"不安全")

Postman / Insomnia:API 调试的"手术台"

Postman 和 Insomnia 是图形化的 API 调试工具,比 curl 更直观,适合保存请求集合、团队协作。

飞翔公司用法:

  • 图妹(产品经理)用 Postman collections 保存所有产品接口,写文档时直接引用
  • 星宇(产品助理)用环境变量切换"开发/测试/生产"三套配置
  • 航仔导出 Postman 测试脚本,集成到 CI/CD 流水线做自动化接口测试

Wireshark:网络层的"显微镜"

Wireshark 是网络协议分析器,可以捕获网卡上的所有数据包,深入查看每一层协议的字段。

HTTP 抓包过滤表达式

# 只捕获HTTP流量
tcp.port == 80

# 捕获特定主机的HTTP
tcp.port == 80 && ip.addr == 192.168.1.100

# 捕获HTTP请求方法为GET的包
http.request.method == "GET"

# 捕获包含特定URL的包
http contains "feixiang.net"

# 捕获TLS握手(HTTPS解密前)
tls.handshake.type == 1

飞翔公司场景:凌叔怀疑有员工电脑中了木马,向外发送异常 HTTP 请求。他用 Wireshark 在网关镜像端口抓包:

openssl s_client:TLS/SSL 调试利器

openssl s_client 是 OpenSSL 自带的调试工具,用于测试 TLS 连接、查看证书链、验证加密套件。

# 测试TLS连接并显示证书信息
openssl s_client -connect www.feixiang.net:443 -servername www.feixiang.net

# 指定TLS 1.3连接
openssl s_client -connect www.feixiang.net:443 -tls1_3

# 查看支持的加密套件
openssl s_client -connect www.feixiang.net:443 -cipher 'ALL:eNULL'

# 在交互模式中发送HTTP请求:
# HEAD / HTTP/1.1
# Host: www.feixiang.net
# [回车]

飞翔公司场景:翼王升级了官网的 TLS 配置后,用 openssl 验证:

  • 是否支持 TLS 1.3?
  • 弱加密套件是否已禁用?
  • 证书链是否完整(中间证书有没有漏配)?

httpbin.org:HTTP 的"回音壁"

httpbin.org 是一个免费的 HTTP 测试服务,能"原样返回"你发送的请求内容,非常适合学习 HTTP 协议。

# 测试GET请求,httpbin会返回你的IP、User-Agent等
curl https://httpbin.org/get

# 测试POST和自定义头部
curl -X POST https://httpbin.org/post \
  -H "X-Feixiang-Token: abc123" \
  -d '{"user":"hangzai"}'

# 测试重定向
curl -L https://httpbin.org/redirect/3

# 测试状态码
curl -I https://httpbin.org/status/418

telnet:最原始的 HTTP 请求

telnet 可以手动建立 TCP 连接,逐行输入 HTTP 请求,最直观地理解 HTTP 的文本协议本质。

# 连接到HTTP服务器
telnet www.feixiang.net 80

# 手动输入HTTP请求(注意空行表示请求结束):
GET / HTTP/1.1
Host: www.feixiang.net
User-Agent: Feixiang-Learning/1.0

# 按两次回车,服务器返回响应

这就像打电话订餐——你一句我一句,完全明文,没有任何自动化封装。

飞翔公司开发团队的工具组合


本篇小结

  • curl:命令行 HTTP 客户端,适合快速测试、脚本自动化、服务器环境调试
  • Chrome DevTools:前端必备,Network 面板看请求详情、Timing 分析性能、Security 面板查 TLS
  • Postman/Insomnia:图形化 API 调试,支持 collections、环境变量、自动化测试
  • Wireshark:网络层抓包分析,可查看原始 TCP/HTTP 报文,过滤表达式精准定位
  • openssl s_client:TLS/SSL 专项调试,验证证书链、加密套件、协议版本
  • httpbin.org:免费 HTTP 测试服务,返回请求原样,适合学习协议
  • telnet:手动发送 HTTP 请求,最直观理解 HTTP 文本协议本质
  • 工具是手段,理解协议原理才是目的

动手实践

温馨提示: 以下实践示例中涉及的域名(如 www.feixiang.net)、公司场景和接口均为虚构数据,仅用于演示协议原理,实际执行时可能不会产生文档中描述的效果。建议将命令中的域名替换为你自己可访问的真实地址进行练习。

实践:用 curl 完成一次完整的 HTTP 调试

# 步骤1:获取响应头,分析缓存策略
curl -I https://www.feixiang.net

# 步骤2:verbose模式看TLS握手和重定向
curl -v -L https://feixiang.net 2>&1 | grep -E "(> |< |SSL|location)"

# 步骤3:POST测试登录接口
curl -X POST https://api.feixiang.net/v1/login \
  -H "Content-Type: application/json" \
  -d '{"username":"test","password":"test"}' \
  -w "\nHTTP状态码: %{http_code}\n总时间: %{time_total}s\n"

# 步骤4:下载文件并限制速度(模拟弱网)
curl --limit-rate 100K -o test.pdf https://www.feixiang.net/sample.pdf

实践:用 Chrome DevTools 分析真实网站

  1. 打开 Chrome,按 F12 打开 DevTools
  2. 访问 www.feixiang.net,切换到 Network 面板
  3. 找到第一个请求,观察:
    • Request Headers 中的 User-Agent、Accept-Language
    • Response Headers 中的 Server、X-Powered-By
    • Timing 中的 DNS Lookup、SSL、TTFB
  4. 勾选 Preserve log,刷新页面,对比两次请求的缓存差异

实践:用 Wireshark 抓取本地 HTTP 流量

# 步骤1:启动Wireshark,选择loopback或以太网接口
# 步骤2:设置过滤表达式:
#   tcp.port == 80 or tcp.port == 8080

# 步骤3:在另一个终端用curl发送请求
curl http://localhost:8080/api/test

# 步骤4:在Wireshark中右键HTTP请求 → Follow → TCP Stream
# 观察原始HTTP报文格式

实践:思考题

  1. 空少用 DevTools 看到某个接口返回 200,但页面数据没更新,可能是什么原因?如何用 curl 验证?
  2. 凌叔用 Wireshark 抓包时,为什么看不到 HTTPS 的请求内容?有什么办法可以解密?
  3. 风速(算法)需要批量测试 100 个 API 接口的性能,应该选择什么工具组合?

查看思考题答案

上一页
HTTP常见攻击与防御