【计算机网络】HTTP 协议入门——万字详解!
【计算机网络】HTTP 协议入门——万字详解!
文章目录
- 【计算机网络】HTTP 协议入门——万字详解!
 - 
- 1. HTTP 协议简介
 - 
- 1.1 什么是 HTTP?
 - 1.2 HTTP 的核心特点
 - 1.3 HTTP 和 HTTPS 的区别
 - 1.4 HTTP 的版本
 
 - 2. HTTP 协议的工作过程
 - 
- 2.1 HTTP 通信的完整流程
 - 2.2 HTTP 通信的基础术语
 - 2.3 HTTP 交互的举例说明
 
 - 3. HTTP 请求(Request)
 - 
- 3.1 URL 介绍
 - 3.2 请求方法(Method)
 
 - 4. HTTP 响应(Response)
 - 
- 4.1 状态码(Status Code)
 - 
- 1.常见状态码
 
 - 4.2 响应报头(Header)
 - 
- 1.常见响应头
 
 
 - 5. HTTPS(HyperText Transfer Protocol Secure)
 - 
- 5.1 HTTPS 的主要功能
 - 5.2 HTTPS 的工作原理
 - 5.3 HTTP 与 HTTPS 的对比
 - 5.4 HTTPS 的缺点
 - 5.5 如何实现 HTTPS
 - 5.6 HTTPS 的常见问题
 
 - 其他
 
 
1. HTTP 协议简介
1.1 什么是 HTTP?

HTTP(HyperText Transfer Protocol) 是超文本传输协议,它是万维网的基础,主要用于客户端(如浏览器)与服务器之间的数据交换。HTTP 协议在网络通信中扮演着“桥梁”的角色,负责将用户的请求传递到服务器,并将服务器的响应返回给客户端。
HTTP 协议运行在 应用层,依赖 TCP/IP 协议栈进行数据的可靠传输。这种分层设计使得 HTTP 只需关注数据内容,而将传输的复杂性交给下层协议处理。
1.2 HTTP 的核心特点
HTTP 协议的设计具有以下几个核心特点,使得它成为互联网中最广泛使用的协议之一:
- 
无状态性(Stateless)
- HTTP 协议是无状态的,这意味着每次请求都是独立的,服务器不会自动保存任何前一次请求的上下文信息。
 - 这种无状态设计简化了服务器的实现,但为了满足需要“记住”用户状态的场景(如登录),可以通过 Cookie 或 Session 等机制实现状态管理。
 
 - 
请求-响应模型(Request-Response Model)

- HTTP 是基于请求-响应的协议。客户端发送 HTTP 请求 (Request),服务器处理并返回一个 HTTP 响应 (Response)。
 - 每次交互由以下流程组成:客户端发起请求,服务器解析请求并生成响应,然后将数据返回给客户端。
 
 - 
灵活性(Flexibility)
- HTTP 支持传输多种类型的数据,如纯文本(text/html)、图片(image/jpeg)、音频(audio/mp3)、视频(video/mp4)等。
 - 数据类型由响应中的 Content-Type 字段指定,客户端会根据这个字段解析内容。
 
 - 
无连接性(Connectionless)
- HTTP 协议在早期版本中是无连接的,即每次请求完成后,连接就会关闭。
 - 从 HTTP/1.1 开始,加入了 Keep-Alive 机制,使得连接可以被复用,从而提高了效率。
 
 - 
可扩展性(Extensibility)
- HTTP 协议支持通过自定义头部字段或扩展功能(如 WebSocket)来满足新的需求。这种设计让 HTTP 能够不断适应互联网的变化。
 
 - 
跨平台性与普适性
- HTTP 是与平台无关的协议,几乎所有支持网络通信的设备和编程语言都可以实现 HTTP 客户端或服务器。
 
 
1.3 HTTP 和 HTTPS 的区别

HTTP 的通信是明文的,数据在传输过程中容易被截获或篡改,而 HTTPS(HTTP Secure) 是基于 HTTP 协议的一种安全协议,通过加入 SSL/TLS 加密层确保数据安全性。
主要区别如下:
1.4 HTTP 的版本
HTTP 协议在不断迭代中发展,主要版本包括:
- 
HTTP/1.0
- 引入基本的请求-响应模型。
 - 每次请求都会新建一个连接,请求结束后关闭连接,效率较低。
 
 - 
