【一文读懂】HTTP与Websocket协议
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.1或HTTP/2。
示例:
GET /index.html HTTP/1.1 -
-
请求头部(Request Headers) 请求头部包含了请求的元信息,描述客户端环境、请求内容类型、认证信息等。例如:
User-Agent:指定发起请求的客户端软件信息。Accept:指定客户端能够处理的内容类型(如text/html、application/json等)。Host:指定请求目标的主机名(用于虚拟主机的支持)。Cookie:包含发送给服务器的 Cookie 数据。Authorization:包含授权信息,用于身份验证。
示例:
User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml -
请求体(Request Body) 请求体通常在
POST、PUT等方法中使用,用于传送数据到服务器(例如表单提交的数据、JSON 数据等)。GET请求一般没有请求体。示例(POST 请求提交表单数据):
name=John&age=30
2. HTTP 响应报文(Response Message)
HTTP 响应报文由服务器发送回客户端,通常包含服务器处理请求后的结果。响应报文的组成部分如下:
-
响应行(Response Line)
- 协议版本(HTTP Version):指定响应所使用的 HTTP 协议版本。
- 状态码(Status Code):用于表示请求的处理结果,如成功、失败或错误。
- 状态短语(Status Phrase):对状态码的简短描述,例如
OK、Not Found等。
示例:
HTTP/1.1 200 OK -
响应头部(Response Headers) 响应头部包含关于响应的元信息,描述服务器的状态、返回的数据类型等。例如:
Content-Type:响应体的内容类型(如text/html、application/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 协议在实时通信中的不足,尤其是在高频率消息交互、双向通信等场景中。
特点
- 全双工通信(Full-Duplex):
- WebSocket 是一种 全双工(Full-Duplex)协议,意味着客户端和服务器可以同时发送和接收数据。这与传统的 HTTP 协议(单向请求-响应模式)不同。
- 实时性(Low Latency):
- 一旦 WebSocket 连接建立,客户端和服务器之间就可以在没有建立新的连接的情况下持续发送和接收数据。避免了频繁的连接与断开,极大减少了延迟。
- 持久连接:
- WebSocket 连接在创建后保持持久性,直到显式关闭。不同于 HTTP 请求-响应模型,WebSocket 不需要每次通信都重新建立连接,这使得通信更加高效。
- 低开销:
- WebSocket 数据帧结构非常简洁,不像 HTTP 那样包含冗余的头信息,因此每次传输的开销非常小,适合需要频繁数据交换的应用场景。
- 双向通信:
- WebSocket 支持 双向通信,这意味着服务器可以主动向客户端推送数据,而不必等到客户端发起请求。这对于需要实时推送数据的应用(如在线聊天、实时股票价格、游戏等)至关重要。
工作原理
-
连接建立:
- WebSocket 连接是通过HTTP 握手(HTTP Handshake)来建立的,但一旦建立连接,HTTP 连接就会升级为 WebSocket 连接。这一过程包括:
- 客户端发起一个 HTTP 请求,带有
Upgrade头字段,向服务器请求从 HTTP 协议升级到 WebSocket 协议。 - 服务器响应请求并发送一个
101 Switching Protocols的状态码,表示协议升级成功。
- 客户端发起一个 HTTP 请求,带有
例如,客户端请求:
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= - WebSocket 连接是通过HTTP 握手(HTTP Handshake)来建立的,但一旦建立连接,HTTP 连接就会升级为 WebSocket 连接。这一过程包括:
-
数据传输:
- 一旦建立 WebSocket 连接,客户端和服务器可以通过 WebSocket 数据帧 交换数据。这些数据帧的传输是非常高效的,并且可以支持不同类型的消息:文本、二进制数据等。
-
连接关闭:
- 当通信结束时,任一方(客户端或服务器)可以发起连接关闭请求,关闭时发送一个 Close 数据帧,另一方确认后连接关闭。
数据帧格式
WebSocket 数据帧的结构相对简单,通常包括以下部分:
- FIN、RSV、OpCode:标识数据帧的类型和一些控制信息。
- 掩码标志(Mask):指示数据是否经过掩码处理(客户端发送的数据必须加掩码,服务器数据通常不需要掩码)。
- 负载长度(Payload Length):表示数据负载的长度。
- 掩码密钥(Mask Key):如果数据有掩码,则包括掩码密钥。
- 负载数据(Payload Data):实际的传输数据(如文本、二进制数据)。
使用场景
- 实时聊天应用:WebSocket 使得服务器能够即时向客户端推送消息,特别适合即时聊天应用。
- 在线游戏:实时互动和低延迟是 WebSocket 在在线游戏中的应用亮点。
- 股票、金融数据传输:WebSocket 适用于需要实时更新的数据流传输,如金融市场数据、股票价格更新等。
- 物联网(IoT)设备通信:WebSocket 可以用于物联网设备与云端服务器之间的实时通信,实时传输传感器数据或设备状态。
- 协作应用:在协作编辑应用中(例如 Google Docs),WebSocket 可以帮助多用户实时同步内容。
总结
HTTP 协议:
- 是一种 无状态、单向 的协议,客户端通过请求与服务器进行交互,适用于请求-响应模型的通信,如浏览网页、下载文件等。
- 每次请求都需要重新建立连接,并且包含一定的头部信息,造成了较高的延迟和开销。
- 不适合需要 实时数据交换 的应用。
WebSocket 协议:
- 提供了 持久连接,支持 双向、全双工 的通信,适用于实时性要求高、需要低延迟和高频繁数据交换的应用,如实时聊天、在线游戏、实时数据流(如股票行情、直播视频等)。
- 一旦连接建立,客户端和服务器可以随时发送和接收数据,避免了频繁建立连接的开销,提高了通信效率。
| 特性 | HTTP 协议 | WebSocket 协议 |
|---|---|---|
| 协议类型 | 无状态协议,基于请求-响应模型 | 双向全双工协议,基于持久连接 |
| 连接模式 | 每次通信都需要建立新的连接(无连接) | 一旦建立连接,通信会保持持续开放 |
| 通信方式 | 客户端发起请求,服务器响应 | 客户端和服务器都可以随时发送和接收数据 |
| 数据传输 | 基于请求-响应,每次请求/响应时都需要传输头信息 | 传输数据时不需要额外的头部信息,开销更小 |
| 传输效率 | 相对较低,频繁建立和断开连接带来高开销 | 高效,数据传输时无额外的连接建立和断开开销 |
| 连接生命周期 | 每次请求响应后连接关闭,短暂 | 连接保持打开状态,直到主动关闭 |
| 实时性 | 请求和响应之间的延迟较高 | 实时双向通信,适合实时应用(如在线聊天、游戏) |
| 数据格式 | 主要为文本/HTML,二进制数据需要转换 | 支持文本(如 JSON)和二进制(如二进制流) |
| 状态管理 | 无状态,每次请求相互独立 | 有状态,连接状态保持直到主动关闭 |
| 协议使用场景 | 网页加载、文件传输、浏览器与服务器的通信 | 实时通信应用,如即时消息、在线游戏、实时数据流 |
| 安全性 | 可以通过 HTTPS 进行加密传输 | 可以通过 WSS(WebSocket Secure)加密传输 |
| 头部信息 | 每次请求都会有冗长的头部信息 | 只有握手阶段需要头部信息,之后没有头部开销 |
| 协议设计 | 基于请求-响应的客户端-服务器模型 | 基于持久连接的双向通信模型 |
| 连接模式 | 无连接:每个请求/响应都需要建立连接 | 持久连接:连接建立后可以进行持续的双向通信 |
相关文章:
【一文读懂】HTTP与Websocket协议
HTTP协议 概述 HTTP (Hypertext Transfer Protocol),即超文本传输协议,是一种用于在客户端和服务器之间传输超文本(例如网页、图片、音频、视频等)的通信协议。它是万维网(WWW)的基础,负责在浏…...
大语言模型入门
大语言模型入门 1 大语言模型步骤1.1 pre-training 预训练1.1.1 从网上爬数据1.1.2 tokenization1.1.2.1 tokenization using byte pair encoding 1.3 预训练1.3.1 context1.3.2 training1.3.3 输出 1.2 post-training1.2.1 token 1.2 SFT监督微调1.3 人类反馈强化学习1.3.1 人…...
SQL 大厂面试题目(由浅入深)
今天给大家带来一份大厂SQL面试覆盖:基础语法 → 复杂查询 → 性能优化 → 架构设计,大家需深入理解执行原理并熟悉实际业务场景的解决方案。 1. 基础查询与过滤 题目:查询 employees 表中所有薪资(salary)大于 10000…...
Shader Step和frac函数
Step又称为阶跃函数,在着色器(Shader)编程中,step 函数是一个非常有用的函数,尤其是在GLSL(OpenGL Shading Language)和其他类似的着色器语言中。它用于生成基于阈值的阶跃函数输出。step 函数的…...
FreeRtos实时系统: 十二.FreeRTOS的队列集
FreeRtos实时系统: 十二.FreeRTOS的队列集 一.队列集简介二.队列集相关API函数三.队列集操作实验 一.队列集简介 左边的接收任务会在没接收到队列时会阻塞,如果前面释放信号量这时该任务也获取不到信号量。 右边使用队列集如果获取到,判断句柄是谁&#…...
NLP Word Embeddings
Word representation One-hot形式 在上一周介绍RNN类模型时,使用了One-hot向量来表示单词的方式。它的缺点是将每个单词视为独立的,算法很难学习到单词之间的关系。 比如下面的例子,即使语言模型已经知道orange juice是常用组合词…...
如何在24GB的GPU上运行DeepSeek-R1-Distill-Qwen-32B
如何在24GB的GPU上运行DeepSeek-R1-Distill-Qwen-32B 一、背景二、解决方案三、操作步骤1.下载模型2.安装依赖3.量化4.生成推理代码5.运行A.缓存上限为128条B.不限制缓存上限C.输出内容 一、背景 随着深度学习的不断发展,大型语言模型(LLM,L…...
2025年二级建造师报名流程图解
2025年二级建造师报名时间!附报名流程! ⏰️已公布25年二建考试时间的省份如下: ️4月19日、20日考试的城市有:贵州 ️5月10日、11日考试的城市有:湖北、陕西、宁夏、甘肃、福建、浙江、江西、黑龙江、河南、湖南、…...
深入浅出:Python 中的异步编程与协程
引言 大家好,今天我们来聊聊 异步编程 和 协程,这是近年来编程语言领域中的热点话题之一,尤其在 Python 中,它作为一种全新的编程模型,已经成为处理 IO密集型 任务的强力工具。尽管很多人对异步编程望而却步࿰…...
八大排序——简单选择排序
目录 1.1基本操作: 1.2动态图: 1.3代码: 代码解释 1. main 方法 2. selectSort 方法 示例运行过程 初始数组 每轮排序后的数组 最终排序结果 代码总结 1.1基本操作: 选择排序(select sorting)也…...
vue使用CSS布局技术,实现div定位到页面底部或顶部并居中功能
<template> <div > <div class"bottom-element"> 我在底部,并居中了 </div> </div> </template> 使用CSS布局技术,通过设置CSS属性来实现页面底部定位。 <style lang"scs…...
Jenkins 部署 之 Mac 一
Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境,如果没有安装,先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装,终端输入命令:brew -v Mac安装HomeB…...
【FastAPI 使用FastAPI和uvicorn来同时运行HTTP和HTTPS的Python应用程序】
在本文中,我们将介绍如何使用 FastAPI和uvicorn来同时运行HTTP和HTTPS的 Python应用程序。 简介 FastAPI是一个高性能的Web框架,可以用于构建快速、可靠的API。它基于Python的类型提示和异步支持,使得开发者可以轻松地编写出安全且高效的代…...
HCIA-路由器相关知识和面试问题
二、 路由器 2.1 关于路由器的知识 2.1.1 什么是路由器 路由器是一种网络层互联设备,主要用于连接多个逻辑上分开的网络,实现不同网络之间的数据路由和通信。它能根据网络层地址(如 IP 地址)来转发数据包,在网络中起…...
Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】
文章目录 DockerJenkins部署SpringBoot项目一.准备工作1.1安装jdk111.2安装Maven 二.Docker安装Jenkins2.1安装Docker2.2 安装Jenkins2.3进入jenkins 三.Jenkins设置3.1安装jenkins插件3.2全局工具配置全局配置jdk全局配置maven全局配置git 3.3 系统配置安装 Publish Over SSH …...
PCL 点云数学形态学操作(腐蚀)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 基本原理:使用结构元素(通常为滤波的窗口)的窗口模板作为处理单元,利用形态学中的膨胀与腐蚀相组合即可达到滤波的效果。 点云数据中的数学形态学运算其实和二维图像上的运算非常相似,图像上像素有x,y和亮度值…...
【设计模式】【行为型模式】观察者模式(Observer)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
RAGFlow和Dify对比
RAGFlow和Dify都是基于大语言模型(LLM)的应用开发平台,具有相似的功能和应用场景,但它们在技术架构、部署要求和用户体验上存在一些差异。 RAGFlow和Dify对比 2025-02-13 22.08 RAGFlow 技术栈:RAGFlow…...
AI前端开发:蓬勃发展的机遇与挑战
人工智能(AI)领域的飞速发展,正深刻地改变着我们的生活方式,也为技术人才,特别是AI代码生成领域的专业人士,带来了前所未有的机遇。而作为AI应用与用户之间桥梁的前端开发,其重要性更是日益凸显…...
结构型模式---代理模式
概念 代理模式是一种结构型模式,主要用于在客户端和接口之间添加一个中间层,用于在客户端和接口之间进行权限控制或者其他的中间层操作。 使用场景 1、延缓初始化,当我们偶尔需要使用一个重量级的服务对象,如果一直保持该对象的…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
