当前位置: 首页 > 原理解释

websocket服务端推送原理-服务端推送原理

真香,这波技术老手直接摸鱼了。 别整那些虚头巴脑的。咱们直接开干,把 WebSocket 推送到客户端这事儿掰开了揉碎了讲。 想象一下,你是那个负责在前端跑业务的。客户端是要客户,是那个一直等着消息的人。服务端要是想通知客户“来了”,你得往前面丢个包。
这就好比你在给别人倒水,你得先把手里的杯子(连接)递那会儿,然后手一勾,水(消息)就流进杯子了。 起初,服务端得有本事把客户端“请”进门。
这活儿不能懒,不能光靠客户端自己跳着来,服务端得主动出击。你要用 HTTP 协议建立握手,告诉客户端:“嘿,我是你的哥,我在线,快拉上把手。”这时候别急,握手刚形成,端口还没通,客户端那边是懵的。你得等客户端反应过来了,确认连接建立,这时候再发个具体的指令,告诉它:“别闲着,把这次推送的消息给我传那会儿。”这就叫 TCP 握手 + HTTP 请求的连环套。 那如何把消息递那会儿呢?这就到了 WebSocket 的核心——长连接。
一般/平平网页每次刷新页面都要重新握手,那效率低得能炒菜。WebSocket 不一样,它是一根永不过期的绳子。一旦握手成功,这根绳子就在服务端和客户端之间一直挂着,要不就两边都主动断开。 这时候就得讲究策略了。服务端发消息,客户端得反应快。三秒内没收到回执,服务端能优化一下,比如把消息的包结构简化点,要么用二进制格式传,比传 JSON 更快。
要是客户端反应慢,服务端能够主动发个心跳包,这不是为了保活,是为了让客户别瞬断。 举个例子。 假设服务端想发个“用户登录成功”的消息。
1.服务端生成一个二进制帧头。
2.把消息内容压缩小一点(比如从 500 字节压缩到 100 字节,避免网络噪音)。
3.把这个小帧发给客户端。
4.客户端收到,假装收到并回复个“收到”。
5.客户端把这条“收到”的回包也压缩成二进制帧头,发回服务端。
6.服务端收到客户端的回包,确认消息传那会儿了,保存这个回执。
7.服务端认定稳了,又生成一个“新消息”的帧头,发给客户端。 你看这里,循环往复。一旦消息传那会儿,后续的推送就全靠这根绳子自动滑行。 服务端如何知道该不该推?这得看客户端有没有“听话”的机制。客户端收到服务端的第一条推送,需求回复个 ACK 要么回个状态码告诉服务端:“好的,我看到了,持续推吧”。
要是没有这个机制,服务端就不知道这条消息是不是确实到了,好办重复推送要么漏推。 这就像你花钱买彩票,你买完之后,得告诉销售员:“要是没中,给我退钱。” 要是没有这个确认机制,销售员可能当作你中奖了,下次再给你中奖号码。 再举个例子。 假设你要推个“推送成功”的 ACK 消息。 服务端生成“ACK 请求”的帧头 + 100 字节内容。 发出去。
1.客户端收到后,回复一个"100 OK"的二进制帧头,内容能够是 "100" 要么 "ACK"。
2.服务端收到这个,心里咯噔一下:“哎哟,嘿,你终于收到了。”
3.服务端认定:“去吧,持续推新的。”
4.服务端又发个“新消息”的帧头。
5.客户端收到,发个"ACK"。
6.服务端收到,循环。 这就是标准流程,好办粗暴,效率高。 自然,现实世界不是如此完美的。 有时候网络会波动,手抖了。
这时候“握手 + 请求 + 回执”就有点费事了。
要是客户端没响应,服务端还能持续跑吗? 要是服务端停摆了,客户端肯定会超时断开。
这时候服务端就得赶紧自己找服务器,拉一个新连接,重复刚刚的流程,把客户端“请”回来。
这个新连接的状态和旧的一样,数据也是持续传下去的。 别当作这就能全搞定。 有些情况下,客户端发来的消息本身就挺乱。
比如客户端发送的 ACK 响应包本身就没有对的二进制头。
这时候服务端就不能傻乎乎地直接当成 ACK 包处理了,得先校验一下,确认格式对了,才能持续推。
这就像客户回个短信,你当作是“好的”,实际上客户发的是“嘤嘤嘤”,你得先问清楚再讲话。 还有,数据量的难题。 要是服务端要推送海量数据,比如几十万行的日志,要么几 G 的视频流。 这时候,二进制帧优势就体现出来了。你能够一次把 1000 条数据打包成一个大的帧发给客户端。客户端收到后,内存充足,再分块处理。 反之,要是每次都只发几条,网络传输开销大,好办超时。 故此,服务端得学会“分批”和“打包”。 另外,客户端之间的配合也挺关键。 要是客户端收到消息后,想转发给其他几个客户端如何办? 这就需求服务端配合了。服务端能够生成一个“转发指令”的帧头,把目标客户端的地址发那会儿。客户端收到后,再发给其他几个接收者。 这就构成了一个广播网络。 最终,别忘了那个“心跳”梗。 别看叫“心跳”,但实际起主要功能的是防止连接空闲时断线。 要是客户端挂了,服务端还没收到 ACK,客户端就断流了。 这时候服务端发个“心跳包”,不是为了确实让客户点头,而是告诉客户端:“别急,我在线,别断线,我等着呢。” 过了如此久,要是客户端没再回复,服务端就认定客户端再也回不来了,正式的断开连接。 这个机制,让服务端的资源管理变得从容。 总结一下,WebSocket 的核心就三点:
1.主动握手,别等别人找你。
2.长连接,一根绳子到底。
3.双向确认,别瞎推。 这就是一个老手的操作手册。希望这个解释能帮你把 WebSocket 的底层逻辑给“捋”通了。别纠结那些教科书上那些生硬的术语,那是写给机器人看的。咱们还是得站在应用层,看看数据是如何流动的。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站