websocket协议 | http协议

news2024/10/2 1:38:03

文章目录

  • 一、前言
  • 二、websocket协议
    • 2.1 怎么建立websocket连接
  • 三、HTTP协议
    • 3.1 特点
    • 3.2 报文格式
    • 3.3 连接方式
      • 三次握手
      • 四次挥手
    • 3.4 版本
      • HTTP 1.0
      • HTTP 1.1
    • 3.1 http长轮询
      • 场景:扫码登陆
  • 四、二者比较
    • 4.1 相同
    • 4.2 区别
      • 1.通讯方式不同
      • 2.通信效率
      • 3.数据格式

一、前言

  http协议是应用层最常用的请求协议之一,我们在浏览器或客户端做的任意操作,都可以得到来自服务端的响应,这种请求-响应的通信模式在web技术发展初期应用的十分广泛,满足了当时人们对网络通信的需求。

  有了http协议为什么还要有websocket协议?
  http协议作为一个“一问一答”的半双工请求协议,不能实现服务端主动向客户端推送数据的需求,于是有了websocket协议。



二、websocket协议

  websocket是全双工、有状态的协议。
  通信模式是双向通信,一次http握手后,客户端和服务端双方可以随时发送和接收消息。

在这里插入图片描述

2.1 怎么建立websocket连接

  我们平时刷网页,一般都是在浏览器上刷的,一会刷刷图文,这时候用的是HTTP协议,一会打开网页游戏,这时候就得切换成我们新介绍的websocket协议。
  为了兼容这些使用场景。浏览器在TCP三次握手建立连接之后,都统一使用HTTP协议先进行一次通信。
• 如果此时是普通的HTTP请求,那后续双方就还是老样子继续用普通HTTP协议进行交互,这点没啥疑问。
• 如果这时候是想建立websocket连接,就会在HTTP请求里带上一些特殊的header头。

Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: T2a6wZlAwhgQNqruZ2YUyg==\r\n

  这些header头的意思是,浏览器想升级协议(Connection: Upgrade),并且想升级成websocket协议(Upgrade: websocket)。
  同时带上一段随机生成的base64码(Sec-WebSocket-Key),发给服务器。
  如果服务器正好支持升级成websocket协议。就会走websocket握手流程,同时根据客户端生成的base64码,用某个公开的算法变成另一段字符串,放在HTTP响应的 Sec-WebSocket-Accept 头里,同时带上101状态码,发回给浏览器。

HTTP/1.1 101 Switching Protocols\r\n
Sec-WebSocket-Accept: iBJKv/ALIW2DobfoA4dmr3JHBCY=\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n

  http状态码=200(正常响应)的情况,大家见得多了。101确实不常见,它其实是指协议切换。
在这里插入图片描述

  base64转为新的字符串之后,浏览器也用同样的公开算法将base64码转成另一段字符串,如果这段字符串跟服务器传回来的字符串一致,那验证通过。
在这里插入图片描述

  对比客户端和服务端生成的字符串,就这样经历了一来一回两次HTTP握手,websocket就建立完成了,后续双方就可以使用webscoket的数据格式进行通信了。



三、HTTP协议

  HTTP(Hypertext Transfer Protocol)是一种用于在Web上进行数据通信的协议。它是一种应用层协议,建立在TCP/IP协议之上,用于在客户端和服务器之间传输超文本(Hypertext)资源。

3.1 特点

  • 请求-响应的通信模式:一个请求对应一个响应,不能主动发起响应
  • 无状态:每个请求都是独立的,服务器不会记住之前的请求信息或客户端的状态
  • 半双工:通信双方在同一时间内只能有一个方向上的数据传输,不能同时进行双向的数据传输。

3.2 报文格式

在这里插入图片描述

3.3 连接方式

三次握手

  全程SYN字段置为1,表示需要建立TCP连接。

  • 第一次握手:客户端发送建立TCP连接的请求报文,seq序列号是由发送端随机生成的。(SYN=1,seq=x,x为随机生成数值);

  • 第二次握手:服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的;并且会产生ACK字段,ACK客户端发送过的seq+1,已验收回复的是哪个链接请求。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)

  • 第三次握手:客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)。

在这里插入图片描述

  三次握手结束后就可以开始传输数据了。
  在第二次握手时,一次性做了两件事:1.服务器返回SYN标志位数置1,表示建立TCP连接;2.服务器返回ACK标志,表示验证字段成功。