HTTP/1.1
- 默认支持 持久连接(Keep-Alive),提升了性能。
 - 引入了 管线化(Pipelining),允许客户端在等待响应的同时发送多个请求(虽然实际应用较少)。
 
 - 
HTTP/2.0
- 基于二进制帧传输数据,替代了传统的文本格式。
 - 支持 多路复用(Multiplexing),在单个连接上同时传输多个请求和响应,避免了 HTTP/1.x 的“队头阻塞”问题。
 - 引入了 服务器推送(Server Push),允许服务器主动向客户端发送资源,减少延迟。
 
 - 
HTTP/3.0
- 基于 QUIC 协议(使用 UDP),进一步提升传输效率和可靠性。
 - 解决了 TCP 的一些固有问题,如握手延迟和连接迁移问题。
 
 

2. HTTP 协议的工作过程
HTTP 协议在客户端(如浏览器、移动应用等)和服务器之间按照“请求-响应”模型进行通信。
2.1 HTTP 通信的完整流程
1. DNS 解析
 
用户在浏览器中输入的网址(如 www.example.com)是一个域名。计算机无法直接识别域名,需要通过 DNS(域名系统)解析将域名转换为服务器的 IP 地址。例如:www.example.com → 192.168.1.1。
- 工作机制:
1.浏览器先查询本地 DNS 缓存中是否有对应的记录。
2.如果没有,向本地 DNS 服务器发起查询,逐级请求权威 DNS 服务器,直到获取 IP 地址。 
2. 建立连接
 
客户端通过 TCP 三次握手 与服务器建立连接,确保数据传输的可靠性。
- 三次握手的过程:
1.客户端发送 SYN 报文,表示希望建立连接。
2.服务器收到后,返回 SYN-ACK 报文,表示同意建立连接。
3.客户端再发送 ACK 报文,确认连接成功。 
在 HTTPS 中,还会增加 TLS 握手流程,完成加密通信的密钥协商。
3. 发送 HTTP 请求
连接建立后,客户端向服务器发送 HTTP 请求报文。请求报文包括以下几个部分:
- 
请求行(Request Line)
- 指定客户端希望服务器执行的操作。
 - 结构:
- 方法:如 GET、POST、PUT、DELETE,指示请求的操作类型。
 - 请求 URI:目标资源的路径,包括主机名、端口号(如非默认)、资源路径和查询字符串。
 - HTTP 版本:指定所使用的 HTTP 协议版本(如 HTTP/1.1、HTTP/2)。
 
 - 示例:
GET /index.html HTTP/1.1 
 - 
请求头(Request Headers)
- 包含客户端的元信息,用于说明请求的上下文。
 - 常见的请求头:
- Host:目标服务器的主机名(必须包含端口号,若非默认)。
 - User-Agent:标识客户端类型(如浏览器或其他工具)。
 - Accept:客户端可接受的响应内容类型。
 - Accept-Encoding:客户端支持的压缩编码(如 gzip、deflate)。
 - Content-Length:请求体的长度(如有)。
 
 
 - 
空行
- 请求头和请求体之间的分隔符,表示请求头部分结束。
 
 - 
请求体(Request Body,非必需)
- 适用于 POST 和 PUT 等方法,用于传递数据(如表单、JSON 数据等)。
 
 

例如,打开百度,需要向百度的服务器发送一个GET请求来获取页面,用抓包软件抓到了这个 Request 数据包,如下
GET / HTTP/1.1Host: www.baidu.comAccept-Language: zh-CN,zh;q=0.9Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflate, brConnection: keep-alive(空行,表示结束请求头)
4. 服务器处理请求并返回 HTTP 响应
服务器接收到请求后,解析请求报文,根据 URI 定位目标资源,执行相应操作(如读取文件或查询数据库),然后生成 HTTP 响应报文并返回给客户端。
一个完整的 HTTP 响应消息也由四部分组成:
- 
状态行(Status Line)
- 表明响应结果的状态信息。
 - 结构:
