当前位置: 首页 > news >正文

HTTP由浅入深

概述

超文本传输协议(HTTP, Hypertext Transfer Protocol) 是一种用于传输超媒体文档(例如 HTML)的应用层协议。它最初被设计用于 Web 浏览器与 Web 服务器之间的通信,但也广泛应用于其他客户端与服务器的交互。

HTTP 遵循经典的[客户端-服务器(Client-Server)模型:客户端发起请求,服务器处理并返回响应。HTTP 是一种无状态协议,即服务器在两个请求之间不保留任何状态信息。

特点
  1. 简单快速:客户端向服务器请求服务时,仅需发送请求方法和路径。常用的方法有 GET、HEAD、POST 等。由于协议本身结构简单,HTTP 服务器实现轻量,通信速度较快。
  2. 灵活:HTTP 允许传输任意类型的数据,通过 Content-Type 头来标识传输的数据类型。
  3. 无连接:HTTP 的无连接性指每次请求完成后,客户端与服务器的连接就会断开。这种方式有助于节省服务器资源,提升处理效率。
  4. 无状态:HTTP 协议本身不记录请求之间的状态信息。如果需要在多个请求之间保留用户状态,通常通过 Cookie、Session、Token 等机制实现。无状态的好处是服务器响应更快,但也带来了开发上的额外工作。
  5. 支持 B/S 和 C/S 模式:HTTP 既可用于浏览器/服务器(Browser/Server)架构,也适用于客户端/服务器(Client/Server)通信,因而应用广泛。
URL

HTTP 使用统一资源标识符(URI, Uniform Resource Identifier)来标识和定位资源。**URL(Uniform Resource Locator,统一资源定位符)**是 URI 的一种形式,包含了访问某个资源所需的完整信息。

下面通过一个新的 URL 示例来说明其组成部分:

https://example.com:8443/docs/tutorial/index.html?user=alice&lang=zh#section2

这个 URL 可以分为以下几个部分:

  1. 协议(Scheme)https
    指明使用的协议是 HTTPS,即 HTTP 的加密版本,保障数据的安全性。
  2. 域名(Host)example.com
    表示服务器的地址,既可以是域名也可以是 IP 地址。
  3. 端口(Port):8443
    指定服务器监听的端口号。若省略此部分,将使用协议的默认端口(HTTPS 默认为 443)。
  4. 路径(Path)/docs/tutorial/
    表示服务器上资源的目录结构,也称为虚拟目录。
  5. 文件名(File)index.html
    表示请求的具体资源文件,若省略则通常由服务器返回默认首页文件。
  6. 查询参数(Query)?user=alice&lang=zh
    用于向服务器传递额外信息。多个参数通过 & 分隔,键值对之间用 = 连接。
  7. 锚点(Fragment)#section2
    表示页面中的某个位置(例如跳转到 HTML 的某个 id),不会参与服务器通信,仅由前端解析处理。

HTTP 与 HTTPS

概述

HTTP(Hypertext Transfer Protocol,超文本传输协议)
用于从 Web 服务器传输超文本(如 HTML 文件、图片、视频等)到客户端浏览器,是一种基于 TCP/IP 的请求-响应协议,默认端口为 80

HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议)
是 HTTP 的安全版本,在 HTTP 的基础上增加了 SSL/TLS 加密机制,提供数据加密、完整性校验和身份验证,默认端口为 443

HTTP 工作原理

HTTP 使用“客户端 - 服务器”模型工作:

  1. 客户端发起请求:浏览器等客户端向服务器发起 HTTP 请求;
  2. 服务器处理请求:服务器解析请求、读取资源或处理业务逻辑;
  3. 服务器返回响应:返回 HTML 页面、图片、JSON 数据等内容;
  4. 客户端渲染页面:浏览器接收响应并渲染出完整页面。

常见的 Web 服务器有:ApacheNginxIIS(Internet Information Services) 等。

HTTP 的三个特性:

  • 无连接:每次请求/响应后即断开连接;
  • 无状态:服务器不保存任何关于客户端的会话状态;
  • 媒体独立:只要客户端和服务器能识别 MIME 类型,任何格式的数据都可通过 HTTP 传输。
HTTPS 的作用

HTTPS 通过 SSL/TLS 协议 提供如下安全保障:

  • 加密传输:防止数据被第三方窃听;
  • 数据完整性:防止传输过程中的数据被篡改;
  • 身份验证:确保数据是从真实的服务器发出的。

HTTPS 的信任依赖于操作系统中预装的 CA(证书颁发机构)

  • 浏览器需要信任 CA;
  • 服务器必须使用有效的证书;
  • 证书必须匹配访问的域名;
  • 协议加密过程必须完整并有效。
