【一文读懂】HTTP与Websocket协议

news2025/3/14 3:55:40

HTTP协议

概述

HTTP (Hypertext Transfer Protocol),即超文本传输协议,是一种用于在客户端和服务器之间传输超文本(例如网页、图片、音频、视频等)的通信协议。它是万维网(WWW)的基础,负责在浏览器(客户端)和 web 服务器之间交换信息。HTTP 是一个 应用层 协议,位于 OSI 模型的第七层,通常通过 TCP(传输控制协议)进行通信。

HTTP 是无状态的、面向请求/响应的协议,意思是每一次请求都是独立的,服务器不会保存客户端的状态。每次客户端发起请求,服务器都必须处理并响应,即使是同一个客户端的连续请求,也被视为独立的。

HTTP 请求/响应模型

HTTP 协议基于请求/响应模型,通信流程包括两部分:客户端发送请求,服务器返回响应。

1. HTTP 请求报文(Request Message)

一个 HTTP 请求报文主要由以下几个部分组成:

  • 请求行(Request Line)

    • 请求方法(Request Method)

      :定义了客户端希望进行的操作,常见的 HTTP 请求方法包括:

      • GET:请求指定的资源,通常用于获取网页或文件。
      • POST:将数据提交到服务器,常用于表单提交。
      • PUT:上传数据,通常用于更新服务器上的资源。
      • DELETE:删除指定的资源。
      • HEAD:与 GET 方法类似,但只返回响应头,不返回实际内容。
      • PATCH:用于对已有资源进行部分修改。
    • 请求 URL(Request URL):指定资源的位置,例如 https://www.example.com/index.html

    • 协议版本(HTTP Version):指定使用的 HTTP 协议版本,通常是 HTTP/1.1HTTP/2

    示例

    GET /index.html HTTP/1.1
    
  • 请求头部(Request Headers) 请求头部包含了请求的元信息,描述客户端环境、请求内容类型、认证信息等。例如:

    • User-Agent:指定发起请求的客户端软件信息。
    • Accept:指定客户端能够处理的内容类型(如 text/htmlapplication/json 等)。
    • Host:指定请求目标的主机名(用于虚拟主机的支持)。
    • Cookie:包含发送给服务器的 Cookie 数据。
    • Authorization:包含授权信息,用于身份验证。

    示例

    User-Agent: Mozilla/5.0
    Accept: text/html,application/xhtml+xml
    
  • 请求体(Request Body) 请求体通常在 POSTPUT 等方法中使用,用于传送数据到服务器(例如表单提交的数据、JSON 数据等)。GET 请求一般没有请求体。

    示例(POST 请求提交表单数据):

    name=John&age=30
    
2. HTTP 响应报文(Response Message)

HTTP 响应报文由服务器发送回客户端,通常包含服务器处理请求后的结果。响应报文的组成部分如下:

  • 响应行(Response Line)

    • 协议版本(HTTP Version):指定响应所使用的 HTTP 协议版本。
    • 状态码(Status Code):用于表示请求的处理结果,如成功、失败或错误。
    • 状态短语(Status Phrase):对状态码的简短描述,例如 OKNot Found 等。

    示例

    HTTP/1.1 200 OK
    
  • 响应头部(Response Headers) 响应头部包含关于响应的元信息,描述服务器的状态、返回的数据类型等。例如:

    • Content-Type:响应体的内容类型(如 text/htmlapplication/json 等)。
    • Content-Length:响应体的长度(以字节为单位)。
    • Date:响应的时间戳。
    • Set-Cookie:服务器返回给客户端的 Cookie。

    示例

    Content-Type: text/html; charset=UTF-8
    Content-Length: 1234
    Set-Cookie: sessionid=abcd1234
    
  • 响应体(Response Body) 响应体包含了实际的数据内容,这是服务器返回给客户端的主体部分。对于 GET 请求,响应体通常是请求的网页内容、图片、视频等资源。对于 API 请求,响应体通常是 JSON 或 XML 格式的数据。

    示例(返回 HTML 内容):

    <html>
      <head><title>Welcome</title></head>
      <body><h1>Hello, World!</h1></body>
    </html>
    

