websocket(一)基础铺垫

一    websocket基础

说明: 这些'基础知识'是为接下来'websocket编程'打好基础的

①  拆解理解

1) 从字面理解: "Web"指的是 HTTP,"Socket"是套接字调用,那么这两个'连起来'又是什么意思呢?

2) 所谓'望文生义': "webSocket"就是运行在'Web',也就是 'HTTP 上'的 Socket 通信规范

3) 提供与"TCP Socket"类似功能,使用它就像'TCP Socket'一样调用下层协议栈,任意地'收发'数据

②  为什么要有websocket

通俗: websocket'解决'什么问题?

思考: 已经有了'被广泛应用'的 HTTP 协议,为什么要'再出'一个 websocket 呢?它有哪些好处呢?

小结:其实 WebSocket 与 HTTP/2 一样,都是为了解决 "HTTP 某方面的缺陷"而诞生的

  [1]、HTTP/2 针对的是"队头阻塞"

  [2]、WebSocket 针对的是"请求 - 应答"通信模式

(1)半双工请求-应答模式特性

早期: HTTP1.1 通过客户端通过'定时'反复轮询做'数据更新'

现在: websocket方式:向服务器'订阅'一类消息,服务器发现有更新,'主动通知'客户端

websocket(一)基础铺垫_第1张图片

下民'图示'说明: 从'轮续'到'通知'

websocket(一)基础铺垫_第2张图片

websocket(一)基础铺垫_第3张图片

③  chrome面板分析websocket协议

目的: 从'协议'层面看websocket'做'了什么

通过下面'两种'方式: WS'或者'过滤器搜索'(is:running)'查看已经'建立好'的websocket连接

websocket(一)基础铺垫_第4张图片

postman做websocket测试

websocket(一)基础铺垫_第5张图片

websocket(一)基础铺垫_第6张图片

 chrome快捷键

++++++++++ "打开chrome控制面板" ++++++++++

1)'F12'快捷键打开

2)组合快捷键'Ctrl+Shift+I'

+++++++++++++"chrome控制台快捷键"+++++++++++++++

1) 开发者工具:option+command+i

2) javascript控制台:option+command+j

④  websocket的约束

(1)websocket的成本

websocket(一)基础铺垫_第7张图片

websocket(一)基础铺垫_第8张图片

+++++++++++ "疑惑解答" +++++++++++

websocket(一)基础铺垫_第9张图片

+++++++++++ "思考遗留" +++++++++++

websocket(一)基础铺垫_第10张图片

(2)长连接的心跳保持

websocket(一)基础铺垫_第11张图片

(3)兼容HTTP协议

websocket(一)基础铺垫_第12张图片

(4)设计哲学

websocket(一)基础铺垫_第13张图片

简单理解: 什么是'子协议'? --> 后续'深入'学习

Sec-Websocket-Protocol

websocket(一)基础铺垫_第14张图片

websocket(一)基础铺垫_第15张图片

⑤  websocket的协议格式

说明: chrome的network是'看不到'帧头部信息,使用'tcpdump|wireshark'分析

websocket(一)基础铺垫_第16张图片

(1)RSV保留值 

websocket(一)基础铺垫_第17张图片

websocket(一)基础铺垫_第18张图片  

(2)帧类型

帧的类型: '三种'类型

细节: 持续帧的类型是取决于'前一个帧'的类型

websocket(一)基础铺垫_第19张图片

++++++++++++++  "案例解读 Text和Binary"  ++++++++++++++ 

websocket(一)基础铺垫_第20张图片

websocket(一)基础铺垫_第21张图片

(3)ABNF的描述定义

说明: 后续'了解可选'字节的场景

websocket'帧'的'每一个'字节'每一位'代表 --> 'wireshark'分析

websocket(一)基础铺垫_第22张图片

混淆: 'packet'和'frame'

websocket(一)基础铺垫_第23张图片

⑥  如何从HTTP升级WebSocket

(1)URI格式

细节: websocket协议实际是由'http1.1'升级而来的

websocket(一)基础铺垫_第24张图片

(2)建立websocket一次握手过程

思考: 握手要传递'什么消息'? 哪些是'必须的'

1) 红色是'必选'的消息,这里以'HTTP1.1'为例

2) 红色、绿色、蓝色、黑体'区别'

3) 注意观察'request|response'头

4) 建立好'ws'连接就开始'传递'消息

websocket(一)基础铺垫_第25张图片

websocket on http2 

+++++++++++  "curl模拟测试websocket连通性"  +++++++++++ 

curl --no-buffer -H 'Connection: keep-alive,Upgrade' -H 'Upgrade: websocket' \
-v -H 'Sec-WebSocket-Version: 13' -H 'Sec-WebSocket-Key: 自定义' \
http[s]://ip:port/url ws | od -t c

 (3)Sec-Websocket-Key和Sec-Websocket-Accept的关系