- HTTP 版本:与请求的版本匹配。
 - 状态码:三位数字,表示请求的处理结果(如 200 表示成功,404 表示资源未找到)。
 - 状态信息:状态码的描述。
 
 - 示例:
HTTP/1.1 200 OK 
 - 
响应头(Response Headers)
- 包含服务器的元信息,用于说明响应的上下文。
 - 常见的响应头:
- Content-Type:响应体的内容类型(如 text/html、application/json)。
 - Content-Length:响应体的大小(字节数)。
 - Server:提供服务的服务器软件信息(如 Apache、Nginx)。
 - Set-Cookie:设置客户端的 Cookie 信息。
 
 
 - 
空行
- 响应头和响应体之间的分隔符,表示响应头部分结束。
 
 - 
响应体(Response Body,非必需)
- 包含返回的数据内容,如 HTML 页面、JSON 数据、图片等。
 
 

响应报文的一般格式
HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1024 Server: Apache/2.4.41 (Ubuntu) (空行,表示结束响应头) Example  Welcome to the Lingbou blog!
5. 关闭或保持连接
- 如果启用了 Keep-Alive(HTTP/1.1 默认开启),连接会保持一段时间,供后续请求复用,减少握手延迟。
 - 如果未启用或超时,连接将被关闭。
 
2.2 HTTP 通信的基础术语
- 
客户端(Client)
- 发起请求的一端,通常是浏览器、移动端应用或其他工具(如 Postman)。
 - 客户端的主要任务是生成请求报文并解析服务器返回的响应内容。
 
 - 
服务器(Server)
- 接收并处理请求的一端,通常是 Web 服务器(如 Apache、Nginx、IIS 等)。
 - 服务器负责根据请求生成响应数据并返回给客户端。
 
 - 
请求(Request)
- 请求报文由客户端构造并发送给服务器,通常包含请求方法(如 GET、POST)、目标 URL 及附加数据(如请求头和请求体)。
 
 - 
响应(Response)
- 响应报文由服务器生成并返回给客户端,通常包含状态信息(如 200 OK、404 Not Found)及资源数据(如 HTML 页面或 JSON 数据)。
 
 
2.3 HTTP 交互的举例说明
假设用户访问 https://www.example.com/login,以下是每个步骤的具体表现:
- 
DNS 解析
- 域名 
www.example.com解析为 IP 地址192.0.2.1。 
 - 域名 
 - 
TCP 连接
- 客户端与 
192.0.2.1建立 TCP 连接,三次握手完成。 
 - 客户端与 
 - 
发送请求
- 客户端发送 HTTP GET 请求:
 
GET /login HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/96.0 Accept: text/html - 
服务器响应
- 服务器返回 HTTP 响应:
 
HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1024Login Welcome to the Lingbou blog. - 
页面显示
- 浏览器解析 HTML 代码,并向服务器请求页面中的附加资源(如 CSS 文件、图片)。最终显示完整的登录页面。
 
 
3. HTTP 请求(Request)
3.1 URL 介绍
URL(Uniform Resource Locator) 是统一资源定位符,用于描述网络资源的地址和访问方法。
URL 的格式 :
协议://[凭证信息@]服务器地址[:端口号][/资源路径][?查询参数][#片段标识符]
URL 各部分解析
协议:
- 指定数据传输的方式,常见协议包括 HTTP、HTTPS、FTP 等。
 - 示例:
 http://或https://凭证信息(可选):
- 包括用户名和密码,用于授权访问。
 - 格式:
 username:password@- 示例:
 ftp://user:pass@ftp.example.com服务器地址:
- 表示目标主机,可以是域名(如
 www.example.com)或 IP 地址(如192.168.1.1)。端口号(可选):
- 指定服务监听的端口,默认端口为
 80(HTTP)或443(HTTPS)。- 示例:
 http://www.example.com:8080资源路径:
- 服务器资源的具体位置,如文件路径或接口路径。
 - 示例:
 /path/to/resource查询参数(可选):
