【计算机网络 - 基础问题】每日 3 题(四十七)

✍个人博客:https://blog.csdn.net/Newin2020?type=blog
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
📝推荐参考地址:https://www.xiaolincoding.com/(这个大佬的专栏非常有用!)

139. 怎么建立 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 的响应如下:

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 码转成另一段字符串,如果这段字符串跟服务器传回来的字符串一致,那验证通过。

在这里插入图片描述

就这样经历了一来一回两次 HTTP 握手,WebSocket 就建立完成了,后续双方就可以使用 Webscoket 的数据格式进行通信了。

在这里插入图片描述

140. WebSocket 的使用场景

WebSocket 完美继承了 TCP 协议的全双工能力,并且还贴心的提供了解决粘包的方案。

它适用于需要服务器和客户端(浏览器)频繁交互的大部分场景,比如网页/小程序游戏,网页聊天室,以及一些类似飞书这样的网页协同办公软件。

回到文章开头的问题,在使用 WebSocket 协议的网页游戏里,怪物移动以及攻击玩家的行为是服务器逻辑产生的,对玩家产生的伤害等数据,都需要由服务器主动发送给客户端,客户端获得数据后展示对应的效果。

141. Websocket 如何进行限流?

1、连接限制:通过限制连接数来控制服务器资源的使用情况。可以设置一个最大连接数,当连接数超过这个限制时,新的连接请求就会被拒绝。这种方法通常需要使用一些负载均衡器来实现。

2、速率限制:通过限制每个客户端的请求速率来控制服务器的负载。可以设置一个固定的速率,每个客户端只能在一定时间内发送一定数量的请求。这种方法通常需要使用一些中间件来实现,例如 Redis 等。

3、消息大小限制:通过限制每个消息的大小来控制服务器的负载。可以设置一个最大的消息大小,当消息大小超过这个限制时,消息就会被拒绝。这种方法通常需要在 WebSocket 协议的底层实现中进行处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

极速体验:实用的前端性能优化技巧

本文将深入探讨一系列实用的前端性能优化方案,从基础知识到高级技巧,我们将揭示如何让你的网站在瞬息万变的互联网中脱颖而出,无论你是经验丰富的开发者还是刚入行的新手,这篇文章都将为你提供宝贵的见解和实践建议。 目录 &…

python解决解析汉诺塔问题

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

如何选择适合自己的IP地址切换器

在互联网活动中,IP地址切换器成为越来越多用户的必备工具。本文旨在帮助用户了解如何选择适合自己的IP地址切换器,以确保网络活动的顺利进行。 ​一、IP地址切换器的基本功能与优势 IP地址切换器,又称IP代理软件或IP更换器,是一种…

计算机通信与网络实验笔记