四次挥手

  全程FIN字段置为1,表示需要断开TCP连接。

  • 第一次挥手:客户端发送断开TCP连接请求的报文,报文中包含seq序列号,是由发送端随机生成的,用于标识要切断的是哪个连接。(FIN=1,seq=x,x由客户端随机生成);

  • 第二次挥手:服务端回复客户端,其中seq序列号是随机生成的,ACK字段数值是在客户端发过来的seq序列号基础上加1,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成);

  • 第三次挥手:服务端再次回复完客户端,为什么要再回复一次呢?因为服务端要确认并等待所有数据都传输完,传输完毕后通知客户端要断开连接了。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成);

  • 第四次挥手:客户端收到断开请求后,回复服务端的断开请求,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)

在这里插入图片描述
  四次挥手结束后,连接就彻底关闭了。
  为什么不是三次而是四次呢,因为关闭连接前还要等待数据传输完毕,多了这个步骤。

3.4 版本

  HTTP协议的版本已经到了HTTP/3,但我们目前常用的还是1.1版本和2版本。

HTTP 1.0

  HTTP 1.0是HTTP协议的第一个正式版本,发布于1996年。相比于较早的HTTP 0.9版本,HTTP 1.0引入了一些重要的特性和改进,包括:

  1. 支持多媒体类型:HTTP 1.0引入了MIME(Multipurpose Internet Mail Extensions)标准,使得HTTP协议能够传输不同类型的媒体数据,如图像、音频和视频等。这扩展了HTTP的应用范围,使得Web页面能够包含更丰富的内容。

  2. 支持状态码:HTTP 1.0引入了状态码,用于表示请求的处理结果。常见的状态码包括200表示成功、404表示资源未找到、500表示服务器错误等。通过状态码,客户端能够了解请求的处理情况,并根据需要采取相应的操作。

  3. 支持持久连接:HTTP 1.0引入了持久连接(Keep-Alive)机制,使得在单个TCP连接上可以发送多个HTTP请求和响应。这减少了TCP连接的建立和关闭开销,提高了性能和效率。

  4. 支持缓存:HTTP 1.0引入了缓存机制,使得客户端和中间代理服务器能够缓存服务器返回的响应。这减少了对服务器的请求次数,提高了响应速度和带宽利用率。

  5. 支持代理服务器:HTTP 1.0支持通过代理服务器进行请求和响应的转发。代理服务器可以提供缓存、负载均衡、安全过滤等功能,增强了网络的可扩展性和安全性。

  6. 支持虚拟主机:HTTP 1.0引入了虚拟主机的概念,使得一台物理服务器可以托管多个域名和网站。通过在请求头中指定Host字段,服务器能够根据不同的域名来提供不同的网站内容。

HTTP 1.1

  1. 持久连接(Persistent Connections):HTTP 1.1引入了持久连接的概念,意味着在单个TCP连接上可以发送多个HTTP请求和响应,避免了为每个请求/响应建立新的连接的开销。这减少了网络延迟和连接建立的次数,提高了性能。

  2. 流水线(HTTP Pipelining):HTTP 1.1支持流水线机制,允许客户端在不等待响应的情况下连续发送多个请求。服务器可以按照请求的顺序进行处理,并将响应按照相同的顺序返回。这样可以减少请求-响应的延迟时间,提高了吞吐量。

  3. 范围请求(Range Requests):HTTP 1.1允许客户端发送范围请求,即只请求资源的特定部分。这对于大型文件的分段下载和断点续传很有用。服务器可以根据请求的范围返回相应的部分内容,而不是整个文件。

  4. 缓存控制(Cache Control):HTTP 1.1引入了更强大的缓存机制。通过使用Cache-Control头部字段,服务器可以向客户端提供缓存策略,指示客户端是否可以缓存响应、以及缓存的有效期等信息。这有助于减少对服务器的请求,提高性能。

  5. Host头部字段:HTTP 1.1中引入了Host头部字段,用于指定请求的目标服务器的主机名。这允许在同一个IP地址上托管多个域名,提供了更好的虚拟主机支持。

  6. 支持分块传输编码(Chunked Transfer Encoding):HTTP 1.1支持分块传输编码,可以将实体分成多个块进行传输。这对于动态生成内容或者以流的方式传输数据很有用,可以提前将数据发送给客户端,而不必等待全部数据准备完毕。

  这些是HTTP 1.1版本的一些主要特性,它们改善了性能、可靠性和灵活性,使HTTP协议适应了更复杂和高效的网络应用场景。HTTP 1.1成为了Web应用中最为广泛使用的版本,直到HTTP/2的出现。