- 使用
 ?开头,以键值对的形式传递参数,多个参数用&分隔。- 示例:
 ?key1=value1&key2=value2片段标识符(可选):
- 使用
 #开头,用于定位页面中的某一部分。- 示例:
 #section1
URL 示例:
https://www.example.com:443/api/v1/resource?user=alice&action=view#details
- 协议:
https - 服务器地址:
www.example.com - 端口号:
443 - 资源路径:
/api/v1/resource - 查询参数:
user=alice&action=view - 片段标识符:
details 
3.2 请求方法(Method)
HTTP 定义了一系列请求方法,用于描述客户端对资源的操作。
以下表格概述了常见请求方法的功能及其特点:
GET方法与POST方法对比
?key=value,数据暴露在地址栏。幂等性的定义 :一个操作是幂等的,意味着无论执行一次还是多次,产生的结果都是相同的,对服务器的状态没有额外的副作用。
HTTP 请求中的幂等性
- GET:幂等的,每次请求只读取资源,不会修改服务器的状态。例如,访问某网页多次,返回的内容是一样的。
 - PUT:幂等的,执行多次更新相同资源的请求,最终结果是一样的。例如,将某资源的值更新为 10,无论请求一次还是多次,最终结果都是 10。
 - DELETE:幂等的,多次删除相同资源,最终结果是资源被删除。
 - POST:非幂等的,每次请求可能都会创建新的资源或产生副作用。例如,重复提交订单可能会多次扣款或创建多个订单。
 
GET 示例
GET /search?q=HTTP HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html 
POST 示例
POST /api/login HTTP/1.1 Host: www.example.com Content-Type: application/json Content-Length: 47 {\"username\":\"alice\",\"password\":\"secure123\"}
请求方法扩展
- PATCH:只更改资源部分数据,例如修改用户的部分信息而不是覆盖整个用户记录。
 - OPTIONS:在跨域请求中,用于检查目标服务器支持哪些请求方法。
 - TRACE:用于调试网络请求,查看请求路径是否被修改。
 - CONNECT:用于建立 HTTPS 隧道,通过代理服务器加密数据。
 
4. HTTP 响应(Response)
4.1 状态码(Status Code)

HTTP 状态码是服务器用于表示请求处理结果的三位数字代码。状态码分为五大类,每类代表不同的处理结果。
状态码分类
1.常见状态码
GET 或 POST 请求POST 或 PUT)4.2 响应报头(Header)
响应头包含有关响应的元数据,描述服务器返回的内容和状态。
1.常见响应头
Wed, 29 Nov 2024 12:00:00 GMTApache/2.4.1 (Unix)text/html; charset=UTF-83145gzip 或 deflatezh-CNno-cache、max-age=3600keep-alive 或 closesessionId=abc123; Path=/; Secure\"33a64df551425fcc55e6\"Wed, 29 Nov 2024 11:00:00 GMT/new-resourcemax-age=31536000; includeSubDomainsSAMEORIGIN 或 DENYnosniff1; mode=block示例 HTTP 响应
响应成功(200 OK)
HTTP/1.1 200 OKDate: Wed, 29 Nov 2024 12:00:00 GMTServer: Apache/2.4.1 (Unix)Content-Type: text/html; charset=UTF-8Content-Length: 1234 Hello, World!
资源未找到(404 Not Found)
HTTP/1.1 404 Not FoundDate: Wed, 29 Nov 2024 12:00:00 GMTServer: Apache/2.4.1 (Unix)Content-Type: text/html; charset=UTF-8Content-Length: 153 Resource not found!
5. HTTPS(HyperText Transfer Protocol Secure)
HTTPS 是 HTTP 的安全版本,通过 SSL/TLS 协议对数据进行加密,保护传输数据的 保密性、完整性 和 身份真实性。它是现代互联网通信安全的核心技术。
5.1 HTTPS 的主要功能
- 
加密
HTTPS 通过加密算法保护数据在传输过程中的隐私性,防止被第三方窃听:- 对称加密:通信双方使用相同的密钥对数据加密和解密,速度快但密钥需要安全传递。
 - 非对称加密:服务器提供公钥,客户端用公钥加密数据,服务器用私钥解密数据,用于解决密钥分发问题。
 - 实际通信中,两种加密方式配合使用:非对称加密用于密钥交换,对称加密用于数据传输。
 
 - 
