理解websocket连接的原理

news/2024/10/11 17:05:48/

背景

Websocket是一个持久化的协议,相对于HTTP这种非持久的无状态协议来说


一、问题

http long poll,或者ajax轮询都可以实现实时信息传递,为什么还需要websocket?

二、理解

ajax轮询:浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
long poll:客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
总结:

  1. 两者都是采用轮询的方式,而long poll是阻塞式的
    ajax轮询 需要服务器有很快的处理速度和资源。(速度)
    long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)
  2. 两者都体现了服务器的被动性

websocket的出现:

  1. 解决了服务器的被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端。
    理解:只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我每次跑来问你)
  2. 解决了上面同步有延迟,而且还非常消耗资源的情况
    理解:建立websocket连接后,可以直接跟接线员(Nginx服务器)建立持久连接,有信息的时候客服(Handler)想办法通知接线员,然后接线员在统一转交给客户(客户端)。
    而在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。
    Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。

总结

websocket连接,只需要一次HTTP握手,避免HTTP的无状态性,且服务器可以主动通知,不限次数,直到请求关闭。

拓展

TCP三次握手四次挥手

在这里插入图片描述
ACK —— 确认,使得确认号有效。
RST —— 重置连接(经常看到的reset by peer)就是此字段搞的鬼。
SYN —— 用于初如化一个连接的序列号。
FIN —— 该报文段的发送方已经结束向对方发送数据。
SYN和FIN段都是会利用重传进行可靠传输的。

理解:3次握手来建立一个连接,4次挥手来关闭一个连接
一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:启动、数据传输、退出(关闭)。

三次握手:
在这里插入图片描述

客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的。

第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。

第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。

经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。

三次握手的一个重要功能是客户端和服务端交换ISN(Initial Sequence Number), 以便让对方知道接下来接收数据的时候如何按序列号组装数据。

拓展
DoS攻击-syn flood:
恶意的向某个服务器端口发送大量的SYN包,则可以使服务器打开大量的半开连接,分配TCB(Transmission Control Block), 从而消耗大量的服务器资源,同时也使得正常的连接请求无法被相应。
防攻击方法:连接队列

四次挥手:
在这里插入图片描述

TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。
当有一方要关闭连接时,会发送指令告知对方,我要关闭连接了。这时对方会回一个ACK,此时一个方向的连接关闭。但是另一个方向仍然可以继续传输数据,等到发送完了所有的数据后,会发送一个FIN段来关闭此方向上的连接。接收方发送ACK确认关闭连接。注意,接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的,我只是一个“搬运工”,我无法了解“上层的意志”。


http://www.ppmy.cn/news/47646.html

相关文章

json for modern c++

目录 json for modern c概述编译问题问题描述问题解决 读取JSON文件demo json for modern c GitHub - nlohmann/json: JSON for Modern C 概述 json for modern c是一个德国大牛nlohmann写的,该版本的json有以下特点: 1.直观的语法。 2.整个代码由一个…

Spring项目创建与 Spring Bean 的存储与读取

目录 一、创建Spring项目 1.1 创建Maven项目 1.2 添加 Spring 框架依赖 1.3 添加启动类 二、Bean对象的创建与存储 2.1 创建Bean 2.2 将Bean注册到容器 2.3 获取并使用Bean对象 2.3.1 创建Spring上下文 2.3.2 从Spring容器中获取Bean对象​编辑 延申(多种…

政企数智办公巡展回顾 | 通信赋能传统行业数智化转型的应用实践

在宏观政策引导、技术革新与企业内部数字化改革需求的共同驱使下,数智办公已经成为各行各业转型升级的必由之路。关注【融云 RongCloud】,了解协同办公平台更多干货。 近期,“连接无界 智赋未来” 融云 2023 政企数智办公巡展在北京、杭州相…

X进制转十进制黄金万能算法

单纯、混合进制通吃,真正的黄金万能的进制转换方法。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… 地址:https:/…

Qt音视频开发27-ffmpeg视频旋转显示

一、前言 用手机或者平板拍摄的视频文件,很可能是旋转的,比如分辨率是1280x720,确是垂直的,相当于分辨率变成了720x1280,如果不做旋转处理的话,那脑袋必须歪着看才行,这样看起来太难受,所以一定要想办法解析到视频的旋转角度,然后根据这个角度重新绘制。在窗体那边也…

匿名管道与命名管道

匿名管道与命名管道 一,进程间通信什么是进程间通信进程间通信的目的管道的概念 二,匿名管道匿名管道的创建匿名管道使用匿名管道的特性以及四种场景匿名管道的原理通过匿名管道实现简易进程池。 三,命名管道命名管道的创建命名管道的使用命名…

应急响应 - Windows启动项分析,Windows计划任务分析,Windows服务分析

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Windows应急响应 一、启动项分析1、msconfig2、gpedit.msc3、注册表4、msinfo325、启动菜…

深入拆解 Java 虚拟机-打卡|01 | Java代码是怎么运行的?

文章目录 Java代码是怎么运行的?几个为什么为什么在虚拟机中运行?Java 虚拟机具体又是怎样运行 Java 代码的呢?Java虚拟机的运行效率怎么样? 总结 Java代码是怎么运行的? 来来来,运行个"Hello word !“告诉我是…