细节点: 'sha1编码' --> '16进制' --> '进行base64编码'

sha1sum  --> 生成'sha1'值

响应头中'Sec-WebSocket-Accept'根据客户端请求首部的'Sec-WebSocket-Key'计算出来。

'固定': 258EAFA5-E914-47DA-95CA-C5AB0DC85B11

Sec-WebSocket-Key 中的 Sec 是'Secure'

websocket(一)基础铺垫_第26张图片

GUID官方说明  sha1转换 

对'字符串'进行sha1摘要计算:

  1) echo -n '字符串' | openssl sha1 

  2) echo -n '字符串' | sha1sum

(4) 部分答疑解惑

websocket(一)基础铺垫_第27张图片

 websocket(一)基础铺垫_第28张图片

 ⑦  传递消息时的编码格式

核心: 传递消息的一些'细节'

(1)消息数据帧

websocket(一)基础铺垫_第29张图片

(2)非控制帧的消息分片 有序

 FIN:占'1'个bit

  1) 0:表示'不是'消息的最后一个分片
   
  2) 1:表示是消息的'最后'的一个分片,表示'消息结束'了

+++++++++++  "分割线"

  1) 蓝色分成了'三片(数据帧)','深绿'的插入一个'控制'帧,把'三个帧'有序拼接成一个消息

  2)  Opcode:4个bit --> op=0表示是'持续帧',则参考前一个帧的类型

  备注: 当Opcode 为0时,表示本次数据传输采用了数据分片,当前收到的数据帧为其中一个'数据分片'

websocket(一)基础铺垫_第30张图片

 (3)数据帧的长度

websocket(一)基础铺垫_第31张图片

++++++++++++ 传递的消息长度'125和126'字节报文形态 ++++++++++++

websocket(一)基础铺垫_第32张图片

websocket(一)基础铺垫_第33张图片

(4)发送消息 状态说明

websocket(一)基础铺垫_第34张图片

(5)相关解惑

websocket(一)基础铺垫_第35张图片

websocket(一)基础铺垫_第36张图片

websocket(一)基础铺垫_第37张图片

⑧  掩码及其所针对的代理污染攻击

思考: '为什么'要做掩码处理?'如何做'掩码处理

目的: 为了减少'针对代理服务器的缓存污染攻击'风险

问题'背景':

 1)  实现不当'代理服务器': 配置不当,不认识'websocket'协议,只能透传'http'协议

 2)  有'恶意攻击'的黑客搭建了一个恶意服务器,提供了一个'恶意页面',试图用'js'建立一个ws连接

 3)  是"针对浏览器"

websocket(一)基础铺垫_第38张图片

websocket(一)基础铺垫_第39张图片

+++++++++++ "MASK掩码" +++++++++++

websocket(一)基础铺垫_第40张图片

++++++++++++ "掩码如何防止缓存污染攻击" ++++++++++++

websocket(一)基础铺垫_第41张图片

++++++++++++ "消息编码算法模拟" ++++++++++++

websocket(一)基础铺垫_第42张图片

websocket(一)基础铺垫_第43张图片

++++++++++++ "一些答疑解惑" ++++++++++++

websocket(一)基础铺垫_第44张图片

websocket(一)基础铺垫_第45张图片

⑨  如何保持会话心跳

++++++++ 回顾'HTTP1.1长连接'的机制 ++++++++

就是一个'定时器',如果'定时器设置的时间'达到以后,还'没有请求'过来就把连接关闭

websocket(一)基础铺垫_第46张图片

+++++++++++++ "wireshark抓包" +++++++++++++

1) chrome控制面板'看不到心跳'信息,只能'在wireshark'中看

2) 没有实际数据,但是还是'必须有一个'masking-key

websocket(一)基础铺垫_第47张图片

websocket(一)基础铺垫_第48张图片

++++++++++++ "一些答疑解惑" ++++++++++++

1) 心跳'维护','谁'发送心跳,心跳的'频率'

websocket(一)基础铺垫_第49张图片

websocket(一)基础铺垫_第50张图片

websocket(一)基础铺垫_第51张图片

websocket(一)基础铺垫_第52张图片

⑩  如何关闭会话

关闭'会话':'正'常和'异'常

websocket(一)基础铺垫_第53张图片

+++++++++++ "关闭帧的格式" +++++++++++

websocket(一)基础铺垫_第54张图片

++++++++++++ "wiresahrk抓包查看" ++++++++++++

websocket(一)基础铺垫_第55张图片

关闭帧中: '数据含义',了解'预定义'的错误码

websocket(一)基础铺垫_第56张图片

 参考连接  websocket扩展知识

你可能感兴趣的:(websocket,网络)