1.LINUX通过版本号判断是否为稳定版本 2.计网基础 (CD),默认二层以太网交换机。 (10)物理层是均分(除以),数据链路层及以上是不除的。 3.传输介质: (1&…

IDEA 中的代码调试指南

目录 前言1. 为什么进行代码调试1.1 找出错误1.2 优化代码1.3 提高对代码的理解 2. 如何在 IDEA 中进行代码调试2.1 设置断点2.1.1 普通断点2.1.2 条件断点 2.2 开始调试2.3 调试控制2.3.1 单步调试(Step Over)2.3.2 进入方法(Step Into&…

打印自然常数E

自然常数E 自然常数,符号e,为数学中一个常数,是一个无限不循环小数,且为超越数,其值约为2.718281828459045。它是自然对数函数的底数。 我们打印表达式(11/x)的x次方的值以及获取第一次大于2.718的正整数 新建C#控制…

今日指数项目集成SpringSecurity

项目集成SpringSecurity ​ 在第一章我们是基于SpringSecurity、JWT技术实现前后端无状态化认证授权,而我们当前的项目是前后端分离的架构,同样也可借助Security框架和Jwt实现前后端的无状态认证授权操作; 1、项目自定义认证过滤器 1.1 依…

DFF对比

第一种 单元1:电平触发触发器: 在CLK高电平时,输入D的变化才可以传递到输出Q;在CLK点评时,输出Q不变。 第一种的整体 将两个电平触发组合,得到单边沿触发 输出Q仅在CLK上升沿处发生变化。边沿触发 第二…

MySQL-27.多表查询-案例

一.数据准备 -- 分类表 create table category (id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 分类名称,type tinyint unsigned not null comment 类型 1 菜品分类 2 套餐分类,sort …

Quartus Ⅱ仿真 1.半加器

真服了,csdn上一搜全是收费,服啦服啦,我就自己来写一个吧 仿真波形: 输出结果: 介绍: 半加器(Half Adder)是数字电路中的一种基本组件,用于实现两个一位二进制数的加…

AI 代写是变现最快的副业项目,没有之一

AI 时代可以做的副业项目很多,但是实事求是的讲,大部分副业变现周期都有点长,短则几个月,长则半年到一年。所以很多副业社群都强调要坚持,当一项副业你能坚持一个月,基本就熬走了 90% 的人。但是坚持这件事…

ubuntu 安装haproxy

####安装##### sudo apt update sudo apt install haproxy sudo haproxy -v sudo systemctl status haproxy sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org####配置站点##### nano /etc/haproxy/haproxy.cfgfrontend www-httpbind *:5001mode httpdefault_ba…

复旦大学全球供应链研究中心揭牌,合合信息共话大数据赋能

10月13日,复旦大学全球供应链研究中心(以下简称“中心”)揭牌仪式在复旦大学管理学院政立院区隆重举行。我国的供应链体系庞大复杂,在百年未有之大变局下,保障产业链供应链安全已成为我国的重要战略目标。中心的设立旨…

Netty无锁化设计之对象池实现

池化技术是比较常见的一种技术,在平时我们已经就接触很多了,比如线程池,数据库连接池等等。当我们要使用一个资源的时候从池中去获取,用完就放回池中以便其他线程可以使用,这样的目的就是为了减少资源开销,…

Python | Leetcode Python题解之第485题最大连续1的个数

题目: 题解: class Solution:def findMaxConsecutiveOnes(self, nums: List[int]) -> int:maxCount count 0for i, num in enumerate(nums):if num 1:count 1else:maxCount max(maxCount, count)count 0maxCount max(maxCount, count)return …

100 种下划线 / 覆盖层动画 | 终极 CSS(层叠样式表)集合

还在为你的菜单项和链接寻找动画效果而感到疲惫吗? 不用再找了!这里列出了 100 多种不同的动画。从简单的到更复杂的,你肯定能找到自己想要的。 无需 SVG(可缩放矢量图形),无需 JavaScript(脚…

八股面试2(自用)

mysql存储引擎 存储引擎:定义数据的存储方式,以及数据读取的实现逻辑 在以前数据库5.5默认MyISAM引擎,之后默认InnoDB引擎 MyISAM引擎的数据和索引是分开存储的,InnoDb将索引和文件存储在同一个文件。 MyISAM不支持事务&#…

程序员的选择难题:Java和C++的核心差异解析

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是小米,一个喜欢分享技术干货的程序猿。今天我们来聊一聊Java和C++的区别。作为两种非常流行的编程语言,Java和C++在各自的领域中都有…

成本决定未来——AIGC 下半场,高成本阻碍发展,我们该怎么办?

你好,我是三桥君 你最近有没有觉得工作中用到的那些 AI 工具好像越来越便宜了呢?这可不是偶然哦。 今天,三桥君就来聊聊为啥 AIGC 的下半场成本这么重要? 你想想看,咱平时工作已经够累了,要是再加上用那些贵…

vue3项目在vue平台下添加nvue文件会报[plugin:vite:nvue-css]

项目运行是会报大量的[plugin:vite:nvue-css]作警告 解决办法:在app.vue引入公共css文件外添加#ifndef APP-PLUS-NVUE条件 // #ifndef APP-PLUS-NVUE import "uview-plus/index.scss"; /*每个页面公共css */ import "colorui/main.css"; //#en…