3. HTTP 状态码

状态码是服务器返回给客户端的一组三位数字,表示请求的处理状态。常见的状态码包括:

  • 1xx (信息性状态码):请求已接收,继续处理。
    • 100 Continue:表示服务器已收到请求头部,客户端可以继续发送请求体。
    • 101 Switching Protocols:服务器正在切换协议。
  • 2xx (成功状态码):请求已成功处理。
    • 200 OK:请求成功,服务器返回响应数据。
    • 201 Created:请求成功,资源已创建。
    • 204 No Content:请求成功,但没有返回内容。
  • 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:服务器暂时不可用。

4. HTTP 协议的版本

  • HTTP/1.0:最初的 HTTP 协议版本,支持基本的请求和响应机制,但性能较低,缺乏多路复用等特性。
  • HTTP/1.1:相比 HTTP/1.0,HTTP/1.1 增强了持久连接、管道化、分块传输等特性,减少了建立连接的次数。
  • HTTP/2:引入了二进制协议、流的多路复用、头部压缩等技术,大大提高了性能,尤其是减少了页面加载时间。
  • HTTP/3:基于 QUIC(Quick UDP Internet Connections)协议,旨在进一步提高性能,尤其在高延迟或丢包的网络环境中表现更佳。

5. HTTP 与 HTTPS

  • HTTP:在客户端和服务器之间传输数据时,数据是明文的,容易受到中间人攻击。
  • HTTPS:即 HTTP over SSL/TLS,数据在传输过程中会进行加密,确保通信的机密性和完整性。现代 web 应用普遍推荐使用 HTTPS 来保证安全性。

WebSocket

概述

WebSocket 是一种计算机通信协议,属于 应用层协议,它为客户端和服务器之间提供了一个 全双工、双向通信 的通道。WebSocket 通过建立在 TCP 之上的连接,允许客户端和服务器进行实时、低延迟的消息交换。WebSocket 由 IETF(Internet Engineering Task Force)发布,是一种适用于需要持续交换数据的应用的技术。

WebSocket 协议的引入,主要是为了解决传统的 HTTP 协议在实时通信中的不足,尤其是在高频率消息交互、双向通信等场景中。

特点

  1. 全双工通信(Full-Duplex)
    • WebSocket 是一种 全双工(Full-Duplex)协议,意味着客户端和服务器可以同时发送和接收数据。这与传统的 HTTP 协议(单向请求-响应模式)不同。
  2. 实时性(Low Latency)
    • 一旦 WebSocket 连接建立,客户端和服务器之间就可以在没有建立新的连接的情况下持续发送和接收数据。避免了频繁的连接与断开,极大减少了延迟。
  3. 持久连接
    • WebSocket 连接在创建后保持持久性,直到显式关闭。不同于 HTTP 请求-响应模型,WebSocket 不需要每次通信都重新建立连接,这使得通信更加高效。
  4. 低开销
    • WebSocket 数据帧结构非常简洁,不像 HTTP 那样包含冗余的头信息,因此每次传输的开销非常小,适合需要频繁数据交换的应用场景。
  5. 双向通信
    • WebSocket 支持 双向通信,这意味着服务器可以主动向客户端推送数据,而不必等到客户端发起请求。这对于需要实时推送数据的应用(如在线聊天、实时股票价格、游戏等)至关重要。

