【计算机网络 - 基础问题】每日 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 头,如下:
http 复制代码
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 复制代码
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 协议的底层实现中进行处理。

相关推荐
菜鸟学Python5 分钟前
Python 数据分析核心库大全!
开发语言·python·数据挖掘·数据分析
C++忠实粉丝6 分钟前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
九州ip动态6 分钟前
做网络推广及游戏注册为什么要换IP
网络·tcp/ip·游戏
Estar.Lee11 分钟前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
蝶开三月12 分钟前
php:使用socket函数创建WebSocket服务
网络·websocket·网络协议·php·socket
喜欢猪猪12 分钟前
Django:从入门到精通
后端·python·django
一个小坑货12 分钟前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet2717 分钟前
【Rust练习】22.HashMap
开发语言·后端·rust
古月居GYH17 分钟前
在C++上实现反射用法
java·开发语言·c++
G丶AEOM26 分钟前
SSL/TLS,SSL,TLS分别是什么
网络·网络协议·网络安全