Redis 协议为例谈简单的协议分析
2016-03-22 15:44
603 查看
怎样去研究一个协议的过程,协议的格式,好处,怎么样模拟发包等,下面是一个简单的过程记录。
研究的步骤:
协议相关的资料,RFC,官方文档等。弄清楚协议工作在4层还是7层,是二进制还是文本协议等
抓包,通过分析数据包来真实的看到通信过程,另外一个就是自己实现时候方面调试
看客户端或者服务端的源码,了解实现细节(如果你需要拆轮子和造轮子)
总结下它的优缺点等
1 协议信息
尽量找到原始的资料和精辟的分析Redis Protocol specification
Request/Response protocols and RTT
A Beginner’s Guide to the Redis Protocol
特点小结
Redis 客户端和服务端交互的协议叫做 RESP(REdis Serialization Protocol),Redis集群中节点交互用的不是这协议
RESP是二进制安全的, 支持多种数据格式
RESP工作在TCP层,基于文本的协议,服务端默认端口是6379
基本是基于请求-响应的模式, piplining和sub/pub两个除外
二进制安全是什么?
协议描述
RESP协议中,数据类型依赖于第一个字节Simple String 第一个字节是
"+"
Error 第一个字节是
"-"
Integers 第一个字节是
":"
Bulk String 第一个字节是
"$"
Arrays 第一个字节是
"*"
不同数据块之间使用
\r\n(CRLF) 来分割
Simple String
简单字符串类型: 编码格式如下,一个 “+” 号,后面跟着字符串(但是不包含\n或者
\r), 结尾是
\r\n。
主要用来传输,比较短的非二进制安全字符串, 例如传递 “OK”。
+OK\r\n
下面的就不介绍了,详细的内容全在 http://redis.io/topics/protocol 文章中,请认真的阅读一遍,其他不管怎么分析最终还是会回到这个协议的文档中来对照。
2 抓包
下面就用 WireShark 来抓几个Redis 客户端服务端通信的包。例如执行如下命令
127.0.0.1:6379> set name lzz OK
一共是4个包,一个是客户端发送指令,一个是服务端返回指令,另外2个是ACK, 主要看客户端发送指令(编号为1的数据包)和服务端返回的指令(编号为4的数据包),见下图。
![](http://ww3.sinaimg.cn/mw690/a1f45431jw1f25n5kj52pj21ap07ttap.jpg)
编号1的数据包
发送给服务的set命令
![](http://ww1.sinaimg.cn/large/a1f45431gw1f25nbvcnhgj20vi0e3wie.jpg)
通过截图可以清晰的看到,TCP包里的data内容,
0d0a对应的ASCII字符就是
\r\n, 这样很容易的把客户端的内容还原
*3\r\n$3\r\nset\r\n$4\r\nname\r\n$3\r\nlzz\r\n 解释 *3\r\n 一个长度为3的数组 $3\r\nset\r\n bulk字符串,长度为3 $4\r\nname\r\n bulk字符串,长度为4 $3\r\nlzz\r\n bulk字符串,长度位3 最后的结果就是,正好还原了之前客户端的命令 set name lzz
编号4的数据包
服务端返回值
![](http://ww4.sinaimg.cn/large/a1f45431jw1f25nc38ebej20z50didjl.jpg)
这个内容比较简单
+OK\r\n 简单字符串,OK
更复杂的例子也是如此分析,根据data的内容,结合文档中协议的定义,可以比较容易的反推出交互内容。
3 客户端实现
当然这里不仅仅是协议的东西,还涉及很多应用层开发的知识,协议承载的还是应用数据交互,如果有二次开发啦,或者移植到别的语言等需求,还是要好好研究下的。 完成一个简单的协议实现很简单,但是如何让它高效,稳定,经得起考验,还是挺需要功夫的。4 总结
数据格式非常简单基于文本的协议,可读性好
协议中控制字段非常少,很简洁,解析高效
协议本身是明文,公网使用注意加密传输
相关文章推荐
- Redis 与 数据库处理数据的两种模式(转)
- php5.5.12+redis2.6 Windwos安装下安装
- redis安装及数据类型简介(string、list、set、sorted_set、hash)
- 【redis】跟着redis tutorial的基本学习
- 互联网架构设计之Redis篇-【Redis Windows版本安装过程】
- 互联网架构设计之Redis篇-【Redis的概述】
- service redis does not support chkconfig的解决办法
- redisTemplate keys方法 为空
- redis 学习笔记(7)-cluster 客户端(jedis)代码示例
- Redis的11种Web应用场景
- redis spring 集成
- Python使用Redis实现作业调度系统(超简单)
- windows下安装和启动redis服务器
- 安装redis后,系统异常,被黑客攻击入侵
- Python使用Redis实现一个简单作业调度系统
- Redis: You need tcl 8.5 or newer in order to run
- Redis 基础
- Python使用Redis实现作业调度系统(超简单)
- Redis对于Key的常用操作,基于版本3.0.7
- Redis 常用命令