3.1 http长轮询

场景:扫码登陆

  将http请求的超时时间设置为30秒,30秒内用户扫描就可以立即登陆,超时则提示刷新二维码。
在这里插入图片描述



四、二者比较

4.1 相同

  都是应用层的协议
在这里插入图片描述

4.2 区别

1.通讯方式不同

在这里插入图片描述

2.通信效率

  WebSocket协议相较于HTTP协议在通信效率方面具有一定的优势,主要体现在以下几个方面:

  1. 连接减少:由于HTTP协议是无状态的,每次请求都需要重新建立连接,而WebSocket协议支持长连接,连接建立后可以持久保持,因此减少了连接的建立和关闭的开销。
  2. 消息开销减少:HTTP协议在每次通信时,需要携带大量的请求头和响应头信息,而WebSocket协议仅需要携带较少的头部信息,可以减少消息的传输开销。
  3. 低延迟:HTTP协议每次通信都需要客户端发起请求,服务器返回响应后才能接收数据,这会导致一定的延迟。而WebSocket协议通过建立长连接,可以实现服务器主动推送数据给客户端,实时性更高,减少了延迟。

3.数据格式

  HTTP协议使用明文文本格式进行通信,通过请求头和请求体传递数据。WebSocket协议使用二进制或文本格式传输数据,通过帧(Frame)进行封装和解析。

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

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

相关文章

XD 文件怎么打开,一分钟快速搞定

Adobe XD 是一款强大的用户界面和用户体验设计工具,广泛用于创建交互式原型、网站和移动应用程序,其中包含设计的所有元素和交互信息。 如果你拿到.xd 文件,却没有安装 Adobe XD 软件,下载安装步骤也很繁琐,纠结如何打…

LeetCode刷题笔记【34】:动态规划专题-6(完全背包、零钱兑换II、组合总合IV)

