您现在的位置是:首页 > 正文

【学习笔记】初识websocket及其握手过程

2024-02-01 02:20:44阅读 4

http请求方式

在web引用中,http通信主要是通过请求-应答的方式,即客户端发出请求,浏览器做出应答。

比如说我们浏览百度,当我们输入网址并回车,客户端就向服务器发起请求。我们看到的内容就是服务器做出的相应应答。

png

问题背景

在进行扫码登录时,如何判断用户扫码并登录了?

方法1:轮询

只要客户端定期请求服务器,拉取扫码登录结果即可。

那么问题来了,到底轮询的频率是多少呢?轮询频率过高会给服务器造成压力,轮询频率过低会让用户感觉扫码登录响应过慢。

方法2:长轮询

在轮询的基础上,服务器收到请求消息后,保持连接直到返回扫码登录成功的结果。

使用长轮询,返回消息时序性无法保证;同时,不管是轮询还是长轮询,都逃不开请求-响应的模式。

比如说,扫码登录会返回两个结果:扫码成功通知和确认登录通知。

但是由于长轮询不保证时序性,客户端先收到确认登录通知,后收到扫码成功通知。

所以,对时序性有要求的web服务,如果不能保证时序性,最好不要使用轮询方法。

方法3:websocket

如何让服务器主动推送消息呢?如何保证接受消息的时序性呢?可以使用websocket实现。

websocket

websocket是基于tcp的一种全双工应用层通信协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,WebSocketAPI被W3C定为标准。

因为是基于tcp的通信协议,故只需一次请求响应操作即可建立连接。

websocket握手过程

通常是在http通信中请求转换到websocket协议。这里以聊天室为例,讲http创建过程。

如果没有了解http,建议先了解http再看本文后面的内容,传送门:小林coding-HTTP基本概念

客户端请求

客户端首先发起一次http请求,格式如下:

png

必要字段解析:

字段 解释
请求方法和HTTP版本 请求方法必须为GET,http版本必须为HTTP1.1及以上
Status Code:101 状态码101 表示协议转换,这里指将协议转换到websocket
Upgrade: websocket 必要字段,表示通信协议更新到websocket
Sec-WebSocket-Key 为一串16字节随机字符串base64加密后的值
Sec-WebSocket-Version: 13 必须为13
服务端响应

png

必要字段解析:

字段 解释
Connection: Upgrade 必须为Upgrade
Sec-WebSocket-Accept 根据客户端传入的Sec-WebSocket-Key的值,计算获得结果
Sec-WebSocket-Version: 13 必须为13
Upgrade: websocket 必要字段,表示通信协议更新到websocket
Sec-WebSocket-Accept计算过程

拿到Sec-WebSocket-Key的值后,在后面加入字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11得到新的字符串,再将该字符串进行sha-1编码,最后进行base64编码,即Sec-WebSocket-Accept的值。

计算过程php代码实例
<?php
$input = readline(input:);
echo base64_encode(sha1($input . 258EAFA5-E914-47DA-95CA-C5AB0DC85B11, true));

验证结果:

png

计算结果和Sec-WebSocket-Accept的值一致。

客户端最后操作

客户端收到应答后,要校验Sec-WebSocket-Key的值,如果该值和计算结果不符,或者不符合上面过程任一要求,则拒绝创建websocket连接。

如果客户端校验无误,websocket就握手完成了。

既然有TCP了,为什么还要用websocket呢?

背过八股文学过计网的同学都知道,tcp是面向连接的、可靠的、基于字节流的传输层协议,同时tcp也是一个全双工通信协议。那么有了tcp,为什么还要用websocket呢?

个人理解是:tcp是传输层协议,而websocket是应用层协议。tcp只保证报文传输的可靠性、全双工等特性,但tcp是基于字节流形式,如何解决沾包问题交给了应用层,其次,业务相关的其他需求也应该由应用层解决。

参考资料

WebSocket协议(一)- 简介以及连接建立过程

小林coding:图解网络

网站文章

  • 栈和队列的区别

    栈和队列的区别 1.规则不同 队列:先进先出 栈:先进后出 2.对插入和删除的限定不同 队列:只能在表的一段进行插入,并在另一端进行删除 栈:只能在表的一端插入和删除 3.遍历数据速度不同 队列:基于...

    2024-02-01 02:20:35
  • java lesson13Homework

    /** * 1. 字符串解析,现有字符串,“卡巴斯基#杀毒软件#免费版#俄罗斯#”,解析出每个元素。 */ package String13Practice; public class String01 { public static void main(String[] args){ String str=&quot;卡巴斯基#杀毒软件#免费版#俄罗斯#&quot;...

    2024-02-01 02:20:28
  • IIS文件上传时间、大小限制,默认4M

    IIS文件上传时间、大小限制,默认4M

    打开IIS,点击网站并定位至所部署的网站,在右边找到《管理——配置编译器》,双击打开修改一下两处第一处第二处转载于:https://www.cnblogs.com/mnxxz/p/11601644.html...

    2024-02-01 02:20:02
  • 杰理之频偏自动校正【篇】

    使能该功能,频偏测试过程中会进行自动校正(需同时开启频偏测试使能)

    2024-02-01 02:19:54
  • java读取apk、ipa包名、版本名、版本号等信息

    下载相关jar 首先我们需要下载两个jar,分别为:AXmlResourceParser.jar、dd-plist-1.0.jar 下载地址:https://download.csdn.net/dow...

    2024-02-01 02:19:48
  • Nginx Rewrite规则

    #Nginx Rewrite规则#1.URL访问跳转,支持开发设计(页面跳转,兼容性开发,展示效果)#2.SEO优化#3.维护(后台维护,流量转发等)#4.安全#配置Syntax: rewrite regex replacement [flag];Default : ——Context:server,location,if#例:rewrite ^(.*)$/pages/mai...

    2024-02-01 02:19:20
  • 今天面了个腾讯拿98K出来的大佬,让我见识到什么是基础的天花板

    今天面了个腾讯拿98K出来的大佬,让我见识到什么是基础的天花板

    今天面了个腾讯拿98K出来的大佬,让我见识到什么是基础的天花板

    2024-02-01 02:19:12
  • linux中查看文件大小,以G为单位

    linux中查看文件大小,以G为单位

    linux中查看文件大小,以G为单位 ls -lh 查看某个单独文件的大小:du -sh hteafile.tar

    2024-02-01 02:19:05
  • module ‘cv2.cv2‘ has no attribute ‘xfeatures2d‘ 错误

    报错原因:该算法已经申请专利,开源OpenCV没有版权,新的OpenCV去掉了这个算法。解决方法:卸掉目前的包,安装3.4.2.16版本pip uninstall opencv-pythonpip i...

    2024-02-01 02:18:59
  • python多线程—终止子线程

    python多线程—终止子线程

    python如何终止子进程

    2024-02-01 02:18:30