区别总结
对比维度HTTPHTTPS
是否加密明文传输SSL/TLS 加密传输
端口号80443
安全性不安全,易被监听或篡改安全,具备加密、认证与完整性校验功能
证书要求无需证书需部署 SSL 证书
性能较快,无加密开销稍慢,有加解密过程
SEO 影响可能被降权更受搜索引擎优待
浏览器提示显示“不安全”显示“安全锁”
成本免费需购买或申请 SSL 证书
适用场景非敏感信息传输场景(如新闻博客)涉及隐私或敏感信息(如电商、登录等)

请求报文

HTTP 请求报文由三部分组成:

  1. 请求行(Request Line)

  2. 请求头(Request Header)

  3. 请求体(Request Body,可选)

    请求报文示例

GET / HTTP/1.1                 # 请求方法为GET,请求首页(/),使用HTTP/1.1协议
Host: baidu.com               # 指定目标主机(域名)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.6367.60# 浏览器类型和操作系统信息
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8# 客户端可接收的内容类型
Accept-Encoding: gzip, deflate, br# 支持的内容压缩编码方式(节省带宽)
Accept-Language: zh-CN,zh;q=0.9# 客户端可接受的语言
Connection: keep-alive        # 表示使用长连接,保持 TCP 连接不断开
Cookie: BIDUPSID=...; BAIDUID=...; ...# 携带的 Cookie,用于身份识别、会话保持等
请求行

格式如下:

请求方法 请求资源路径 协议版本

示例:

POST /chapter17/user.html HTTP/1.1

常见请求方法
方法说明
GET请求数据附在 URL 中;不安全,有长度限制;无请求体
POST数据放在请求体中;适用于表单提交、上传等场景
HEAD只请求响应头,不返回实体内容
PUT用于更新或上传资源
DELETE请求服务器删除资源
OPTIONS返回服务器支持的请求方法
TRACE回显服务器收到的请求(用于测试和诊断)
CONNECT用于建立网络隧道(主要用于 HTTPS)
请求头

请求头用于描述客户端环境和请求内容,常见字段如下:

Header 字段说明
Host请求主机名
User-Agent客户端软件信息
Accept可接受的内容类型
Content-Type请求体数据类型
Content-Length请求体的字节长度
Cookie客户端存储的 cookie 数据
Referer发起请求的源页面地址
请求体

请求体通常包含实际发送的数据,仅 POST、PUT 等方法使用。GET 方法没有请求体。

Content-Type 详解

Content-Type 指定了请求体中数据的类型。以下是常见类型说明:

Content-Type说明
text/plain纯文本格式
text/htmlHTML 格式
text/cssCSS 格式
text/javascriptJavaScript 格式
image/gifGIF 图片
image/jpegJPEG 图片
image/pngPNG 图片
application/x-www-form-urlencoded表单默认格式,key=value&key2=value2
application/jsonJSON 格式,常用于 API 请求
multipart/form-data用于表单上传文件
text/xml以 XML 格式提交数据
application/octet-stream任意二进制数据流,如文件下载/上传
常见场景 Content-Type 对应关系
场景请求方法Content-Type
普通表单提交POSTapplication/x-www-form-urlencoded
上传文件POSTmultipart/form-data
提交 JSON 数据POSTapplication/json
REST 接口 PUT 请求PUTapplication/json 或其他格式
下载文件GETapplication/octet-stream

响应报文

HTTP 响应报文由三部分组成:

  1. 响应行(Status Line)
  2. 响应头(Response Header)
  3. 响应体(Response Body)

响应报文示例

HTTP/2 200 OK                    # 响应协议版本为HTTP/2,状态码200表示请求成功
Server: JSP3/2.0.14              # 服务器软件及版本信息
Date: Fri, 16 May 2025 07:59:09 GMT  # 响应生成时间(GMT格式)
Content-Type: text/javascript; charset=utf-8# 响应内容的类型为JavaScript,字符编码为utf-8
Expires: Mon, 16 Sep 2024 07:12:27 GMT# 资源过期时间(一般用于缓存)
Last-Modified: Thu, 12 Sep 2024 08:43:04 GMT# 资源最后修改时间
Etag: "63487d8c50e44137f8b6ce2a04407f8f"# 资源的唯一标识(方便缓存和验证)
Cache-Control: max-age=31536000# 缓存控制,表示资源最大缓存时间为31536000秒(1年)
Age: 621073                     # 资源在缓存中已经存在的秒数
Accept-Ranges: bytes            # 支持客户端的范围请求(断点续传)
Content-Md5: Y0h9jFDkQTf4ts4qBEB/jw==# 响应内容的MD5校验值(完整性校验)
X-Cache-Status: HIT             # 缓存命中,表示资源来自缓存
Timing-Allow-Origin: *          # 允许任何源访问资源加载时间数据(用于性能分析)
Access-Control-Allow-Origin: * # 允许跨域访问,任何域都可以访问此资源
// 以下是响应体示例(JavaScript代码)
define("@baidu/aging-tools-pc/dist/index",["san","tslib"],function(n,t){function e(n){if(o[n])return o[n].exports;var t=o[n]={i:n,l:!1,exports:{}};return i[n].call(t.exports,t,t.exports,e),t.l=!0,t.exports}// 省略后续代码
})
响应行