数据完整性
通过 消息摘要算法(如 SHA-256)生成哈希值,验证数据是否在传输过程中被篡改。如果数据被篡改,哈希值校验不匹配,通信会被终止。 - 
身份验证
HTTPS 使用 数字证书 来验证服务器的身份。- 数字证书由 权威证书颁发机构(CA) 签发,包含服务器的公钥和域名信息。
 - 浏览器通过验证证书的合法性(如是否由可信 CA 签发、证书是否过期)确保通信目标是预期的服务器,防止 中间人攻击。
 
 
5.2 HTTPS 的工作原理
HTTPS 使用 SSL/TLS 协议,主要分为两个阶段:握手阶段和数据传输阶段。
1. 握手阶段
 客户端与服务器协商通信方式和加密方式的过程:
- 客户端向服务器发送请求,包含支持的加密算法列表和随机数(用于生成密钥)。
 - 服务器返回自己的数字证书(包含公钥)和一个随机数。
 - 客户端验证证书的合法性(CA 签名、域名匹配、有效期等)。
如果验证通过,客户端生成一个新的随机数并使用服务器的公钥加密后发送给服务器。 - 服务器用私钥解密随机数,三组随机数生成 会话密钥,用于后续对称加密。
 
2. 数据传输阶段
 握手完成后,客户端和服务器使用对称加密的会话密钥加密数据进行通信,确保数据高效传输和安全性。
5.3 HTTP 与 HTTPS 的对比
5.4 HTTPS 的缺点
- 
性能开销:
- 加解密过程需要更多计算资源,增加了服务器和客户端的 CPU 和内存消耗。
 - 特别是在高并发场景下,性能影响更明显。
 - TLS 1.3 版本优化了握手过程,性能影响已显著降低。
 
 - 
证书成本:
- 获取权威 CA 签发的证书需要支付费用。
 - 不过免费 CA(如 Let’s Encrypt)为许多小型网站提供免费证书。
 
 - 
部署复杂性:
- HTTPS 需要正确配置服务器、证书和加密协议。
 - 还需定期更新证书以保持其有效性。
 
 
5.5 如何实现 HTTPS
- 
获取数字证书
- 申请证书:
通过权威 CA(如 DigiCert、Let’s Encrypt)申请 SSL/TLS 证书。 - 配置域名和服务器:确保域名与服务器 IP 映射正确,方便证书申请验证。
 
 - 申请证书:
 - 
配置服务器
- 在服务器(如 Apache、Nginx)启用 SSL/TLS 模块。
 - 加载证书文件并指定私钥路径。
 - 强制使用 TLS 1.2 或 TLS 1.3,并禁用旧的、不安全的协议版本(如 SSL、TLS 1.0 和 1.1)。
 
 - 
重定向 HTTP 到 HTTPS
- 配置 301 永久重定向规则,将所有 HTTP 请求跳转到 HTTPS。
 
 - 
测试 HTTPS
- 使用工具(如 SSL Labs)测试 HTTPS 配置,确保证书有效性和安全性。
 
 
5.6 HTTPS 的常见问题
- 
证书无效:
可能因为证书过期、域名与证书不匹配或使用了不被信任的 CA 签发的证书。- 解决:检查证书有效性,使用可信 CA 签发的证书。
 
 - 
混合内容警告:
HTTPS 页面中加载了非 HTTPS 的资源(如图片、脚本)。- 解决:确保页面所有资源均通过 HTTPS 加载。
 
 - 
性能影响:
在高并发场景下,加密计算会增加服务器开销。- 解决:启用 HTTP/2 和 TLS 1.3,使用 CDN 缓解服务器压力。
 
 
其他
【计算机网络】计算机网络基础知识——万字详解!!!
【计算机网络】IPv4地址 & 子网掩码 & MAC地址 & 网关 & DNS解析
【计算机网络】本机DNS服务器与解析地址查看