工作原理

  1. 连接建立

    • WebSocket 连接是通过HTTP 握手(HTTP Handshake)来建立的,但一旦建立连接,HTTP 连接就会升级为 WebSocket 连接。这一过程包括:
      • 客户端发起一个 HTTP 请求,带有 Upgrade 头字段,向服务器请求从 HTTP 协议升级到 WebSocket 协议。
      • 服务器响应请求并发送一个 101 Switching Protocols 的状态码,表示协议升级成功。

    例如,客户端请求:

    GET /chat HTTP/1.1
    Host: example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Sec-WebSocket-Version: 13
    

    服务器响应:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: x3JJHMbDL1EzLkh9WcR+Kk0M9L+Y=
    
  2. 数据传输

    • 一旦建立 WebSocket 连接,客户端和服务器可以通过 WebSocket 数据帧 交换数据。这些数据帧的传输是非常高效的,并且可以支持不同类型的消息:文本、二进制数据等。
  3. 连接关闭

    • 当通信结束时,任一方(客户端或服务器)可以发起连接关闭请求,关闭时发送一个 Close 数据帧,另一方确认后连接关闭。

数据帧格式

WebSocket 数据帧的结构相对简单,通常包括以下部分:

  1. FIN、RSV、OpCode:标识数据帧的类型和一些控制信息。
  2. 掩码标志(Mask):指示数据是否经过掩码处理(客户端发送的数据必须加掩码,服务器数据通常不需要掩码)。
  3. 负载长度(Payload Length):表示数据负载的长度。
  4. 掩码密钥(Mask Key):如果数据有掩码,则包括掩码密钥。
  5. 负载数据(Payload Data):实际的传输数据(如文本、二进制数据)。

使用场景

  1. 实时聊天应用:WebSocket 使得服务器能够即时向客户端推送消息,特别适合即时聊天应用。
  2. 在线游戏:实时互动和低延迟是 WebSocket 在在线游戏中的应用亮点。
  3. 股票、金融数据传输:WebSocket 适用于需要实时更新的数据流传输,如金融市场数据、股票价格更新等。
  4. 物联网(IoT)设备通信:WebSocket 可以用于物联网设备与云端服务器之间的实时通信,实时传输传感器数据或设备状态。
  5. 协作应用:在协作编辑应用中(例如 Google Docs),WebSocket 可以帮助多用户实时同步内容。

总结

HTTP 协议

  • 是一种 无状态单向 的协议,客户端通过请求与服务器进行交互,适用于请求-响应模型的通信,如浏览网页、下载文件等。
  • 每次请求都需要重新建立连接,并且包含一定的头部信息,造成了较高的延迟和开销。
  • 不适合需要 实时数据交换 的应用。

WebSocket 协议

  • 提供了 持久连接,支持 双向全双工 的通信,适用于实时性要求高、需要低延迟和高频繁数据交换的应用,如实时聊天、在线游戏、实时数据流(如股票行情、直播视频等)。
  • 一旦连接建立,客户端和服务器可以随时发送和接收数据,避免了频繁建立连接的开销,提高了通信效率。
特性HTTP 协议WebSocket 协议
协议类型无状态协议,基于请求-响应模型双向全双工协议,基于持久连接
连接模式每次通信都需要建立新的连接(无连接)一旦建立连接,通信会保持持续开放
通信方式客户端发起请求,服务器响应客户端和服务器都可以随时发送和接收数据
数据传输基于请求-响应,每次请求/响应时都需要传输头信息传输数据时不需要额外的头部信息,开销更小
传输效率相对较低,频繁建立和断开连接带来高开销高效,数据传输时无额外的连接建立和断开开销
连接生命周期每次请求响应后连接关闭,短暂连接保持打开状态,直到主动关闭
实时性请求和响应之间的延迟较高实时双向通信,适合实时应用(如在线聊天、游戏)
数据格式主要为文本/HTML,二进制数据需要转换支持文本(如 JSON)和二进制(如二进制流)
状态管理无状态,每次请求相互独立有状态,连接状态保持直到主动关闭
协议使用场景网页加载、文件传输、浏览器与服务器的通信实时通信应用,如即时消息、在线游戏、实时数据流
安全性可以通过 HTTPS 进行加密传输可以通过 WSS(WebSocket Secure)加密传输
头部信息每次请求都会有冗长的头部信息只有握手阶段需要头部信息,之后没有头部开销
协议设计基于请求-响应的客户端-服务器模型基于持久连接的双向通信模型
连接模式无连接:每个请求/响应都需要建立连接持久连接:连接建立后可以进行持续的双向通信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Grafana——如何迁移Grafana到一台新服务器

