Skip to content

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)结合使用,以提供加密通信保障数据传输的安全性。

关键特点:

  1. 基于 TCP/IP 协议:HTTP 依赖于底层的 TCP/IP 协议进行数据传输。
  2. 无状态协议:每次请求与响应之间没有持久连接或记忆,服务器不会保存客户端的历史状态。
  3. 请求-响应模型:客户端发起请求,服务器响应请求并返回数据。
  4. 跨平台支持:HTTP 是独立于操作系统、硬件平台的协议,广泛支持不同类型的设备与浏览器。

小提示

HTTP 协议 可以理解为浏览器和服务器之间沟通的“语言”,它规定了浏览器如何向服务器请求资源,以及服务器如何响应这些请求。这就像你去餐馆点菜,服务员把你点的菜(数据)从厨房(服务器)拿到你桌上(浏览器)。如果“语言”不通,你当然拿不到你想要的菜了。

2. HTTP 协议的主要特点

场景: WEB 通信。

  1. 请求-响应模型:客户端(浏览器)发出请求,服务器返回响应。每次请求和响应都是独立的。

  2. 无状态协议:每个请求都是独立的,服务器不会保存历史信息。

  3. 无连接协议:每次请求建立独立连接,处理完毕后关闭连接,除非使用持久连接(如 HTTP/1.1 中的持久连接 keep-alive)。

  4. 基于 TCP/IP 协议:依赖 TCP 保证数据可靠传输,IP 定位服务器。

  5. 支持多媒体类型:除了 HTML,还能传输文本、图片、音频、视频等多种数据。

  6. 跨平台支持:独立于操作系统和硬件,可以在不同平台之间通信。

  7. 可扩展性:支持扩展请求方法、状态码和自定义头部字段。如 HTTP/2 引入了多路复用、头部压缩等新特性,提升了性能。

  8. 安全性(HTTPS):HTTP 本身不加密数据,HTTPS 使用 SSL/TLS 加密传输。

  9. 多种请求方法:包括 GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。

  10. 状态码:响应中包含状态码,指示请求结果(如 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://[用户名:密码@]主机名[:端口]/路径[?查询字符串][#片段标识符]

各部分解释

  1. 协议(Scheme)

    • 格式http://https://
    • 表示客户端和服务器之间通信使用的协议类型,http 表示非加密连接,https 表示加密连接(SSL/TLS)。
  2. 用户名和密码(可选)

    • 格式用户名:密码@
    • 如果 URL 需要身份验证,客户端可以在 URL 中提供用户名和密码。例如:http://user:password@www.example.com
    • 这种方式现在不常见,通常会通过浏览器的登录对话框或 HTTP 头部进行认证。
  3. 主机名(Host)

    • 格式www.example.com
    • 主机名指定了 Web 服务器的域名或 IP 地址,客户端通过 DNS 查询这个主机名对应的 IP 地址。
    • 可以是域名(如 www.example.com)或者是 IP 地址(如 192.168.1.1)。
  4. 端口(Port, 可选)

    • 格式:端口号
    • 表示 Web 服务器所使用的网络端口。默认情况下,HTTP 使用端口 80,HTTPS 使用端口 443。如果服务器使用了不同的端口,则需要在 URL 中指定。
    • 例如:http://www.example.com:8080 表示通过端口 8080 访问该网站。
  5. 路径(Path)

    • 格式/路径/文件
    • 表示 Web 服务器上的资源位置或文件路径。例如:http://www.example.com/about 指向网站中的 “about” 页面。路径部分用于确定服务器上的特定文件或目录。
  6. 查询字符串(Query String, 可选)

    • 格式?参数名=参数值&参数名=参数值
    • 查询字符串用于在 URL 中传递参数,它以 ? 开头,后面可以跟一个或多个键值对,用 & 分隔。例如:http://www.example.com/search?q=HTTP 表示搜索查询参数 q=HTTP
    • 查询字符串常用于 GET 请求中的数据传递。
  7. 片段标识符(Fragment Identifier, 可选)

    • 格式#片段
    • 用于指向页面中的某个特定部分,常用于锚点链接。例如:http://www.example.com/about#team 指向 “about” 页面中的 “team” 部分。

URL 示例

  1. 标准 HTTP URL

    http://www.example.com/about

    解释:

    • 使用 HTTP 协议
    • 访问 www.example.com 网站上的 about 页面
  2. 带查询参数的 URL

    https://www.example.com/search?q=HTTP&sort=date

    解释:

    • 使用 HTTPS 协议
    • 查询参数 q=HTTP 表示搜索词,sort=date 表示按照日期排序
  3. 带端口号的 URL

    http://www.example.com:8080/page

    解释:

    • 使用 HTTP 协议
    • 访问 www.example.com 的端口 8080 上的 /page 路径
  4. 带片段标识符的 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)

    请求行
    请求头
    空行
    请求体(可选)
    vb
    GET /index.html HTTP/1.1
    Host: www.example.com
    User-Agent: Mozilla/5.0
    Accept: text/html,application/xhtml+xml
  • HTTP 响应报文(Response)

    状态行
    响应头
    空行
    响应体
    php
     HTTP/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 TokenAuthorization: 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在响应中设置一个或多个 CookieSet-Cookie: sessionId=abc123; Path=/; HttpOnly
