珊珊老师 的笔记

做最负责任的教育~我是执行者珊珊

2025-03-28 15:52

HTTP 协议

珊珊老师

Java后端

(20)

(0)

收藏

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)

image.png

灵活性(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 的区别

image.png

HTTP 的通信是明文的,数据在传输过程中容易被截获或篡改,而 HTTPS(HTTP Secure) 是基于 HTTP 协议的一种安全协议,通过加入 SSL/TLS 加密层确保数据安全性。主要区别如下:

image.png

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 的一些固有问题,如握手延迟和连接迁移问题。

image.png

2. HTTP 协议的工作过程

2.1 HTTP 通信的完整流程

1. DNS 解析

image.png

用户在浏览器中输入的网址(如 www.example.com)是一个域名。计算机无法直接识别域名,需要通过 DNS(域名系统)解析将域名转换为服务器的 IP 地址。例如:www.example.com → 192.168.1.1。


工作机制:

1.浏览器先查询本地 DNS 缓存中是否有对应的记录。

2.如果没有,向本地 DNS 服务器发起查询,逐级请求权威 DNS 服务器,直到获取 IP 地址。


2. 建立连接

image.png

客户端通过 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 数据等)。


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 数据、图片等。


image.png

5. 关闭或保持连接

  • 如果启用了 Keep-Alive(HTTP/1.1 默认开启),连接会保持一段时间,供后续请求复用,减少握手延迟。

  • 如果未启用或超时,连接将被关闭。


0条评论

点击登录参与评论