背景 有时候由于服务器更新之类的&#xff0c;我们需要迁移一整套Grafana&#xff0c;这时候该怎么操作呢&#xff1f; 下面让我一步步说明下 安装Grafana 在新的服务器上安装Grafana 这个不再赘述&#xff0c;可以看一下我之前的文章 备份及迁移 迁移配置文件 配置文件即…

Flutter中 List列表中移除特定元素

在 Dart 语言里&#xff0c;若要从子列表中移除特定元素&#xff0c;可以使用以下几种方法&#xff0c;下面为你详细介绍&#xff1a; 方法一&#xff1a;使用 where 方法创建新列表 where 方法会根据指定的条件筛选元素&#xff0c;然后通过 toList 方法将筛选结果转换为新列…

一己之见:嵌入式linux开发板的选择(canmv还是...)

个人了解范围有限&#xff0c;仅仅介绍我略微了解的几个开发板。 野火&#xff0c;核桃&#xff0c;canmv&#xff0c;香蕉&#xff0c;香橙&#xff0c;庐山&#xff0c;地瓜&#xff0c;还有其他...。 野火资料全&#xff0c;型号多&#xff0c;接口丰富&#xff0c;支持usb…

多模态基础模型训练笔记-第一篇InternVL-g

一、TL&#xff1b;DR 将之前所有训练过的大模型的过程都总结和回忆一下&#xff0c;遇到的坑别忘了 二、问题记录 还是注意镜像的选择&#xff0c;选择社区最火的镜像&#xff0c;然后下载好对应的数据&#xff0c;主要显卡的选择&#xff0c;这个时候4090已经带不动了&…

微软AutoGen高级功能——Magentic-One

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢&#xff0c;我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统&#xff0c;用于…

Unity UI个人总结

个人总结&#xff0c;太简单的直接跳过。 一、缩放模式 1.固定像素大小 就是设置一个100x100的方框&#xff0c;在1920x1080像素下在屏幕中长度占比1/19&#xff0c;在3840x2160&#xff0c;方框在屏幕中长度占比1/38。也就是像素长款不变&#xff0c;在屏幕中占比发生变化 2.…

牛客小白月赛110

A智乃办赛 思路&#xff1a;用group表示是第几个大写英文字母&#xff0c;以A为基础&#xff0c;(n-1)/500为几则往上加几&#xff0c;从而得到应有的字母&#xff0c;用number表示当前组内的编号&#xff0c;(n-1)%5001表示&#xff0c;至于最后的前导0&#xff0c;在输出的时…

用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理

要深入浅出地理解条件概率与贝叶斯定理&#xff0c;可以从以下几个方面入手&#xff0c;结合理论知识和实例进行学习&#xff1a; 贝叶斯定理与智能世界的暗语 条件概率&#xff0c;全概率公式与贝叶斯公式的推导&#xff0c;理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …

电商小程序(源码+文档+部署+讲解)

引言 随着移动互联网的快速发展&#xff0c;电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段&#xff0c;为消费者提供了一个便捷、高效的购物平台&#xff0c;从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计&#xff0c;服…

基于单片机的开关电源设计(论文+源码)

本次基于单片机的开关电源节能控制系统的设计中&#xff0c;在功能上设计如下&#xff1a; &#xff08;1&#xff09;系统输入220V&#xff1b; &#xff08;2&#xff09;系统.输出0-12V可调&#xff0c;步进0.1V; &#xff08;3&#xff09;LCD液晶显示实时电压&#xff…