格式如下:

HTTP/协议版本 状态码 状态描述

示例:

HTTP/1.1 200 OK

状态码详解

HTTP 状态码由 3 位数字组成,第一个数字表示响应的类别:

1xx:信息响应(Informational)
  • 100 Continue:继续请求
  • 101 Switching Protocols:切换协议
2xx:成功(Success)
  • 200 OK:请求成功
  • 204 No Content:请求成功但无响应体,常用于无需页面刷新的请求
  • 206 Partial Content:部分内容响应,用于支持范围请求(Content-Range)
3xx:重定向(Redirection)
  • 301 Moved Permanently:永久重定向
  • 302 Found:临时重定向
  • 303 See Other:重定向到另一个地址,要求使用 GET 请求
  • 307 Temporary Redirect:临时重定向,不会更改请求方法(如 POST 不变)
  • 304 Not Modified:资源未修改,使用缓存(与条件请求有关)
4xx:客户端错误(Client Error)
  • 400 Bad Request:语法错误,服务器无法理解
  • 401 Unauthorized:未授权,需要身份验证(需带 WWW-Authenticate 响应头)
  • 403 Forbidden:服务器拒绝请求
  • 404 Not Found:请求资源不存在
  • 415 Unsupported Media Type:请求类型不支持
5xx:服务器错误(Server Error)
  • 500 Internal Server Error:服务器内部错误
  • 503 Service Unavailable:服务器暂时无法处理请求
响应头

响应头是由服务器返回的键值对,用于说明响应信息及控制客户端行为。

常见响应头字段
字段名描述
Location重定向地址,需与 3xx 状态码搭配使用
Content-Type响应体的数据类型,如 text/html;charset=UTF-8
Content-Disposition文件下载方式,如 attachment;filename=xx.zip
Set-Cookie设置客户端 Cookie
Content-Encoding响应体的压缩方式,如 gzip
Content-Length响应体的字节长度
Refresh定时刷新页面,如 3;url=http://example.com
Server服务器信息,如 Apache-Coyote/1.1(可配置)
Last-Modified响应资源的最后修改时间
Cache-Control缓存控制,如 privatepublicno-cachemax-age=秒数no-store
响应体

响应体是服务器真正发送给客户端的“正文”内容,通常为 HTML 页面、JSON 数据、图片或其他资源。

浏览器将响应体加载到内存后,进行解析、渲染并展示页面内容。

参考文章

  1. http中文文档(https://developer.mozilla.org/zh-CN/docs/Web/HTTP)
  2. HTTP/HTTPS 简介(https://www.runoob.com/http/http-intro.html)
  3. Http协议详解(深入理解)(https://blog.csdn.net/weixin_38087538/article/details/82838762)

相关文章:

  • 力扣303 区域和检索 - 数组不可变
  • ubuntu 20.04 运行和编译LOAM_Velodyne
  • EtherCAT通讯框架
  • 导轨固定螺栓的扭矩标准是多少?
  • RAC共享存储扩容
  • win11下,启动springboot时,提示端口被占用的处理方式
  • RAG策略
  • Python读取和处理TIFF数据教程 (由简入深)
  • NumPy 2.x 完全指南【十一】N 维数组对象(ndarray)
  • 庐山派 HDMI Python 图像开发 K230图像传输方案
  • 在资源受限环境下,移动端如何实现流畅动画?如何在内存、CPU、GPU、网络等多种限制条件下,依然保持动画高帧率、低延迟、不卡顿?
  • 自定义协议与序列化
  • 大型商用货运无人机强势入局2025深圳eVTOL展
  • 【硬核数学】2. AI如何“学习”?微积分揭秘模型优化的奥秘《从零构建机器学习、深度学习到LLM的数学认知》
  • 亚远景-ASPICE与ISO 21434在汽车电子系统开发中的应用案例
  • 微服务项目->在线oj系统(Java版 - 5)
  • 机器学习第十六讲:K-means → 自动把超市顾客分成不同消费群体
  • Java—— File详解
  • VTK|箱体切割器
  • 【git进阶】git rebase(变基)
  • 热点问答:特朗普与俄乌总统分别通话,他们谈了什么
  • 上海发布台风红色预警?实为演练,今日下午局部中雨下班请注意
  • 周慧芳任上海交通大学医学院附属上海儿童医学中心党委书记
  • 肖钢:一季度证券业金融科技投资强度在金融各子行业中居首
  • 国际博物馆日|航海博物馆:穿梭于海洋神话与造船工艺间
  • 哈马斯与以色列在多哈举行新一轮加沙停火谈判