Web协议详解与抓包实战之WebSocket【二】
前言
《Web协议详解与抓包实战》课程学习,陶辉老师主讲
学习内容:
- HTTP–TLS/SSL–TCP/IP自上而下根据应用学习web协议WebSocket详细知识
- 结合抓包工具实践验证:chrome下的network面板、Tcpdump、Wireshark
Wireshark中的捕获过滤器:BPF过滤器
- expression表达式:有多个原语组成
- primitives 原语:有名称或数字,以及描述它的多个限定词组成
- qualifiers限定词
- Type:设置数字或者名称所指示类型,如 host www.baidu.com
- host post
- net 设置子网
- portrange 端口范围
- Dir:设置网络出入方向,如 dst port 80
- src、dst、src or dst
- 链路层限定词
- Proto:指定协议类型,例如 udp
- ip、ip6、udp、tcp等
- 其他
- gateway:指明网关IP地址
- broadcast:广播报文
- multicast:多播报文
- less,greater:小于或者大于
- Type:设置数字或者名称所指示类型,如 host www.baidu.com
- qualifiers限定词
- 原语运算符
- 与:&&或者 and
- 或:||或者 or
- 非:!或者 not
- 例如:src or dst portrange 6000-8000 && tcp or ipv6
- primitives 原语:有名称或数字,以及描述它的多个限定词组成
- 还可以基于协议域过滤,根据相关协议的具体报文格式进行条件限定
Wireshark中的显示过滤器
-
任何在报文细节面板中的解析出的字段名,都可以作为过滤属性
-
在视图-> 内部 -> 支持协议面板中,找到各字段名对应的属性名
-
-
过滤值比较符号
-
过滤值类型
-
多个表达式之间的组合
-
可视化操作界面,(显示过滤器的右边点击表达式即可打开)
WebSocket解决什么问题
背景:针对服务器的更新,客户端如何最快获取更新资源
在HTTP中,通常在客户端设置定时器轮询服务器是否更新,对网络带宽及服务器性能影响比较大,而WebSocket协议中服务器发生资源更新会立刻进行反向通知
chrome network面板中分析WebSocket
websocket测试工具:
WebSocket约束
- WebSocket的成本
- 长连接的心跳保持
- HTTP长连接只能基于简单的超时
- WebSocket连接基于ping/pong心跳机制维持
- 兼容HTTP协议
- 默认使用80/443端口
- 协议升级
- 代理服务器可以简单支持
设计哲学:在Web约束下暴露TCP给上层
WebSocket协议格式
-
WebSocket帧格式示意图
-
数据帧格式
-
RSV保留值
-
帧类型
-
-
ABNF描述的帧格式
如何从HTTP升级到WebSocket
-
URI格式
建立握手
wireshark抓到的握手包
GET /?encoding=text HTTP/1.1
Host: echo.websocket.org
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
Upgrade: websocket
Origin: http://www.websocket.org
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: _ga=GA1.2.693702036.1606204934; _gid=GA1.2.1767752127.1606204934; _gat=1
Sec-WebSocket-Key: 3LL/srKFKhCwEf6CWCsZtw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
HTTP/1.1 101 Web Socket Protocol Handshake
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://www.websocket.org
Connection: Upgrade
Date: Tue, 24 Nov 2020 07:42:16 GMT
Sec-WebSocket-Accept: 12qI6yp0o4W1p8gnaMpdQJ6+qwo=
Server: Kaazing Gateway
Upgrade: websocket
- 红色字体表示基础必选字段
- 请求头字段Connection和Upgrade,相当于告诉服务端要申请切换到WebSocket协议
- Connection头字段指定Upgrade、申请切换协议
- Upgrade头字段指定为websocket、具体告诉服务端想切换的协议为WebSocket
- 请求头字段Connection和Upgrade,相当于告诉服务端要申请切换到WebSocket协议
- 蓝色表示跨域资源消息
- 涉及的头字段解释:
HTTP头 | 是否必须 | 解释 |
---|---|---|
Host | 是 | 服务端主机名 |
Upgrade | 是 | 固定值,”websocket” |
Connection | 是 | 固定值,”Upgrade” |
Sec-WebSocket-Key | 是 | 客户端临时生成的16字节随机值, base64编码 |
Sec-WebSocket-Version | 是 | WebSocket协议版本 |
Origin | 否 | 可选, 发起连接请求的源 |
Sec-WebSocket-Accept | 是(服务端) | 服务端识别连接生成的随机值 |
Sec-WebSocket-Protocol | 否 | 可选,客户端支持的协议 |
Sec-WebSocket-Extensions | 否 | 可选, 扩展字段 |
传递消息时的编码格式
消息与数据帧
非控制帧的消息分片:有序
使用wireshark抓包查看
数据帧格式:消息内容的长度
消息内容不同的长度对应图中帧中不同的颜色区域
发送消息
掩码及其所针对的代理污染攻击
为什么进行掩码处理:减少缓存污染攻击
frame-masking-key掩码
掩码的目的:防止恶意页面上的代码,可以经由浏览器构造出合法的GET请求,使得代理服务器可以识别出请求并缓存响应
wireshark抓包验证:
如何保持会话心跳
心跳帧
wireshark心跳包查看
ping
pong
如何关闭会话
-
控制帧中的关闭帧:在TCP连接之上的双向关闭
- 发送关闭帧后,不在发送任何数据
- 接收到关闭帧后,不在接收任何到达的数据
-
关闭帧的格式
-
关闭帧的错误码