HTTP 和 WebSocket
目录
- HTTP是什么
- HTTP局限性(HTTP1.1)
- 请求和响应
- HTTP的主要特点:
- HTTP版本:
- HTTP与TCP关系
- 数据封装传输过程
- 1. **协议层次模型**:
- 2. **封装过程**:
- 1. **应用层(HTTP)**:
- 2. **传输层(TCP)**:
- 3. **网络层(IP)**:
- 4. **数据链路层**:
- 5. **物理层**:
- WebSocket是什么
- WebSocket URL 格式
- 通过http协议升级为websocket协议
- ping-pong(心跳)机制
- websocket关闭连接
- websocket安全性
- WebSocket 和 HTTP 之间区别
HTTP是什么
HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于在网络上传输数据的协议。它是Web上信息传递的基础,允许客户端(通常是浏览器)和服务器之间交换文本、图像、视频和其他类型的数据。HTTP是一种无状态的请求-响应协议,意味着每次请求都是独立的,服务器不会记住之前的请求。
即请求一次,响应一次。
那么问题来了,HTTP是请求一次,响应一次,服务器不能给客户端发送信息。但是HTTP通过TCP建立长连接,为什么客户端服务器不能持续通信?
- HTTP的请求-响应模型是单向的无状态的
请求-响应模型
- 单向通信:在 HTTP 中,通信的基本模型是请求-响应模式。客户端发出请求后,服务器处理请求并返回响应。在这个过程中,客户端必须首先发起请求,服务器才能返回数据。
- 无状态:HTTP 是无状态的协议,服务器不会记住客户端的请求历史。这意味着每次请求都是独立的,服务器无法主动向客户端发送信息。
- 即使 TCP 连接保持开放,服务器仍然不能主动向客户端发送数据
- 持久连接:在 HTTP/1.1 中,引入了持久连接(Keep-Alive),允许多个 HTTP 请求/响应在同一个 TCP
连接上进行,而无需为每个请求建立新的 TCP 连接。这降低了连接建立和关闭的开销。- 连接的生存时间:持久连接的存在并不意味着客户端和服务器可以在同一连接上进行持续的双向通信。即使 TCP连接保持开放,服务器仍然不能主动向客户端发送数据,客户端必须先发送请求。
- HTTP/2改进的服务器推送并不是持续的双向通信
- 多路复用:在 HTTP/2中,虽然仍然遵循请求-响应模型,但允许在同一个连接上并行处理多个请求和响应。这种多路复用可以提高效率,减少延迟。
- 服务器推送:HTTP/2引入了服务器推送的功能,服务器可以在客户端发出请求之前,主动发送某些资源到客户端。这种方式虽然实现了服务器主动发送数据的能力,但仍然是在特定条件下进行的,并不是持续的双向通信。
- 持续通信的实现,WebSocket
- WebSocket:对于需要实时双向通信的应用,WebSocket 协议被引入。WebSocket允许在同一连接上进行持续的双向数据交换,客户端和服务器可以在任何时候发送和接收数据。这使得 WebSocket适用于实时聊天、在线游戏等需要频繁更新数据的场景。
HTTP局限性(HTTP1.1)
- 因为HTTP是无状态,半双工的通信。意味着客户端给服务端发请求或是服务端给客户端发请求,都需要建立TCP连接,一来一回都要三次握手,会造成资源浪费和延迟。
- 安全性,HTTP传输明文不安全,需要HTTPS加强安全性。
- 适应性差,HTTP设计初衷是用于静态页面,对动态内容支持不灵活。
请求和响应
HTTP 请求由客户端(通常是浏览器)发起,向服务器请求资源。一个标准的 HTTP 请求包括以下几个部分:
请求行,请求头,请求体
GET /index.html HTTP/1.1
请求行
请求行包含三个部分:请求方法:指示要执行的操作,如 GET、POST、PUT、DELETE 等。
请求 URI:指定要访问的资源的地址。
HTTP版本:指明使用的 HTTP 版本,例如 HTTP/1.1。
请求头
请求头部包含多个键值对,用于传递客户端的信息和请求的附加参数。常见的请求头包括:
Host:请求的服务器名称和端口号。
User-Agent:客户端软件的名称和版本信息。
Accept:客户端可接受的内容类型。
Content-Type:发送数据的内容类型(对于 POST 和 PUT 请求)。
Authorization:身份验证信息。
请求体
请求体用于在 POST、PUT 等方法中发送数据。例如,在表单提交中,数据通常会包含在请求体中。
HTTP/1.1 200 OK
状态行
状态行包含三个部分:HTTP 版本:指明使用的 HTTP 版本。
状态码:表示请求的处理结果(如成功、失败、错误等)。
状态描述:状态码的文本描述。
响应头
响应头部包含多个键值对,提供关于服务器和响应的附加信息。常见的响应头包括:
Content-Type:响应内容的类型(如 text/html、application/json)。 服务器回复的数据格式
Content-Length:响应体的长度(以字节为单位)。
Set-Cookie:服务器发送的 cookie。
Cache-Control:缓存策略。
响应体
响应体是实际传递给客户端的数据,可能是 HTML 页面、JSON 数据、图像等。对于成功的请求,响应体通常包含所请求的资源。
HTTP的主要特点:
- 请求-响应模型:客户端向服务器发送请求,服务器处理请求并返回响应。
- 无状态:每个请求都是独立的,服务器不保留请求之间的状态信息。
- 灵活性:支持多种数据格式,包括HTML、XML、JSON等。
- 可扩展性:可以通过不同的HTTP头部和状态码扩展功能。
HTTP版本:
- HTTP/1.0:最早的版本,简单易用,但存在一些性能问题。
- HTTP/1.1:增强了性能,支持持久连接和更多的控制功能。
- HTTP/2:引入了多路复用、服务器推送等功能,提升了性能。
- HTTP/3:基于QUIC协议,进一步优化了连接的建立和数据传输的效率。
HTTP与TCP关系
- TCP:属于传输层协议,负责在网络上提供可靠的数据传输。它确保数据包在传输过程中的完整性和顺序,并能处理丢包、重传等问题。
- HTTP:属于应用层协议,构建在TCP之上,负责具体的数据交换和应用逻辑(如网页请求和响应)。
- HTTP 并不直接与 TCP 进行数据交互,而是将应用层数据交给传输层(TCP)。TCP 将 HTTP 的请求或响应报文作为数据负载,并通过 TCP 连接发送到目的地。
- 在传输过程中,TCP 负责保证 HTTP 数据段的完整性和有序性。TCP 对 HTTP 数据报文进行分段、传输,然后接收端再通过 TCP 重组这些数据段,最后将完整的 HTTP 数据交给应用层的 HTTP 服务器或客户端处理。
数据封装传输过程
HTTP(超文本传输协议)是对应用层的数据进行封装,并将封装后的数据通过TCP协议传输。
1. 协议层次模型:
- HTTP(应用层协议):HTTP 位于 OSI 模型的应用层,负责定义客户端和服务器之间的请求与响应格式。HTTP 处理的是 Web 内容(如 HTML 页面、图片、视频等)的传输。
- TCP(传输层协议):TCP 位于 OSI 模型的传输层,负责数据的可靠传输。TCP 对应用层传递下来的数据进行分段传输,并保证数据按顺序、无差错地到达目的地。
2. 封装过程:
在网络通信中,数据通过逐层封装的方式进行传输。具体来说,HTTP 数据是通过如下步骤封装和传输的:
1. 应用层(HTTP):
- HTTP 客户端(如浏览器)发送 HTTP 请求,生成应用层的数据报文。这包括 HTTP 请求行、头部、以及消息体等内容。
2. 传输层(TCP):
- HTTP 的数据报文被传递到传输层,TCP 协议对其进行分段,并为每个段添加 TCP 头部信息(如序列号、端口号、校验和等)。这就是 TCP 数据段。
- TCP 确保分段的数据可靠传输,并在必要时进行重传和确认。
3. 网络层(IP):
- TCP 数据段传递到网络层,IP 协议负责对这些段进行进一步封装,加入源 IP 和目标 IP 地址,生成 IP 数据包。
4. 数据链路层:
- 最后,网络层的 IP 包被传递到数据链路层,在这里被封装成帧,准备在物理层上传输(如以太网帧)。
5. 物理层:
- 数据链路层的帧通过物理层(如电缆、无线等)在网络上传输。
WebSocket是什么
WebSocket 是一种(应用层的)网络通信协议,旨在实现客户端和服务器之间的全双工(双向)通信。它为实时 Web 应用程序提供了一种有效的解决方案,能够在一个持久连接上进行低延迟的数据交换。
HTTP是半双工通信。
WebSocket URL 格式
ws://[host]:[port]/[path]
ws:表示 WebSocket 协议(未加密)。
wss:表示安全的 WebSocket 协议(加密,类似于 HTTPS)。
[host]:服务器的主机名或 IP 地址。例如,example.com。
[port]:可选,指定端口号。如果省略,默认端口为 80(对于 ws)或 443(对于 wss)。
[path]:服务器上 WebSocket 服务的路径。例如,/chat。
ws和HTTP默认端口相同,都是80;wss和HTTPS默认端口相同,都是443。
通过http协议升级为websocket协议
- 客户端发起 HTTP 请求
客户端使用标准的 HTTP GET 方法,向服务器发送请求,同时在请求头中包含一些特别的字段,以指明希望升级到 WebSocket。 - 服务器响应
如果服务器支持 WebSocket 协议,它将会返回一个 101 状态码的 HTTP 响应,表明协议已成功升级。 - 建立 WebSocket 连接
一旦客户端收到带有 101 状态的响应,HTTP 连接就升级为 WebSocket 连接,双方可以开始以 WebSocket 格式进行双向通信。
ping-pong(心跳)机制
WebSocket 的 Ping-Pong 机制是维持连接稳定性的重要手段,确保双方在长时间不活动的情况下仍然能够保持连接有效性。
机制流程
- 连接建立后:当 WebSocket 连接建立时,双方开始通信并交换数据。
- 定时发送 Ping 帧: 一般情况下,服务器会设置一个定时器,定期向客户端发送 Ping 帧。例如,每隔 30 秒发送一次。
- 客户端回应 Pong 帧: 客户端在收到 Ping 帧后,立即发送 Pong 帧作为响应。这表明连接仍然有效且双方都能正常通信。
- 监测连接状态: 如果服务器在一定时间内没有收到客户端的 Pong 响应,它可能会认为连接已断开,可以选择关闭连接或尝试重新连接。
websocket关闭连接
使用 WebSocket API 中的 close() 方法。
close() 方法可以接受两个可选参数:
code: 一个整数,表示关闭连接的状态码。常用的状态码包括:
1000 - 正常关闭。
1001 - 由于端点迁移而关闭。
1002 - 收到无效的数据。
1003 - 收到无效的数据类型。
reason: 一个字符串,表示关闭连接的原因(可选)。
websocket安全性
使用 wss:// 协议而不是 ws://。WSS 是 WebSocket 协议的安全版本,它通过 TLS(传输层安全协议)对数据进行加密,确保在网络上传输的数据不被窃听或篡改。
使用wss时,必须提供有效的SSL/TLS证书。
WebSocket 和 HTTP 之间区别
特性 | HTTP | WebSocket |
---|---|---|
协议类型 | 无状态的请求-响应协议 | 全双工通信协议 |
连接方式 | 每次请求都要建立新的连接 | 一旦建立连接,可以持续使用同一连接 |
数据传输模式 | 单向(客户端发送请求,服务器响应) | 双向(客户端和服务器可以相互发送消息) |
性能效率 | 较高的延迟(每次请求都需建立连接) | 低延迟(长连接,减少握手次数) |
数据格式 | 通常为文本/HTML、JSON等 | 可以是文本、二进制数据 |
协议升级 | 不支持 | 支持通过 HTTP 升级到 WebSocket |
心跳机制 | 无 | 可以实现心跳机制以保持连接活跃 |
适用场景 | 适用于静态内容、REST API请求 | 适用于实时应用,如聊天、游戏等 |
安全性 | 使用 HTTPS 提供安全性 | 使用 WSS 提供加密和安全性 |
头部开销 | 请求和响应中都有额外的头部信息 | 连接后只有数据帧,头部信息较少 |
相关文章:

