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)的基础,负责在浏…...
java八股---java面向对象
面向对象 面向对象概述 面向对象和面向过程的区别 面向过程: 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能…...
《Deepseek入门到精通》2.0版本《Deepseek赋能职场应用》清华大学
🚀 《Deepseek入门到精通》2.0版本重磅发布! 📚 全新升级,赋能职场应用! 经过多次改版与优化,《Deepseek入门到精通》2.0版本已经正式上线!这不仅是一份技术指南,更是你提升职场竞争…...
关于防火墙运维面试题2
三、防火墙配置与管理类 21. 如何根据企业的网络安全策略,制定一套全面的防火墙规则集?需要考虑哪些关键因素? 以下是根据企业网络安全策略制定全面防火墙规则集的指导,以及需要考虑的关键因素: 一、关键因素 &…...
使用c++实现红黑树的构建和插入
1.红黑树简介: 红黑树实际上和AVL都属于一棵用于存储数据的平衡二叉搜索树,但是这棵树并不是使用平衡因子去维持平衡的,而是结合限制条件对结点标红标黑去让树达到类似平衡的效果。 2.红黑树的限制条件和效率分析: 2.1限制条件…...
在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合
文章目录 传统的神经网络框架存在的问题一. Transformer架构综述1.1 transformer的输入1.1.1 词向量1.1.2 位置编码(Positional Encoding)1.1.3 编码器与解码器结构1.1.4 多头自注意力机制 二.Transformer分步详解2.1 传统词向量存在的问题2.2 详解编解码…...
Jenkins项目CICD流程
Jenkins项目流程:1.配置git环境 git config --...2.把前后端的目录初始化位本地工作目录 #git init3.提交到本地git #git add ./ git commit -m "" git tag v14.然后提交到远程git(通过,用户,群组,项目,管理项目)git remote add origin http://...git push -…...
【IDEA】2017版本的使用
目录 一、常识 二、安装 1. 下载IDEA2017.exe 2. 安装教程 三、基本配置 1. 自动更新关掉 2. 整合JDK环境 3. 隐藏.idea文件夹和.iml等文件 四、创建Java工程 1. 新建项目 2. 创建包结构,创建类,编写main主函数,在控制台输出内容。…...
Git指南-从入门到精通
代码提交和同步命令 流程图如下: 第零步: 工作区与仓库保持一致第一步: 文件增删改,变为已修改状态第二步: git add ,变为已暂存状态 bash $ git status $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ g…...
Spring boot(maven) - Mybatis 超级入门版
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
Spark 性能优化 (三):RBO 与 CBO
1. RBO 的核心概念 在 Apache Spark 的查询优化过程中,规则优化(Rule-Based Optimization, RBO) 是 Catalyst 优化器的一个关键组成部分。它主要依赖于一组固定的规则进行优化,而不是基于统计信息(如 CBO - Cost-Base…...
读 DeepSeek-R1 论文笔记
DeepSeek-R1:通过强化学习激发大语言模型的推理能力 DeepSeek-AI 摘要 我们推出第一代推理模型DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero作为无需监督微调(SFT)预训练阶段、直接通过大规模强化学习(RL)训练的基础模型,展现出卓越的推理能力。…...
【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪
文章目录 【Android 开发 AI 实战】选择目标跟踪基于 opencv 实现 —— 运动跟踪一、引言二、Android 开发与 AI 的融合趋势三、OpenCV 简介四、运动跟踪原理(一)光流法(二)卡尔曼滤波(三)粒子滤波 五、基于…...
Eclipse JSP/Servlet 深入解析
Eclipse JSP/Servlet 深入解析 引言 随着互联网的快速发展,Java Web开发技术逐渐成为企业级应用开发的主流。在Java Web开发中,JSP(JavaServer Pages)和Servlet是两个核心组件,它们共同构成了Java Web应用程序的基础。本文将深入解析Eclipse平台下的JSP/Servlet技术,帮…...
申论概括类【2021副省第二题“局区合一”】
材料: “李总监,您好,我是芯谷产业功能区项目投资科的小罗,从今天开始,我就是你们公司的项目专员,以后有什么问题您都可以找我。”W光学有限公司总务部总监李晓枫接到小罗的电话时,既意外又暖心…...
如何保持长久无痛苦的学英语?
“无痛苦”学英语? 听起来像天方夜谭,但并非不可能! 关键在于,把英语学习变成你生活的一部分,融入你的兴趣和目标, 这样才能摆脱痛苦,享受学习的过程。 1. 兴趣是最好的老师: 找到自…...
SQL-leetcode—1661. 每台机器的进程平均运行时间
1661. 每台机器的进程平均运行时间 表: Activity ----------------------- | Column Name | Type | ----------------------- | machine_id | int | | process_id | int | | activity_type | enum | | timestamp | float | ----------------------- 该表展示了一家工厂网站的…...
Linux例行任务:at 、cron、 /etc/contain 辨析
文章目录 一、at:一次性任务调度1. **基本用法**2. **管理任务**3. **权限控制** 二、cron:周期性任务调度1. **用户级任务**2. **系统级任务**3. **特殊字符串**4. **权限控制**5. **环境问题** 三、容器环境中的例行任务1. **在容器内运行 cron**2. **…...
Vue2中常用指令
文章目录 Vue2中常用指令1. v-text 动态渲染纯文本内容1. 作用2. 基本用法3. 示例4. 注意事项 2. v-html 动态渲染 HTML 内容1. 作用2. 基本用法3. 示例4. 注意事项 3. v-bind 动态绑定 HTML 属性1. 作用2. 基本用法3. 示例4. 注意事项5. 绑定class属性的用法6. 绑定style属性的…...
Sequence to Sequence model
基础模型 基础模型是用RNN模型,前部分是encoder用来寻找法语输入的编码,后半部分是decoder用来生成英文翻译作为输出,每次输出一个单词,直到输出结束标志如EOS。 下面是另一个例子,在CNN模型输出层之前会输出图片的向…...
PHP 超级全局变量
PHP 超级全局变量 引言 在PHP编程中,超级全局变量(Superglobals)是一类特殊的变量,它们在任何函数、类或文件中都可以访问。这些变量在PHP的全局作用域中始终可用,为开发者提供了处理HTTP请求和响应的强大工具。本文…...
如何在Vscode中接入Deepseek
在VS Code(Visual Studio Code)中接入DeepSeek,可以按照以下步骤进行操作: 一、准备工作 确保VS Code为最新版本: DeepSeek可能依赖于VS Code的某些最新功能或修复,因此建议先将VS Code更新到最新版本。注…...
6.appender
文章目录 一、前言二、源码解析AppenderUnsynchronizedAppenderBaseOutputStreamAppenderConsoleAppenderFileAppenderRollingFileAppenderFileNamePattern 三、总结 一、前言 前一篇文章介绍了appender、conversionRule、root和logger节点的解析, 为的是为本篇详细介绍它们的…...
Golang的消息队列架构
一、消息队列的定义和作用 消息队列是一种在不同组件之间传递消息的通信机制。它可以解耦系统的各个部分,提高系统的可靠性和扩展性。消息队列可以在系统之间传递消息,并且在消息发送者和消息接收者之间进行异步通信,使得系统可以更加灵活和高…...
如何在Servlet容器中使用HttpServletResponse?
HttpServletResponse 是 Java Servlet API 中的一个接口,它代表了服务器对客户端的响应。通过 HttpServletResponse 对象,可以设置响应的状态码、发送数据到客户端(如 HTML 页面、文件等)、添加响应头信息等。下面是如何在 Servle…...
DeepSeek自然语言处理(NLP)基础与实践
自然语言处理(Natural Language Processing, NLP)是人工智能领域的一个重要分支,专注于让计算机理解、生成和处理人类语言。NLP技术广泛应用于机器翻译、情感分析、文本分类、问答系统等场景。DeepSeek提供了强大的工具和API,帮助我们高效地构建和训练NLP模型。本文将详细介…...
GESP5级语法知识(十一):高精度算法(一)
高精度加法: #include<iostream> #include<string> #include<algorithm> using namespace std; const int N501;//高精度数的最长长度 //c[]a[]b[]:高精度加法方案一:对应位相加,同时处理进位 void h_add_1(int a[],int b…...
【前端】 react项目使用bootstrap、useRef和useState之间的区别和应用
一、场景描述 我想写一个轮播图的程序,只是把bootstrap里面的轮播图拉过来就用上感觉不是很合适,然后我就想自己写自动轮播,因此,这篇文章里面只是自动轮播的部分,没有按键跟自动轮播的衔接部分。 Ps: 本文用的是函数…...
PYYAML反序列化详解
前言 最近看了很多pyyaml反序列化的漏洞利用,但是对漏洞怎么来的,没有进行很详细的分析,所以今天刚好学习一下反序列化的原理 Yaml基本语法 一个 .yml 文件中可以有多份配置文件,用 --- 隔开即可对大小写敏感YAML 中的值&#x…...
【离散数学上机】T235,T236
T235题目:输入集合A和B,输出A到B上的所有单射函数。 问题描述 给定非空数字集合A和B,求出集合A到集合B上的所有单射函数。 输入格式 第一行输入m和n(空格间隔),分别为集合A和集合B中的元素个数;…...
