计算机网络——应用层 HTTP 协议分析

计算机网络——应用层 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.0HTTP/1.1HTTP/2.0HTTP/3.0
速度慢(串行请求)中等(持久连接)快(交错运行 报文分段)最快(QUIC+0-RTT)
传输协议TCPTCPTCPQUIC(UDP)
连接每次新建 TCP持久连接(复用 TCP)多路复用(单连接并行)多路复用 + 连接迁移
传输格式字符串字符串字节码字节码
加密需求可选可选强制 HTTPS强制(内置 TLS 1.3)
队头阻塞存在(TCP 层)存在(TCP 层)部分解决(应用层)完全解决(QUIC 流)
普及度淘汰主流(兼容性强)手机 APP 等大量理论

应用层

URL 结构

URL(Uniform Resource Locator,统一资源定位符)用于定位互联网上的资源,比如网页、图片、视频等,格式如下:

<协议>://<主机名>:<端口>/<路径>?<查询参数>#<片段标识符>
  1. 协议(Scheme)

    • 定义访问资源使用的协议(如 httphttpsftp)。
    • 示例:https://
  2. 主机名(Host)

    • 可以是域名或 IP 地址。
    • 示例:blog.xiaqy.top
  3. 端口(Port,可选)

    • 指定服务运行的端口号,默认端口可省略(如 HTTP 默认 80,HTTPS 默认 443)。
    • 示例::8080
  4. 路径(Path)

    • 资源在服务器上的具体位置,通常类似文件路径。
    • 示例:/articles/url-format
  5. 查询参数(Query,可选)

    • ? 开头,多个参数用 & 分隔,形式为 key=value
    • 示例:?page=1&sort=date
  6. 片段标识符(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

image-20250619221306575

Content-Length

  • 描述:表明请求体的字节大小。
  • 详情:通常仅对 POST 请求有意义。
  • 示例:Content-Length: 88

image-20250619221137507

Referer

  • 描述:告知服务器请求来源的页面 URL。
  • 用途:用于分析用户来源或防止未经授权的请求。
  • 示例:Referer: https://www.baidu.com/index.htm

应用层

Cookie

  • 描述:保存至浏览器的凭据信息,用于状态管理。

  • 详情:

    • Cookie:客户端存储的键值对,服务器通过 Set-Cookie 头设置。
    • Session(较为安全的 Cookie):基于服务器端的会话管理,通过 Set-Cookie 传递 Session ID。

应用层

Cookie 与 Session 的区别

特性CookieSession
存储位置存储在客户端(浏览器)存储在服务器端
生命周期可设置过期时间,持久化或会话结束删除通常在会话结束(如浏览器关闭)时销毁
传输方式通过 HTTP 请求头(Cookie)自动发送通过 Cookie 传递 Session ID
数据内容键值对,通常包含简单数据(如用户偏好)会话数据,通常通过 Session ID 关联
安全性较低,易被篡改或窃取较高,数据存储在服务器端,仅传输 ID
大小限制通常限制为 4KB无严格大小限制,取决于服务器配置
性能影响每次请求都发送,增加少量开销服务器需维护会话状态,占用资源较多
典型用途保存用户偏好、跟踪用户行为用户认证、临时状态管理

请求空行

  • 在 HTTP 协议中,请求空行是 HTTP 请求报文中的一个关键部分,用于 分隔请求头和请求体。它的作用类似于一个结束标记,告诉服务器头部的结束位置。

请求体

  • 请求体用于向服务器发送数据(如表单提交、JSON、文件上传等)
  • GET 请求方式中请求体为空
  • POST 请求方式请求体是可选项

HTTP 响应报文

响应行

  • 响应行的格式:HTTP版本 状态码 原因短语,如 HTTP/1.1 302 Found
  • 状态码:是一个三位数字代码,用于表示服务器对请求的处理结果。
  • 响应状态:响应中服务器返回的状态码和对应的状态消息,如 Found
状态码描述常见状态码
1xx提示信息,表示目前是中间状态,要继续操作,如 100 Continue100
2xx成功,报文已经收到并被正确处理,如 200 OK200
3xx重定向,资源位置发生变动,需要客户端重新发送请求,如 302 Found302、304
4xx客户端错误,请求报文有误,服务器无法处理,如 404 Not Found403、404、405
5xx服务器在处理请求时内部发生了错误,如 500 Internal Error500、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 连接的建立和关闭(三次握手、四次挥手)等。

image-20250619204111974

image-20250619204502710

浏览器开发者工具

浏览器开发者工具提供以下功能:

  • 元素:查看渲染后的 DOM 结构和 CSS 样式。

[!Important]

元素的 HTML 标签是浏览器渲染、解析 js 之后的代码。

右键界面查看源代码,查看的是未经解析的响应体原始内容。

  • 控制台:执行 JavaScript 代码的交互式终端,调试错误,如 alert("Hello")
  • 源代码:查看、调试、修改网站前端代码,支持断点调试。
  • 网络:查看网页中的请求和响应。
  • 应用:查看、管理 Cookie 等。

image-20250619211110540

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