HTTP 和 WebSocket
目录 HTTP是什么HTTP局限性(HTTP1.1)请求和响应HTTP的主要特点:HTTP版本: HTTP与TCP关系数据封装传输过程1. **协议层次模型**:2. **封装过程**:1. **应用层(HTTP)**:2. …...

科技云报到:大模型时代下,向量数据库的野望
科技云报到原创。 自ChatGPT爆火,国内头部平台型公司一拥而上,先后发布AGI或垂类LLM,但鲜有大模型基础设施在数据层面的进化,比如向量数据库。 在此之前,向量数据库经历了几年的沉寂期,现在似乎终于乘着Ch…...

贪吃蛇游戏(代码篇)
我们并不是为了满足别人的期待而活着。 前言 这是我自己做的第五个小项目---贪吃蛇游戏(代码篇)。后期我会继续制作其他小项目并开源至博客上。 上一小项目是贪吃蛇游戏(必备知识篇),没看过的同学可以去看看…...

数控走心机系统可以定制吗
当然,走心机系统是可以定制的。随着数控技术的不断发展,走心机的数控系统越来越灵活,可以根据用户的具体需求进行定制和优化。下面,我将从几个方面来详细解答这个问题: 一、系统定制的必要性 1. 满足不同加工需求…...

PHP实现OID(Object identifier)的编码和解码
转载于:https://bkssl.com/document/php_oid_encode_decode.html <?phpclass ASN1ObjectIdentifier {/*** OID字符串编码为二进制数据* param string $oid 字符串形式的OID* return string*/public static function encode($oid){$parts explode(., $oid);$pa…...