DeepSeek笔记(一):本地部署DeepSeek R1并搭建Web UI实现可视化交互的笔记

经过多天的挣扎和卸载了一些软件&#xff0c;终于下定决心在本地部署DeepSeek R1模型。部署和搭建过程非常简单和方便。 一、下载Ollama 进入Ollama官方网站(https://ollama.com),进入下载下载Ollama页面&#xff08;https://ollama.com/download&#xff09; 根据电脑的操作…

.NET 9.0 的 Blazor Web App 项目,Bootstrap Blazor 全局异常 <ErrorLogger> 使用备忘

一、全局异常 通过 <ErrorLogger> 组件实现&#xff0c;可以对全局的日志、异常进行统一输出&#xff0c;该组件【已经包含】在 <BootstrapBlazorRoot> 中&#xff0c;使用了 <BootstrapBlazorRoot> 组件包裹的 razor组件 【不用】再额外添加 <ErrorLogge…

每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块

本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…

Unity Shader Graph 2D - Procedural程序化图形循环的箭头

前言 箭头在游戏开发中也是常见的一种图形之一,在游戏中箭头通常会用作道路引导或者指示,告诉玩家前进的方向,是比较重要的提示信号。本文将通过使用程序化图形来实现循环滚动的箭头效果,实践和熟悉Shader Graph的相关节点。 首先创建一个Shader Graph文件命名为Mo…

【Java学习】类和对象

目录 一、选择取块解 二、类变量 三、似复刻变量 四、类变量的指向对象 五、变量的解引用访问 1.new 类变量(参) 2.this(参) 3.类变量/似复刻变量. 六、代码块 七、复制变量的赋值顺序 八、访问限定符 1.private 2.default 九、导类 一、选择取块解 解引用都有可以…

探索高通骁龙游戏超分辨率技术:移动游戏的未来

高通技术公司于2024年推出了骁龙游戏超分辨率2&#xff08;Snapdragon Game Super Resolution 2&#xff0c;简称GSR2&#xff09;&#xff0c;这是一项全新的骁龙Elite Gaming功能&#xff0c;旨在最大化移动游戏的性能和电池寿命。 什么是骁龙游戏超分辨率2&#xff08;GSR2&…

LabVIEW 用户界面设计基础原则

在设计LabVIEW VI的用户界面时&#xff0c;前面板的外观和布局至关重要。良好的设计不仅提升用户体验&#xff0c;还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点&#xff1a; 1. 前面板设计原则 交互性&#xff1a;组合相关的输入控件和显示控件&#x…

[C++]多态详解

目录 一、多态的概念 二、静态的多态 三、动态的多态 3.1多态的定义 3.2虚函数 四、虚函数的重写&#xff08;覆盖&#xff09; 4.1虚函数 4.2三同 4.3两种特殊情况 &#xff08;1&#xff09;协变 &#xff08;2&#xff09;析构函数的重写 五、C11中的final和over…

KubeSphere 和 K8s 高可用集群离线部署全攻略

本文首发&#xff1a;运维有术&#xff0c;作者术哥。 今天&#xff0c;我们将一起探索如何在离线环境中部署 K8s v1.30.6 和 KubeSphere v4.1.2 高可用集群。对于离线环境的镜像仓库管理&#xff0c;官方推荐使用 Harbor 作为镜像仓库管理工具&#xff0c;它为企业级用户提供…

HCIA项目实践--RIP的拓展配置

9.4.7 RIP的拓展配置 &#xff08;1&#xff09;RIPV2的手工认证 RIPv2 的手工认证是增强网络安全性的手段。管理员手动配置密钥&#xff0c;路由器在收发 RIPv2 路由更新消息时&#xff0c;会对消息中的认证信息进行检查。发送方添加密钥&#xff0c;接收方用预设密钥验证。若…