文章目录 前置知识经典完全背包问题(纯完全背包问题)题目描述解题思路如何实现"物品可以被多次添加"?遍历物品和遍历背包容量(内外层遍历)能否调换? 代码 518. 零钱兑换 II题目描述解题思路初始化&递推公式内层for循环顺序内外层for循环的顺序(先遍历物品还是先…

聊聊电商系统架构演进

具体以电子商务网站为例, 展示web应用的架构演变过程。 1.0时代 这个时候是一个web项目里包含了所有的模块,一个数据库里包含了所需要的所有表,这时候网站访问量增加时,首先遇到瓶颈的是应用服务器连接数,比如tomcat连…

含叠氮的代谢糖蛋白标记试剂361154-30-5,N -叠氮乙酰基甘露糖胺-四酰基化

产品简介:N-叠氮乙酰基甘露糖胺-三酰化(AC4MANAZ)可用作标记试剂,点击糖化学试剂,叠氮化物基团允许它与炔烃反应,是一种含叠氮的代谢糖蛋白标记试剂,叠氮化物修饰的蛋白质可以通过与炔烃反应检测…

(c语言进阶)指针的进阶

一.字符指针 1.一般应用 (1)%c的应用 (2)%s的应用 字符指针没有权限通过解引用去改变指针指向的值 2.笔试题 题目:判断输出结果 int main() { const char* p1 "abcdef"; const char* p2 "…

《ImageNet Classification with Deep Convolutional Neural Networks》阅读笔记

论文标题 《ImageNet Classification with Deep Convolutional Neural Networks》 ImageNet :经典的划时代的数据集Deep Convolutional:深度卷积在当时还处于比较少提及的地位,当时主导的是传统机器学习算法 作者 一作 Alex Krizhevsky 和…

点餐小程序实战教程07-点餐功能开发

目录 1 菜品列表功能2 给分类添加排序字段3 给数据列表设置筛选条件4 实现数量选择5 全局变量定义6 选购数量初始化总结 上一篇我们介绍了菜品分类功能,主要是使用侧边选项卡组件来实现。在点餐场景中,我们在选中分类的时候是希望看到分类下的菜品&#…

面试官:听说你很懂SpringMVC,那讲讲其内部对于请求的处理吧!

本系列文章皆在分析SpringMVC的核心组件和工作原理,让你从SpringMVC浩如烟海的代码中跳出来,以一种全局的视角来重新审视SpringMVC的工作原理. 作者:毅航 在过去的很长一段时间内,笔者对SpringMVC中的核心控制器DispatcherServle…

《鱿鱼游戏》杀入体验店 SandboxVR未能复制神话

曾经火爆全网的剧集《鱿鱼游戏》这回真的变成游戏了,而且还是能身临其境去玩的那种。 9月底,沉浸式游戏社交公司Sandbox VR与全球知名流媒体Netflix合作,将《鱿鱼游戏》搬入VR体验店,用线下场地VR的方式,重现123木头人…

jvm--执行引擎

文章目录 1. 执行引擎的工作流程2. 解释器、JIT及时编译器3. 热点代码及探测技术4. HotSpotVM 中 JIT 分类 执行引擎属于 JVM 的下层,里面包括解释器、及时编译器、垃圾回收器 JVM 的主要任务是负责 装载字节码到其内部,但字节码并不能够直接运行在操作…

vite+vue3+ts中使用require.context | 报错require is not defined | 获取文件夹中的文件名

vitevue3ts中使用require.context|报错require is not defined|获取文件夹中的文件名 目录 vitevue3ts中使用require.context|报错require is not defined|获取文件夹中的文件名一、问题背景二、报错原因三、解决方法 一、问题背景 如题在vitevue3ts中使用required.context时报…

JDK21 要来了,,你不会还在用 Java 8吧!

目前 Java 的最新稳定版是 JDK 20,但这是个过渡版,JDK21就是 LTS 版的了,也快要发布了,在今年9月份(也就是2023年9月)就要正式发布了。 但是,猜都不用猜,你肯定还在用 Java 8 吧&…

【密评】商用密码应用安全性评估从业人员考核题库(七)

商用密码应用安全性评估从业人员考核题库(七) 国密局给的参考题库5000道只是基础题,后续更新完5000还会继续更其他高质量题库,持续学习,共同进步。 1501 判断题 在公钥密码体制中,使用接收方的公钥加密的消…

MySQL通用查询日志 general query log 详解

通用查询日志(general query log)用来记录用户的所有操作,包括启动和关闭MySQL服务、所有用户的连接开始时间和截止时间、发送给MySQL数据库服务器的所有SQL指令等。当我们的数据发生异常时,查看通用查询日志,还原操作…

Oracle笔记-对ROWNUM的一次理解(简单分页)

此博文记录时间:2023-05-05,发到互联网上是2023-10-09 这个在分页里面用得比较多,在MySQL中,通常使用limit去操作,而去感觉比较简单,Oracle中无此关键字。 通过查阅资料后,要实现分页需要用到…

论文阅读笔记(Clover: 计算与存储被动分离的分布式键值存储系统)

关于Disaggregating Persistent Memory and Controlling Them Remotely: An Exploration of Passive Disaggregated Key-Value Stores这篇论文的笔记 原文链接 提出背景 传统的分布式存储系统中,每个节点都会包含计算和存储两个部分,一个节点既可以访…

分割等和子集

题目链接 分割等和子集 题目描述 注意点 数组 nums 非空数组 nums 只包含正整数 解答思路 最初想到的是根据回溯剪枝解决本题,如果数组大小小于2,则肯定不能找到分割等和子集,除此以外,如果数组之和sum不能被2整除&#xff0…

VMvare虚拟机安装国产麒麟V10桌面操作系统

一、系统下载 进入银河麒麟官网:https://www.kylinos.cn/ 选择桌面操作系统,然后进入操作系统版本选择页面,选择银河麒麟桌面操作系统V10 选择后,进入系统介绍页面,然后点击申请试用 点击后进入申请页面&#xf…

Apache Solr9.3 快速上手

Apache Solr 简介 Solr是Apache的顶级开源项目,使用java开发 ,基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对Lucene的性能进行了优化。 安装 下载 : 下载地址解压 : tar -zxv…

uniapp apple 苹果登录 离线本地打包

官方文档 uni-app官网 文档写的不全,没有写离线打包流程 加lib 签名里带 sign in with apple hbuilder开关 代码 测试代码,获取app里所有的provider uni.getProvider({service: oauth,success: function (res) {console.log(res.provider)uni.showT…