Redis 协议为例谈简单的协议分析

如何去研究一个协议的过程。协议的格式。优点,怎么样模拟发包等。以下是一个简单的过程记录。

研究的步骤:

  1. 协议相关的资料,RFC。官方文档等。

    弄清晰协议工作在4层还是7层,是二进制还是文本协议等

  2. 抓包,通过分析数据包来真实的看到通信过程,另外一个就是自己实现时候方面调试
  3. 看client或者服务端的源代码,了解实现细节(假设你须要拆轮子和造轮子)
  4. 总结下它的优缺点等

1 协议信息

尽量找到原始的资料和精辟的分析

特点小结

  • Redis client和服务端交互的协议叫做 RESP(REdis Serialization Protocol),Redis集群中节点交互用的不是这协议
  • RESP是二进制安全的, 支持多种数据格式
  • RESP工作在TCP层,基于文本的协议。服务端默认port是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 client服务端通信的包。

比如运行例如以下命令

127.0.0.1:6379> set name lzz
OK

一共是4个包。一个是client发送指令,一个是服务端返回指令,另外2个是ACK。 主要看client发送指令(编号为1的数据包)和服务端返回的指令(编号为4的数据包),见下图。

数据包

编号1的数据包
发送给服务的set命令

数据包1

通过截图能够清晰的看到,TCP包里的data内容,0d0a相应的ASCII字符就是 \r\n, 这样非常easy的把client的内容还原


*3
posted @ 2017-06-30 21:56  yxysuanfa  阅读(618)  评论(0编辑  收藏  举报