架构设计笔记-12-信息系统架构设计理论与实践
目录 知识要点 案例分析 1.Java企业级应用系统 2.c/s架构,b/s架构 知识要点 软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一类架构所共有的特征,主要包括架构定义、架构词汇表和架构约束。 数据挖掘是从数据库的大…...

【Power Compiler手册】15.多角多模式设计中的功耗优化
多角多模式设计中的功耗优化 可以使用多个运行条件和多种模式进行综合的设计被称为多角多模式设计。Design Compiler Graphical工具扩展了拓扑技术,以分析和优化这些设计。 有关多角多模式技术支持的综合工具的更多信息,请参见以下主题: • 优化多角多模式设计 • 报告命…...

关于HalconDeeplearn中的语义分割的实现
1.读取数据和数据集 read_dl_model (C:/Users/user/Desktop/大蒜测试/包裹/model_训练-240926-191345_opt.hdl, DLModelHandle) read_dict(C:/Users/user/Desktop/大蒜测试/包裹/model_训练-240926-162708_opt_dl_preprocess_params.hdict,[], [], DLDataset) 2.读取识别图片 I…...

【STL】AVLTree模拟实现
AVLTree模拟实现 1 前言2 AVL树的插入2.1 平衡因子不继续向上更新的情况2.2 平衡因子变为2或者-2,发生旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋 3 代码 1 前言 二叉搜索树的不足:如果出现极端情况,效率会变得很低。 AVL&am…...

