计算机网络——应用层 HTTP 协议分析
基础概念
HTTP(HyperText Transfer Protocol,超文本传输协议)是用于传输超文本数据(如 HTML、图像、视频)的应用层协议,基于 TCP,默认端口为 80
(HTTPS 为 443
)。其核心特点包括:
- 无状态:每次请求和响应独立,服务器不自动保存客户端状态(通过 Cookie 或 Session 弥补)。
- 请求-响应模型:规定了客户端(浏览器)与服务器间的传输规范,客户端(通常是浏览器)发送请求,服务器返回响应。
- 灵活性:支持多种数据类型(文本、图像、音视频等)。
HTTP 版本号
- 常见的 HTTP 版本号为:1.0、1.1(常用)、2.0(常用,兼容 1.1)、3.0(基于 UDP)。
- HTTP/1.0:是首个标准化版本,采用短连接模式,每次请求和响应,都要开始前三次握手,结束后四次挥手,效率低下且无状态管理。
- HTTP/1.1:通过引入长连接(Connect:Keep-Alive)实现 TCP 连接复用,并支持交替传输。
- HTTP/2.0:强制使用 HTTPS 加密,并兼容 HTTP/1.1,不再传输字符串,都是字节码(节省内存、流量、提高性能),支持交错运行,报文分段,同时支持服务器主动向客户端推送。
- HTTP/3.0:基于 UDP,有 QUIC,尚未普及,仍处于理论中。
对比项 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 | HTTP/3.0 |
---|---|---|---|---|
速度 | 慢(串行请求) | 中等(持久连接) | 快(交错运行 报文分段) | 最快(QUIC+0-RTT) |
传输协议 | TCP | TCP | TCP | QUIC(UDP) |
连接 | 每次新建 TCP | 持久连接(复用 TCP) | 多路复用(单连接并行) | 多路复用 + 连接迁移 |
传输格式 | 字符串 | 字符串 | 字节码 | 字节码 |
加密需求 | 可选 | 可选 | 强制 HTTPS | 强制(内置 TLS 1.3) |
队头阻塞 | 存在(TCP 层) | 存在(TCP 层) | 部分解决(应用层) | 完全解决(QUIC 流) |
普及度 | 淘汰 | 主流(兼容性强) | 手机 APP 等大量 | 理论 |
URL 结构
URL(Uniform Resource Locator,统一资源定位符)用于定位互联网上的资源,比如网页、图片、视频等,格式如下:
<协议>://<主机名>:<端口>/<路径>?<查询参数>#<片段标识符>
协议(Scheme)
- 定义访问资源使用的协议(如
http
、https
、ftp
)。 - 示例:
https://
- 定义访问资源使用的协议(如
主机名(Host)
- 可以是域名或 IP 地址。
- 示例:
blog.xiaqy.top
端口(Port,可选)
- 指定服务运行的端口号,默认端口可省略(如 HTTP 默认 80,HTTPS 默认 443)。
- 示例:
:8080
路径(Path)
- 资源在服务器上的具体位置,通常类似文件路径。
- 示例:
/articles/url-format
查询参数(Query,可选)
- 以
?
开头,多个参数用&
分隔,形式为key=value
。 - 示例:
?page=1&sort=date
- 以
片段标识符(Fragment,可选)
- 以
#
开头,指向资源内的某个部分(如 HTML 锚点)。 - 示例:
#section2
- 以
HTTP 请求报文
请求行
- 请求行的格式:
方法 请求URL和参数 HTTP版本
,如POST /login.php HTTP/1.1
- 常见的请求方式是 GET 和 POST。
方法 | 说明 | 支持的 HTTP 协议版本 |
---|---|---|
GET | 获取指定资源,参数在 URL 中传递 | 1.0、1.1 |
POST | 提交实体到指定资源,通常用于创建/更新资源 | 1.0、1.1 |
PUT | 替换目标资源的所有当前表示(完整更新) | 1.0、1.1 |
HEAD | 获取与 GET 相同的响应头,但不返回响应体(用于检查资源有效性) | 1.0、1.1 |
DELETE | 删除指定资源 | 1.0、1.1 |
OPTIONS | 获取目标资源支持的通信选项(CORS 预检请求) | 1.1 |
TRACE | 沿着目标资源的路径回显请求消息(用于诊断) | 1.1 |
CONNECT | 建立与服务器的隧道连接(用于 SSL 代理) | 1.1 |
PATCH | 对资源进行部分修改(RFC 5789 新增方法) | 1.1 |
LINK | 建立资源间关系(已废弃,RFC 2068) | 1.0 |
UNLINK | 移除资源间关系(已废弃,RFC 2068) | 1.0 |
请求行方法 GET 与 POST 的区别
对比维度 | GET 方法 | POST 方法 |
---|---|---|
主要用途 | 获取服务器资源(只读操作) | 提交数据到服务器(写操作) |
内容 | 只能传输字符串参数 | 可以传输任意类型的参数(字符串、图片、视频 等) |
数据长度 | 有长度限制(如 chrome 是 4096 字节) | 理论上无限制(服务器可配置最大限制) |
参数位置 | URL 查询字符串中 | 请求体中 |
安全性 | 参数明文暴露在 URL 和浏览器历史中 | 数据在请求体中,HTTPS 下更安全 |
可见性 | 参数在地址栏可见 | 一般参数不可见(需开发者工具查看) |
幂等性 | 多次请求结果相同 | 多次提交可能产生副作用(如重复下单) |
缓存 | 可被浏览器/代理服务器缓存 | 默认不缓存(除非显式设置 Cache-Control 头) |
书签 | 可直接保存或分享带参数的 URL | 无法直接保存含请求体的操作 |
请求头
- 客户端(如浏览器、API 调用)向服务器发送请求时,请求头用于传递附加信息,帮助服务器正确处理请求。
请求头 | 描述 |
---|---|
Host | 访问的域名或 IP |
Connection | 表明 TCP 是否结束,如 keep-alive (复用 TCP)或 close |
User-Agent(UA) | 客户端的浏览器版本和操作系统版本 |
Accept | 表明浏览器能够接受什么类型的信息,如 text/html, application/json |
Accept-Encoding | 表明浏览器能够接受什么类型的压缩信息,如 gzip, deflate |
Accept-Language | 可接受的语言,如 zh-CN, en-US |
Content-Type | 表明请求体的 MIME 类型,如 application/x-www-form-urlencoded |
Content-Length | 告知服务器请求体的字节长度,仅 POST 请求使用 |
Referer | 告诉服务器请求来源页面的 URL |
Cookie | 客户端存储的凭据信息 |
Host
- 描述:指定访问的服务器域名或 IP 地址。
- 示例:
Host: blog.xiaqy.top
Connection
描述:指示 TCP 连接在请求后是否保持或关闭。
详情:
- 从 HTTP/1.1 开始,多个请求和响应可复用同一 TCP 连接。
keep-alive
:启用 TCP 长连接,允许后续 HTTP 请求复用同一连接。close
:响应后或长时间空闲后,TCP 连接将关闭。
示例:
Connection: keep-alive
User-Agent
- 描述:标识发出请求的客户端(浏览器、设备或应用)版本。
- 用途:帮助服务器根据客户端特性定制响应。
- 示例:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
Accept
描述:指定客户端可接受的响应 MIME 类型。
详情:
HTTP 使用 MIME 类型(而非文件扩展名)标识内容类型。
常见 MIME 类型:
text/html
:HTML 文档application/json
:JSON 数据image/png
:PNG 图片application/pdf
:PDF 文件
参考:MIME 类型列表
Accept-Encoding
描述:列出客户端支持的压缩方式(如 gzip、deflate)。
详情:
- 从 HTTP/1.0 开始,请求和响应流量可通过 gzip 等压缩方式传输,浏览器和服务器自动解压。
示例:
Accept-Encoding: gzip, deflate
Accept-Language
- 描述:指定客户端支持的语言。
- 用途:服务器可根据语言偏好返回合适的响应内容。
- 示例:
Accept-Language: zh-CN, zh; q=0.9, en; q=0.8
Content-Type
描述:指明 POST 请求体的 MIME 类型。
详情:
通常仅对 POST 请求有意义。
重要 MIME 类型:
application/x-www-form-urlencoded
:表单数据编码multipart/form-data
:文件上传application/json
:JSON 数据
示例:
Content-Type: application/x-www-form-urlencoded
Content-Length
- 描述:表明请求体的字节大小。
- 详情:通常仅对 POST 请求有意义。
- 示例:
Content-Length: 88
Referer
- 描述:告知服务器请求来源的页面 URL。
- 用途:用于分析用户来源或防止未经授权的请求。
- 示例:
Referer: https://www.baidu.com/index.htm
Cookie
描述:保存至浏览器的凭据信息,用于状态管理。
详情:
- Cookie:客户端存储的键值对,服务器通过
Set-Cookie
头设置。 - Session(较为安全的 Cookie):基于服务器端的会话管理,通过
Set-Cookie
传递 Session ID。
- Cookie:客户端存储的键值对,服务器通过
Cookie 与 Session 的区别
特性 | Cookie | Session |
---|---|---|
存储位置 | 存储在客户端(浏览器) | 存储在服务器端 |
生命周期 | 可设置过期时间,持久化或会话结束删除 | 通常在会话结束(如浏览器关闭)时销毁 |
传输方式 | 通过 HTTP 请求头(Cookie )自动发送 | 通过 Cookie 传递 Session ID |
数据内容 | 键值对,通常包含简单数据(如用户偏好) | 会话数据,通常通过 Session ID 关联 |
安全性 | 较低,易被篡改或窃取 | 较高,数据存储在服务器端,仅传输 ID |
大小限制 | 通常限制为 4KB | 无严格大小限制,取决于服务器配置 |
性能影响 | 每次请求都发送,增加少量开销 | 服务器需维护会话状态,占用资源较多 |
典型用途 | 保存用户偏好、跟踪用户行为 | 用户认证、临时状态管理 |
请求空行
- 在 HTTP 协议中,请求空行是 HTTP 请求报文中的一个关键部分,用于 分隔请求头和请求体。它的作用类似于一个结束标记,告诉服务器头部的结束位置。
请求体
- 请求体用于向服务器发送数据(如表单提交、JSON、文件上传等)
- GET 请求方式中请求体为空
- POST 请求方式请求体是可选项
HTTP 响应报文
响应行
- 响应行的格式:
HTTP版本 状态码 原因短语
,如HTTP/1.1 302 Found
- 状态码:是一个三位数字代码,用于表示服务器对请求的处理结果。
- 响应状态:响应中服务器返回的状态码和对应的状态消息,如
Found
。
状态码 | 描述 | 常见状态码 |
---|---|---|
1xx | 提示信息,表示目前是中间状态,要继续操作,如 100 Continue | 100 |
2xx | 成功,报文已经收到并被正确处理,如 200 OK | 200 |
3xx | 重定向,资源位置发生变动,需要客户端重新发送请求,如 302 Found | 302、304 |
4xx | 客户端错误,请求报文有误,服务器无法处理,如 404 Not Found | 403、404、405 |
5xx | 服务器在处理请求时内部发生了错误,如 500 Internal Error | 500、502、503、504 |
具体状态码示例:
- 100 continue
- 200 响应成功
- 302 重定向/跳转
- 304 缓存资源没有修改
- 403 拒绝访问
- 404 访问资源不存在
- 405 请求方式不允许
- 500 服务器无法处理
- 502/503/504 服务器无响应
响应头
- 服务器返回响应时,响应头包含元数据,指导客户端如何处理响应(如缓存、编码、安全策略等)。
- 响应头大都与请求头相似。
#日期
Date: Thu,19Jun 2025 05:57:33 GMT
#中间件版本
Server: Apache/2.4.10 (Debian)
#压缩类型
Content-Encoding: gzip
#响应体的长度
Content-Length:2690
#响应体的类型
Content-Type: text/html;charset=utf-8
响应空行
- 在 HTTP 协议中,响应空行是 HTTP 请求报文中的一个关键部分,用于 分隔响应头和响应体。它的作用类似于一个结束标记,告诉服务器头部的结束位置。
响应体
- 是服务器返回给客户端的实际数据内容,通常用于传输网页、JSON、文件、流媒体等。
抓包与调试
Wireshark 抓包
使用 Wireshark 分析 HTTP 流量,设置过滤器 http
可查看请求和响应的详细信息,包括:
- 请求方法、URL、头等信息。
- 响应状态码、响应体等内容。
- TCP 连接的建立和关闭(三次握手、四次挥手)等。
浏览器开发者工具
浏览器开发者工具提供以下功能:
- 元素:查看渲染后的 DOM 结构和 CSS 样式。
[!Important]
元素的 HTML 标签是浏览器渲染、解析 js 之后的代码。
右键界面查看源代码,查看的是未经解析的响应体原始内容。
- 控制台:执行 JavaScript 代码的交互式终端,调试错误,如
alert("Hello")
。 - 源代码:查看、调试、修改网站前端代码,支持断点调试。
- 网络:查看网页中的请求和响应。
- 应用:查看、管理 Cookie 等。