HTTP/HTTPS协议详解
LDK Lv4

HTTP概述

HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础,同时,也是一种客户端—服务器(client-server)协议,也就是说,请求是由接受方——通常是 Web 浏览器——发起的。完整网页文档通常由文本、布局描述、图片、视频、脚本等资源构成。

imageimage是基于TCP协议的

image是基于QUIC协议的,而QUIC协议又是基于UDP

下文若无特殊说明,讨论的都是 imageimage.

客户端与服务端之间通过交换一个个独立的消息(而非数据流)进行通信。由客户端发出的消息被称作请求request),由服务端发出的应答消息被称作响应response)。


HTTP协议的特点

  • 应用层协议:基于 TCP(HTTP/1.1、HTTP/2)或 QUIC(HTTP/3),默认使用80端口。
  • 请求-响应模型:通信总是由客户端(如浏览器)发起请求,服务器收到请求后返回响应。服务器不会主动发送数据给客户端。
  • 无状态:协议本身不记录之前的请求信息,每个请求都是独立的。为了维护状态(如用户状态),需要借助CookieSession等机制。
  • 灵活可扩展:能够传输文本、图片、音视频等任意类型的数据。

HTTP报文

HTTP请求报文

image起始行请求头空行请求体组成。

请求行:
组成部分详情示例
请求方法规定客户端对服务器资源的操作类型GET、POST、PUT、DELETE 等
请求路径标识请求资源在服务器上的位置绝对路径,末尾跟上一个’?'和查询字符串。是最常见的形式。例如:HEAD /test.html?query=alibaba HTTP/1.1
一个完整的 URL,被称为绝对形式,主要在使用 GET 方法连接到代理时使用。例如:GET http://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages HTTP/1.1
HTTP 版本号表明使用的 HTTP协议版本HTTP/1.1、HTTP/2 等

请求行必须在HTTP请求格式的第一行

示例:

GET /background.png HTTP/1.0

请求头

包含关于客户端环境、请求的附加信息的一系列键值对。例如:

  • Host:指定服务器的域名。
  • User-Agent:浏览器版本信息。服务器通过这个请求头判断用户的软件的应用类型、操作系统、软件开发商以及版本号、浏览器内核信息等; 风控系统、反作弊系统、反爬虫系统等基本会采集这类信息做参考。
  • Connection:一般设置为keep-alive,表示开启 HTTP 持久连接
  • Accept:告知服务器客户端可以处理的内容类型。比如text/htmlapplication/json等。
  • Content-Type:请求体的数据类型(如application/json)。post 提交时才需要设置
请求体

可选部分,通常在POSTPUT等方法中,用于携带要提交的数据(如表单数据、JSON数据等)。

请求体和请求头之间有一行空行,容易被忽略,但必不可少

HTTP响应报文

服务器处理完请求后,会返回一个HTTP响应报文。它包含以下部分:

  • 状态行:包含HTTP版本、状态码和状态描述。例如 HTTP/1.1 200 OK
  • 响应头:包含服务器返回的关于响应的附加信息。常见的有:Content-Type:响应体的数据类型(如text/html; charset=utf-8)。Content-Length:响应体的长度。Set-Cookie:设置Cookie。
  • 响应体:服务器返回的实际数据,如网页的HTML代码、图片数据等

HTTP核心机制

常见的HTTP请求方法

方法描述典型应用
GET获取指定的资源。访问网页,查询数据。
POST提交数据,用于创建新资源或处理数据。提交表单,用户登录。
PUT更新服务器上已存在的资源(全部更新)。修改用户信息。
PATCH部分更新服务器上的资源。只修改用户的昵称。
DELETE删除指定的资源。删除一篇文章。
HEAD与GET类似,但只获取响应头,不返回实际内容。检查资源是否存在或是否更新。
GETPOST的主要区别
  • 参数位置GET参数附在URL后(如 ?name=value),POST参数放在请求体中。
  • 安全性GET参数暴露在地址栏,相对不安全,不适合传递密码POST相对安全。
  • 数据长度:GET有长度限制(因浏览器而异),POST理论无限制。
  • 幂等性:GET是幂等的(多次执行结果相同),通常可缓存。POST是非幂等的(多次提交可能产生不同结果),不可缓存。

重要的HTTP状态码

状态码主要表示请求的结果如何,分为5类:

分类说明常见状态码
1xx信息性状态码表示请求已被接受,需要继续处理。(较少见)
2xx成功200 OK:请求成功。
201 Created:资源创建成功。
3xx重定向301 Moved Permanently:资源已永久迁移。
302 Found:资源临时重定向。
304 Not Modified:资源未修改,可使用本地缓存。
4xx客户端错误400 Bad Request:请求语法错误。
401 Unauthorized:需要身份验证。
403 Forbidden:服务器拒绝执行(权限不足)。
404 Not Found:请求的资源未找到。
5xx服务器错误500 Internal Server Error:服务器内部错误。
502 Bad Gateway:网关错误。
503 Service Unavailable:服务暂时不可用。

连接管理

  • 短连接(HTTP/1.0默认):每次请求-响应都需建立新的TCP连接,完成后立即关闭。性能差。
  • 长连接(HTTP/1.1默认):通过Connection: keep-alive实现,允许在同一TCP连接上发送多个HTTP请求,减少了建立和关闭连接的开销。
  • 管道化:允许客户端在同一个连接上连续发送多个请求而无需等待响应,但服务器必须按请求顺序返回响应。
  • 多路复用(HTTP/2):是管道化的真正实现,多个请求和响应可以同时在一个连接上混杂传输,互不阻塞,彻底解决了队头阻塞问题

HTTPS协议

由于HTTP是明文传输的,存在窃听、篡改和身份伪装三大风险。因此,HTTPS应运而生。

HTTPS = HTTP + SSL/TLS加密层。它通过以下方式保障安全:

  1. 加密:对传输的数据进行加密,防止被窃听。
  2. 认证:通过证书验证服务器身份,防止钓鱼网站。
  3. 完整性保护:验证数据在传输过程中未被篡改。

HTTPS的核心其实是在HTTP协议之下,TCP协议之上加了一层SSL/TLS加密层。

TLS握手

当首次访问一个HTTPS网站时,浏览器和服务器之间会进行一次关键的 TLS 握手。以目前主流的 TLS 1.2 为例,其核心过程可被概括为“四次握手”:

  1. Client Hello(客户端问候):你的浏览器向服务器发送信息,包括:支持的 TLS 版本、支持的加密套件列表、一个客户端随机数。
  2. Server Hello(服务器问候):服务器从客户端提供的列表中选择一个 TLS 版本和加密套件,并返回:选定的 TLS 版本和加密套件、一个服务器随机数、它的 SSL 证书(其中包含服务器的公钥)。
  3. 密钥交换与验证:你的浏览器验证服务器证书的有效性。验证通过后,浏览器会生成一个预主密钥,并使用服务器证书中的公钥对其加密,然后发送给服务器。服务器用自己的私钥解密,得到预主密钥。
  4. 完成握手:此时,客户端和服务器双方都拥有了三个值:客户端随机数、服务器随机数和预主密钥。它们利用这三个值独立计算出本次会话所需的会话密钥。随后双方交换一条加密的“完成”消息,确认握手成功。此后,双方的所有应用数据(即HTTP请求和响应)都将使用这个会话密钥进行高效的对称加密传输

TLS 1.3 版本对此过程做了大幅简化,将握手所需的时间(往返延迟,RTT)减少到了一次,甚至在某些情况下可以实现 0-RTT,显著提升了连接速度。

SSL/TLS握手过程

由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
总字数 40.1k 访客数 访问量