无极低码课程【tomcat部署windows环境厂家乱码处理】
windows 下tomcat安装 下载地址一:https://tomcat.apache.org/download-90.cgi 下载地址二:https://archive.apache.org/dist/tomcat/ 解压tomcat,进入bin目录运行startup.bat...

注册安全分析报告:惠农网
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)
0x01 漏洞概述 Qualitor 8.24及之前版本存在任意文件上传漏洞,未经身份验证远程攻击者可利用该漏洞代码执行,写入WebShell,进一步控制服务器权限。 0x02 复现环境 FOFA:app="Qualitor-Web" 0x03 漏洞复现 PoC POST /html/ad/adfilestorage/request/checkAcess…...

PHP-FPM和FastCGI
文章目录 前言一. FastCGI1.定义2.工作方式3.协议4.架构5.工作原理(请求生命周期) 二. PHP-FPM1.定义:2.特性3.进程管理模式4.工作流程 三.关系与应用四.配置示例五.性能优化六.配置选项七.常见问题及解决方案 前言 PHP-FPM 是基于 FastCGI …...

【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
目录 零.前置篇章 一.make的由来 二.安装make 三.编写Makefile 四.编译运行 五.删除可执行文件 零.前置篇章 第一篇【Linux快速入门】Linux与ROS学习之编译基础(gcc编译)_linuxros-CSDN博客 一.make的由来 "make"是一个用于自…...

jupyterlab的安装与使用攻略/包括汉化方法
官网链接 Project Jupyter | Home 1.第一步安装 打开控制台 使用pip工具安装 pip install jupyterlab 如图 2.安装成功后启动 jupyter lab 会自动启动它的web页面 然后就可以正常使用咯!! 如果需要更换浏览器访问 新开控制台执行下面命令 jupy…...