Location指示客户端应重定向到哪个 URLLocation: 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-MatchETag: "686897696a7c876b7e"

5. HTTP 状态码

HTTP 状态码 是服务器在响应 HTTP 请求时返回的三位数字,用于指示请求的处理结果。状态码可以帮助客户端(如浏览器)了解请求的状态,并采取相应的处理措施。状态码通常跟随在 HTTP 响应报文的 状态行 中。

5.1 状态码分类

HTTP 状态码按照功能可以分为五个类别

  • 1xx:信息性状态码(Informational)
  • 2xx:成功状态码(Successful)
  • 3xx:重定向状态码(Redirection)
  • 4xx:客户端错误状态码(Client Error)
  • 5xx:服务器错误状态码(Server Error)

5.2 常见的 HTTP 状态码总结

状态码描述典型场景
200OK请求成功,返回资源或数据
301Moved Permanently资源永久移动到新位置
302Found (临时重定向)资源临时移动到新位置
400Bad Request请求无效或参数缺失
401Unauthorized未认证,需提供身份验证
403Forbidden访问被拒绝,没有权限
404Not Found请求的资源未找到
500Internal Server Error服务器内部错误
503Service 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)中的预检请求,即浏览器发送的 预请求。当浏览器发起跨域请求时,如果请求方法不是简单请求(如 GETPOST,且符合特定条件),浏览器会首先发送一个 OPTIONS 请求,检查服务器是否允许跨域访问

OPTIONS

  • OPTIONS 方法用于检查服务器是否支持跨域请求,特别是用于 预检请求
  • 它主要应用于浏览器的跨域资源共享(CORS)机制中,用于确保客户端发起的跨域请求被服务器接受。
  • 预检请求 是浏览器发起的一个自动的、标准的请求,旨在确保后续的实际跨域请求能顺利执行。

7. HTTP 连接管理

特性HTTP 长连接HTTP 短连接
连接复用可以复用同一个连接进行多个请求和响应交换每个请求都需要建立新的连接
性能提高性能,减少连接建立和关闭的开销每个请求都要重新建立连接,增加延迟
连接关闭时机连接在请求完成后保持一段时间,直到客户端或服务器关闭每次请求和响应完成后即关闭连接
资源占用需要保持连接一段时间,占用系统资源连接的占用时间较短,但每次请求都要建立连接
适用场景高并发、多次请求的应用,如网站、API 接口等偶尔的、低频的请求场景,如小型网站或一些特殊接口
头部字段Connection: keep-aliveKeep-AliveConnection: 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 请求的频率,避免系统过载。

相关文章: