当前位置:网站首页>WebSocket能干些啥?
WebSocket能干些啥?
2022-06-23 15:54:00 【用户7353950】
1)通知功能:
保持一个长连接,当服务端游新的消息,能够实时的推送到使用方。像知乎的点赞通知、评论等,都可以使用WebSocket通信。
某些使用H5的客户端,为了简化开发,也会使用WebSocket进行消息的通知,由于它是实时推送的,会有更好的用户体验。
2)数据收集:
一些次优级别的数据,比如行为日志、trace、异常执栈收集等,都可以开辟专门的WebSocket通道进行传输。这能够增加信息的集中度,并能及时的针对用户的行为进行合适的配置推送。由于大多数浏览器内核都支持,它将使客户端APM编程模型变得简单。
3)加密 && 认证:
虽然使用Fiddler、Charles等能够抓到很多WebSocket包。但如果同时开启SSL,传输加密后的二进制数据,会大幅增加破解的成本,会安全的多。
4)反向控制钩子:
这个...由于是双工长连接,服务端完全可以推送一些钩子命令,甚至直接是代码,在客户端进行执行。比如截个屏,录个音,种个小马。用户只要通过了授权申请,剩下的就随你发挥了。
所以就一个梗:支付宝偷偷调用你的相机给你拍照
下面我们就来了解websocket协议:
HTTP是单工的还是双工的还是半双工的
先来区分三者的含义
- 单工:数据传输只允许在一个方向上的传输,只能一方来发送数据,另一方来接收数据并发送。例如:对讲机
- 半双工:数据传输允许两个方向上的传输,但是同一时间内,只可以有一方发送或接受消息。例如:打电话
- 全双工:同时可进行双向传输。例如:
websocket
http协议是什么工作模式呢
分版本,版本不同,工作模式不同
http1.0:单工。因为是短连接,客户端发起请求之后,服务端处理完请求并收到客户端的响应后即断开连接。http1.1:半双工。默认开启长连接keep-alive,开启一个连接可发送多个请求。http2.0:全双工,允许服务端主动向客户端发送数据。
TCP三次握手四次挥手
TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手而进行的。
- 一开始,客户端和服务端都处于
CLOSED状态。先是服务端主动监听某个端口,处于LISTEN状态
第一个报文—— SYN 报文
- 客户端会随机初始化序号(
client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把SYN标志位置为1,表示SYN报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN-SENT状态。
第二个报文 —— SYN + ACK 报文
- 服务端收到客户端的
SYN报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入client_isn + 1, 接着把SYN和ACK标志位置为1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD状态。
第三个报文 —— ACK 报文
- 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部
ACK标志位置为1,其次「确认应答号」字段填入server_isn + 1,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于ESTABLISHED状态。 - 服务器收到客户端的应答报文后,也进入
ESTABLISHED状态。
从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题。
一旦完成三次握手,双方都处于 ESTABLISHED 状态,此致连接就已建立完成,客户端和服务端就可以相互发送数据了。
为什么是三次握手?不是两次、四次?
可以从以下的三个方面分析为什么是三次握手,不是两次、四次的原因:
- 三次握手才可以阻止历史重复连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
原因一:避免历史连接
简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。
网络环境是错综复杂的,往往并不是如我们期望的一样,先发送的数据包,就先到达目标主机,反而它很骚,可能会由于网络拥堵等乱七八糟的原因,会使得旧的数据包,先到达目标主机,那么这种情况下 TCP 三次握手是如何避免的呢?
三次握手避免历史连接
客户端连续发送多次 SYN 建立连接的报文,在网络拥堵等情况下:
- 一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端;
- 那么此时服务端就会回一个
SYN + ACK报文给客户端; - 客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送
RST报文给服务端,表示中止这一次连接。
如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端(发送方)准备发送第三次报文时,客户端因有足够的上下文来判断当前连接是否是历史连接:
- 如果是历史连接(序列号过期或超时),则第三次握手发送的报文是
RST报文,以此中止历史连接; - 如果不是历史连接,则第三次发送的报文是
ACK报文,通信双方就会成功建立连接;
所以, TCP 使用三次握手建立连接的最主要原因是防止历史连接初始化了连接。
原因二:同步双方初始序列号
TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:
- 接收方可以去除重复的数据;
- 接收方可以根据数据包的序列号按序接收;
- 可以标识发送出去的数据包中, 哪些是已经被对方收到的;
可见,序列号在 TCP 连接中占据着非常重要的作用,所以当客户端发送携带「初始序列号」的 SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,那当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。
四次握手与三次握手
四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了「三次握手」。
而两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。
原因三:避免资源浪费
如果只有「两次握手」,当客户端的 SYN 请求连接在网络中阻塞,客户端没有接收到ACK 报文,就会重新发送 SYN ,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的 ACK 确认信号,所以每收到一个 SYN 就只能先主动建立一个连接,这会造成什么情况呢?
如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。
两次握手会造成资源浪费
即两次握手会造成消息滞留情况下,服务器重复接受无用的连接请求 SYN 报文,而造成重复分配资源。
边栏推荐
- 【TcaplusDB知识库】Tmonitor后台一键安装介绍(一)
- R语言使用colorblinr包模拟色盲视觉、将已有的ggplot2可视化结果图像使用edit_colors函数编辑转化为色盲视觉友好的可视化结果、并自定设置色盲形式、色盲严重级别
- 亚朵更新招股书:继续推进纳斯达克上市,已提前“套现”2060万元
- Uniapp sends picture messages to Tencent instant messaging Tim
- Apache基金会正式宣布Apache InLong成为顶级项目
- OutputDebugString使用说明以及异常处理
- Image reading: image open(ImgPath)
- 元宇宙带来的社会结构和资本制度演变
- Log4j log integration and configuration details
- TensorRT Paser加载onnx 推理使用
猜你喜欢

数学分析_证明_第1章:可数个可数集之并为可数集

How to configure PostgreSQL data source on SSRs page
![[today in history] June 23: Turing's birthday; The birth of the founder of the Internet; Reddit goes online](/img/d5/4b3e622ab77bc546ca5d285ef67d8a.jpg)
[today in history] June 23: Turing's birthday; The birth of the founder of the Internet; Reddit goes online

CoAtNet: Marrying Convolution and Attention for All Data Sizes翻译
![[tcapulusdb knowledge base] Introduction to tmonitor system upgrade](/img/7b/8c4f1549054ee8c0184495d9e8e378.png)
[tcapulusdb knowledge base] Introduction to tmonitor system upgrade

Golang data type diagram

安全舒适,全新一代奇骏用心诠释老父亲的爱

Apache基金会正式宣布Apache InLong成为顶级项目

Opengauss database source code analysis series articles -- detailed explanation of dense equivalent query technology (Part 2)

阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一文搞定
随机推荐
【解决】npm WARN config global `--global`, `--local` are deprecated. Use `--location=global`
R language uses the image of magick package_ The scale function resizes the image. You can customize the scaling from the angle of width or height
短视频平台开发,点击输入框时自动弹出软键盘
Stick to five things to get you out of your confusion
Code implementation of golang binary search method
IFLYTEK neuroimaging disease prediction program!
Spin lock using CAS
golang写文件代码示例
《ThreadLocal》
Array's own method
如何选择券商?手机开户安全么?
Object
Apache commons tool class
Medical image segmentation website
机器人方向与高考选专业的一些误区
[tcapulusdb knowledge base] Introduction to tmonitor system upgrade
Summarize the experience of purchasing Alibaba cloud servers
stylegan3:alias-free generative adversarial networks
Focus: zk-snark Technology
腾讯的技术牛人们,是如何完成全面上云这件事儿的?