std::list
std::list是C标准库中的一个序列容器,它提供了双向链表的功能。std::list允许在序列的任何位置高效地插入和删除元素,而不会引起其他元素的移动,这使得std::list在需要频繁插入和删除操作的场景中非常有用。 std::list的特性: 双…...

opencv-rust 系列2: camera_calibration
opencv-rust 系列2: camera_calibration 前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的. 说明: camera_calibration.rs是opencv-rust自带的示例, 在examples目录中可以找到,我增加了一些中文注释如下.如需运行可以在项目根目录执行命…...

JVM和GC案例详解
接上文JVM环境配置说明:上文博客 一、JVM远程连接设置 1. JMX方式连接(这种方式没有GC监控),设置如下 2. 连接成功后可以查看基础配置参数(和服务器配置一致) 2. jstatd方式连接(这种方式没有CPU监控) 添加jstatd方式连接 双击Tomcat࿰…...

postgreSql下载安装
一、下载 官网:PostgreSQL: The worlds most advanced open source database 二、安装 1.找到.exe文件,双击安装 2.跟着安装向导操作 三、启动...

GPT-SOVIT模型部署指南
一、模型介绍 强大的小样本语音转换和文本转语音 WebUI。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS: 仅使用 1 分钟的训练数据对模型进行微调,以提高语音相似度和真实感。跨语…...

怎么定时发朋友圈?
要实现微信朋友圈的定时发布,可以采用以下几种方法: 1、 绑定QQ号并使用QQ空间定时功能: 于微信和QQ的紧密联系,可以通过绑定QQ号,利用QQ空间的定时发布功能来间接实现微信朋友圈的定时发布。首先,在QQ空…...

如何利用phpstudy创建mysql数据库
phpStudy诞生于2007年,是一款老牌知名的PHP开发集成环境工具,产品历经多次迭代升级,目前有phpStudy经典版、phpStudy V8(2019版)等等,利用phpstudy可以快速搭建一个mysql环境,接下来我们就开始吧…...

五、Linux之Vi和Vim编辑器
基本介绍 Vi Linux 系统会内置 vi 文本编辑 Vim 具有程序编辑的能力,可以看做是 Vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富 常用的三种模式 正常模式 以 vim …...

git删除错误的commit
文章目录 1、git删除错误的commit2、.gitignore配置文件不生效的问题 1、git删除错误的commit git的流程如图: 当某次失误造成commit的版本有问题,需要回退到正常的版本修改后重新add。 首先通过git log查看commit提交记录,可以看到HEAD-…...

代码随想录算法训练营Day08 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字
文章目录 344.反转字符串思路与重点 541. 反转字符串II思路与重点 卡码网:54.替换数字思路与重点 344.反转字符串 题目链接:344. 反转字符串 - 力扣(LeetCode)讲解链接:代码随想录 (programmercarl.com)状态ÿ…...

mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁
mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁 MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资…...

【软件干货】Android应用进程如何保活?
1.Android 应用进程保活方法介绍 在Android应用程序中,为了保证应用的正常运行和稳定性,有时需要对应用进程进行保活。以下是一些实现进程保活的方法: 1、使用前台服务(Foreground Service):将服务调用startForeground()方法&…...

neo4j部署保姆级教程
由于公司是基于大数据架构的,让部署neo4j数据库,之前没有接触过,然后紧急学了一下,并且从网上找了一些教程,决定还是记录下来,后续有时间了会在出一篇使用教程 环境准备(root用户) …...

【STM32CubeMX开发】-2.2-TIM_输出一个PWM信号
目录 1 Tim定时器的时钟源 2 Tim定时器的配置 2.1 PWM配置 2.2 中断配置 3 生成代码 4 测试结果 结尾 1 Tim定时器的时钟源 TIM3的时钟来源自APB1 Timer clocks,时钟树上所有总线频率均设置为了STM32F0能达到的最高频率,此时APB1 Timer clocks …...

Ngx+Lua+Redis 快速存储POST数据
系统几万台设备有windows有安卓还有linux系统,每个设备三分钟就会向服务器post设备的硬件信息,数据格式json,后台管理界面只需要最新的数据,不需要历史数据,业务逻辑非常简单,PHP代码就几行,已经…...