1)HTTP 协议
1. HTTP 简介
关键词:应用层、传输、协议、请求&响应、TCP/IP、无状态。
HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是万维网(World Wide Web, WWW)中用于传输超文本的标准协议。它用于从 Web 服务器将数据(如 HTML 文件、图片文件、视频流、查询结果等)传输到客户端(如浏览器)。HTTP 是一种 基于请求-响应模型 的协议,通常用于浏览器与服务器之间的通信。
HTTP 工作在 应用层,通过 TCP/IP 协议栈 传输数据,其中 TCP 提供可靠的传输服务。HTTP 协议通过客户端和服务器之间的请求和响应交换数据,支持文本、图像、视频、音频等多种媒体类型。其无状态(Stateless)和无连接(Connectionless)特点意味着每次请求都是独立的,服务器不会保留客户端请求的历史信息。
HTTP 作为 Web 上的基础协议,通常与 HTTPS(即安全版本的 HTTP)结合使用,以提供加密通信保障数据传输的安全性。
关键特点:
- 基于 TCP/IP 协议:HTTP 依赖于底层的 TCP/IP 协议进行数据传输。
- 无状态协议:每次请求与响应之间没有持久连接或记忆,服务器不会保存客户端的历史状态。
- 请求-响应模型:客户端发起请求,服务器响应请求并返回数据。
- 跨平台支持:HTTP 是独立于操作系统、硬件平台的协议,广泛支持不同类型的设备与浏览器。
小提示
HTTP 协议 可以理解为浏览器和服务器之间沟通的“语言”,它规定了浏览器如何向服务器请求资源,以及服务器如何响应这些请求。这就像你去餐馆点菜,服务员把你点的菜(数据)从厨房(服务器)拿到你桌上(浏览器)。如果“语言”不通,你当然拿不到你想要的菜了。
2. HTTP 协议的主要特点
场景: WEB 通信。
请求-响应模型:客户端(浏览器)发出请求,服务器返回响应。每次请求和响应都是独立的。
无状态协议:每个请求都是独立的,服务器不会保存历史信息。
无连接协议:每次请求建立独立连接,处理完毕后关闭连接,除非使用持久连接(如 HTTP/1.1 中的持久连接
keep-alive
)。基于 TCP/IP 协议:依赖 TCP 保证数据可靠传输,IP 定位服务器。
支持多媒体类型:除了 HTML,还能传输文本、图片、音频、视频等多种数据。
跨平台支持:独立于操作系统和硬件,可以在不同平台之间通信。
可扩展性:支持扩展请求方法、状态码和自定义头部字段。如 HTTP/2 引入了多路复用、头部压缩等新特性,提升了性能。
安全性(HTTPS):HTTP 本身不加密数据,HTTPS 使用 SSL/TLS 加密传输。
多种请求方法:包括 GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。
状态码:响应中包含状态码,指示请求结果(如 200 OK,404 Not Found,500 Server Error)。
小提示:B/S
vs C/S
模式的对比
特性 | B/S 模式 | C/S 模式 |
---|---|---|
客户端 | 浏览器(跨平台) | 专有客户端程序(需安装和更新) |
服务器 | 处理核心逻辑,数据存储 | 处理核心逻辑,数据存储 |
网络依赖 | 高依赖网络 | 可以支持离线工作(部分客户端) |
维护性 | 服务器端维护更新,客户端无需操作 | 客户端和服务器都需要维护和更新 |
应用类型 | Web 应用(浏览器访问) | 桌面应用(需要安装特定客户端) |
用户体验 | 受限于浏览器性能 | 可以利用客户端设备的计算能力 |
适用场景 | Web 应用、跨平台应用、轻量级应用 | 企业级应用、高性能图形、游戏等 |
举例 | 1)Web 应用,如 Gmail、Facebook 等。 2)所有可以通过浏览器访问的 Web 应用。 | 1)办公软件(如 Microsoft Office,Outlook 等) 2)游戏客户端(如 PC 游戏客户端)。 3)企业级软件(如财务软件、ERP 系统等)。 |
3. HTTP URL
URL(Uniform Resource Locator,统一资源定位符)是互联网上标识资源位置的标准字符串。在 HTTP 协议中,URL 用于指定服务器上的特定资源或页面,以便客户端(通常是浏览器)能够通过 HTTP 请求来访问它。
URL 的基本结构
一个标准的 URL 通常包括以下几个部分:
http://[用户名:密码@]主机名[:端口]/路径[?查询字符串][#片段标识符]
各部分解释:
协议(Scheme):
- 格式:
http://
或https://
- 表示客户端和服务器之间通信使用的协议类型,
http
表示非加密连接,https
表示加密连接(SSL/TLS)。
- 格式:
用户名和密码(可选):
- 格式:
用户名:密码@
- 如果 URL 需要身份验证,客户端可以在 URL 中提供用户名和密码。例如:
http://user:password@www.example.com
。 - 这种方式现在不常见,通常会通过浏览器的登录对话框或 HTTP 头部进行认证。
- 格式:
主机名(Host):
- 格式:
www.example.com
- 主机名指定了 Web 服务器的域名或 IP 地址,客户端通过 DNS 查询这个主机名对应的 IP 地址。
- 可以是域名(如
www.example.com
)或者是 IP 地址(如192.168.1.1
)。
- 格式:
端口(Port, 可选):
- 格式:
:端口号
- 表示 Web 服务器所使用的网络端口。默认情况下,HTTP 使用端口 80,HTTPS 使用端口 443。如果服务器使用了不同的端口,则需要在 URL 中指定。
- 例如:
http://www.example.com:8080
表示通过端口 8080 访问该网站。
- 格式:
路径(Path):
- 格式:
/路径/文件
- 表示 Web 服务器上的资源位置或文件路径。例如:
http://www.example.com/about
指向网站中的 “about” 页面。路径部分用于确定服务器上的特定文件或目录。
- 格式:
查询字符串(Query String, 可选):
- 格式:
?参数名=参数值&参数名=参数值
- 查询字符串用于在 URL 中传递参数,它以
?
开头,后面可以跟一个或多个键值对,用&
分隔。例如:http://www.example.com/search?q=HTTP
表示搜索查询参数q=HTTP
。 - 查询字符串常用于 GET 请求中的数据传递。
- 格式:
片段标识符(Fragment Identifier, 可选):
- 格式:
#片段
- 用于指向页面中的某个特定部分,常用于锚点链接。例如:
http://www.example.com/about#team
指向 “about” 页面中的 “team” 部分。
- 格式:
URL 示例
标准 HTTP URL:
http://www.example.com/about
解释:
- 使用 HTTP 协议
- 访问
www.example.com
网站上的about
页面
带查询参数的 URL:
https://www.example.com/search?q=HTTP&sort=date
解释:
- 使用 HTTPS 协议
- 查询参数
q=HTTP
表示搜索词,sort=date
表示按照日期排序
带端口号的 URL:
http://www.example.com:8080/page
解释:
- 使用 HTTP 协议
- 访问
www.example.com
的端口 8080 上的/page
路径
带片段标识符的 URL:
http://www.example.com/about#team
解释:
- 使用 HTTP 协议
- 访问
www.example.com/about
页面,并跳转到页面中的team
部分
URL 相关的 HTTP 请求
在 HTTP 协议中,URL 用于标识请求的资源位置。客户端(如浏览器)通过 URL 发起请求,HTTP 请求中包含了该 URL 及其他相关信息(如请求头、请求方法等),服务器根据 URL 来决定如何处理请求并返回响应。
例如:
- GET 请求:客户端请求指定 URL 的资源,返回网页或数据。
- POST 请求:客户端向服务器提交数据,通常用于表单提交或文件上传。
总结
URL 是在互联网上标识资源位置的标准方式,它由协议、主机名、路径、查询参数等部分组成。在 HTTP 协议中,URL 是客户端与服务器进行通信的基础,客户端通过 URL 来定位需要访问的资源或页面。
4. HTTP 报文
HTTP 报文 是 HTTP 协议中客户端和服务器之间交换数据的基本单位。每次 HTTP 请求和响应都由一个报文组成,报文包含了请求或响应的具体内容。
4.1 HTTP 报文的组成
HTTP 请求报文(Request)
请求行 请求头 空行 请求体(可选)
vbGET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml
HTTP 响应报文(Response)
状态行 响应头 空行 响应体
phpHTTP/1.1 200 OK Content-Type: text/html Content-Length: 3425 Server: Apache <!DOCTYPE html> <html> <head><title>Welcome to Example</title></head> <body><h1>Example Page</h1></body> </html>
每个报文包含了头部信息和体部信息,头部用于描述数据的相关属性和传输要求,体部则包含实际的数据内容。通过 HTTP 报文,客户端和服务器能够实现数据传输、请求响应等功能。
4.2 HTTP 头部字段
分类 | 头部字段 | 描述 | 示例 |
---|---|---|---|
请求头 | Host | 指定请求目标服务器的域名和端口(必须) | Host: www.example.com |
User-Agent | 指定客户端软件的名称和版本号 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0 | |
Accept | 指定客户端能够接收的媒体类型 | Accept: text/html, application/xhtml+xml | |
Authorization | 用于发送身份验证信息,如基本认证或 Bearer Token | Authorization: Bearer <token> | |
Cookie | 携带客户端的 Cookies,用于会话识别 | Cookie: sessionId=abc123; userId=456 | |
Content-Type | 指定请求体中的数据类型 | Content-Type: application/json | |
Content-Length | 指定请求体的长度(字节数) | Content-Length: 348 | |
Accept-Encoding | 指定客户端支持的内容编码方式,如压缩格式(gzip) | Accept-Encoding: gzip, deflate | |
Origin | 指示跨域请求的源头 | Origin: https://www.client.com | |
响应头 | Content-Type | 指定响应体中的数据类型 | Content-Type: text/html; charset=UTF-8 |
Content-Length | 指定响应体的长度(字节数) | Content-Length: 1234 | |
Set-Cookie | 在响应中设置一个或多个 Cookie | Set-Cookie: sessionId=abc123; Path=/; HttpOnly | |
Location | 指示客户端应重定向到哪个 URL | Location: https://www.example.com/new-location | |
Cache-Control | 控制缓存策略 | Cache-Control: no-cache, no-store, must-revalidate | |
Access-Control-Allow-Origin | 指定允许哪些源访问资源(用于跨域资源共享 CORS) | Access-Control-Allow-Origin: * | |
Strict-Transport-Security (HSTS) | 强制浏览器使用 HTTPS 进行通信 | Strict-Transport-Security: max-age=31536000; includeSubDomains | |
WWW-Authenticate | 服务器要求客户端进行身份验证的头部 | WWW-Authenticate: Basic realm="Example" | |
通用头部 | Date | 响应生成的时间 | Date: Wed, 21 Oct 2015 07:28:00 GMT |
Connection | 指定是否保持连接(如长连接) | Connection: keep-alive | |
Transfer-Encoding | 指定传输编码方式(如分块传输编码) | Transfer-Encoding: chunked | |
Upgrade | 客户端请求将连接协议升级到其他协议(如 WebSocket) | Upgrade: h2c | |
实体头部 | Content-Type | 指定消息体中的媒体类型 | Content-Type: application/json |
Content-Length | 指定消息体的长度(字节数) | Content-Length: 1234 | |
Content-Encoding | 指定响应体的内容编码方式(如压缩) | Content-Encoding: gzip | |
Last-Modified | 指定响应体最后修改的时间 | Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT | |
ETag | 资源的实体标识符,用于缓存验证(如 If-None-Match ) | ETag: "686897696a7c876b7e" |
5. HTTP 状态码
HTTP 状态码 是服务器在响应 HTTP 请求时返回的三位数字,用于指示请求的处理结果。状态码可以帮助客户端(如浏览器)了解请求的状态,并采取相应的处理措施。状态码通常跟随在 HTTP 响应报文的 状态行 中。
5.1 状态码分类
HTTP 状态码按照功能可以分为五个类别
- 1xx:信息性状态码(Informational)
- 2xx:成功状态码(Successful)
- 3xx:重定向状态码(Redirection)
- 4xx:客户端错误状态码(Client Error)
- 5xx:服务器错误状态码(Server Error)
5.2 常见的 HTTP 状态码总结
状态码 | 描述 | 典型场景 |
---|---|---|
200 | OK | 请求成功,返回资源或数据 |
301 | Moved Permanently | 资源永久移动到新位置 |
302 | Found (临时重定向) | 资源临时移动到新位置 |
400 | Bad Request | 请求无效或参数缺失 |
401 | Unauthorized | 未认证,需提供身份验证 |
403 | Forbidden | 访问被拒绝,没有权限 |
404 | Not Found | 请求的资源未找到 |
500 | Internal Server Error | 服务器内部错误 |
503 | Service Unavailable | 服务器暂时无法处理请求 |
6. HTTP 方法
HTTP 方法(也叫 HTTP 动作 或 请求方法)是客户端(如浏览器)向服务器发出请求时所使用的动作指令。不同的 HTTP 方法表示不同类型的操作,如获取数据、提交数据、删除数据等。HTTP 方法是 RESTful API 中的核心组成部分,设计和使用这些方法时要遵循一定的语义规则。
HTTP 方法 | 描述 | 常见用途 |
---|---|---|
GET | 获取资源 | 请求网页内容、获取数据或文件 |
POST | 提交数据,创建资源 | 提交表单数据、创建新资源 |
PUT | 更新或替换资源 | 完全替换资源的内容(如更新用户资料) |
PATCH | 部分更新资源 | 更新资源的某些字段 |
DELETE | 删除资源 | 删除用户、文章、评论等资源 |
HEAD | 获取响应头部信息,类似 GET,但不返回响应体 | 获取资源的元数据,如文件大小、修改时间等 |
OPTIONS | 查询服务器支持的 HTTP 方法 | 跨域请求(CORS)预检请求 |
TRACE | 跟踪请求在服务器中的路径 | 调试请求路径 |
CONNECT | 建立隧道连接,通常用于 HTTPS 请求 | 与代理服务器建立安全连接(如 HTTPS) |
HTTP 方法决定了客户端和服务器之间交互的类型和目的。常见的 HTTP 方法包括 GET、POST、PUT、DELETE 等,每个方法对应不同的操作:获取资源、提交数据、更新数据或删除资源等。
OPTIONS
方法常用于 跨域请求(CORS)中的预检请求,即浏览器发送的 预请求。当浏览器发起跨域请求时,如果请求方法不是简单请求(如GET
或POST
,且符合特定条件),浏览器会首先发送一个OPTIONS
请求,检查服务器是否允许跨域访问。
OPTIONS
- OPTIONS 方法用于检查服务器是否支持跨域请求,特别是用于 预检请求。
- 它主要应用于浏览器的跨域资源共享(CORS)机制中,用于确保客户端发起的跨域请求被服务器接受。
- 预检请求 是浏览器发起的一个自动的、标准的请求,旨在确保后续的实际跨域请求能顺利执行。
7. HTTP 连接管理
特性 | HTTP 长连接 | HTTP 短连接 |
---|---|---|
连接复用 | 可以复用同一个连接进行多个请求和响应交换 | 每个请求都需要建立新的连接 |
性能 | 提高性能,减少连接建立和关闭的开销 | 每个请求都要重新建立连接,增加延迟 |
连接关闭时机 | 连接在请求完成后保持一段时间,直到客户端或服务器关闭 | 每次请求和响应完成后即关闭连接 |
资源占用 | 需要保持连接一段时间,占用系统资源 | 连接的占用时间较短,但每次请求都要建立连接 |
适用场景 | 高并发、多次请求的应用,如网站、API 接口等 | 偶尔的、低频的请求场景,如小型网站或一些特殊接口 |
头部字段 | Connection: keep-alive 或 Keep-Alive | Connection: close |
协议支持 | HTTP/1.1 默认使用,HTTP/2 和 HTTP/3 都使用持久连接 | HTTP/1.0 默认使用 |
8. HTTP 压缩
参考前端版块的系列文章 【性能监控】。
9. HTTP 代理
参考前端版块的系列文章 【Nginx 基础知识】
10. 其他几个概念
- HTTP 长轮询:通过保持长时间连接,服务器在有新数据时主动推送响应,适用于实时通信。
- 实时聊天应用:如即时通讯软件中的消息推送。
- 股票行情更新:需要实时推送股市数据更新。
- 在线游戏:如玩家状态、分数等数据的实时推送。
- HTTP 流:持续传输数据,适用于需要实时、大量数据传输的场景,如视频和音频流。
- 视频流媒体传输:如直播、视频点播等,客户端需要不断接收和播放数据。
- 音频流传输:如音乐流媒体服务。
- 实时日志传输:将实时生成的日志数据通过 HTTP 流传输给监控系统。
- HTTP 流量控制:管理客户端和服务器之间的数据传输速率,避免网络拥塞,保证通信效率,主要通过 TCP 协议和 HTTP/2 的流量控制机制实现。
- 流媒体传输:视频、音频流的传输需要高效的流量控制,以避免带宽过载。
- 大规模数据上传/下载:例如文件上传、下载时控制每个连接的带宽,避免带宽耗尽。
- 负载均衡:流量控制可以结合负载均衡技术,调节每台服务器处理的请求量,避免某个服务器负载过高。
- API 限流:控制 API 请求的频率,避免系统过载。
相关文章: