使用 wireshark 分析 redis 协议
来自: http://holys.im/2016/01/24/learn-redis-protocol-with-wireshark
如果想要和 redis 打交道, 譬如实现某种语言的 redis 的客户端, 实现 redis 的 proxy,都得懂 redis 的数据序列化协议 REdis Serialization Protocol(RESP)(MySQL 同理). Redis使用 TCP 作为其数据传输协议,而分析 TCP 包就不得不祭出 wireshark 这个神器了。 虽然wireshark 可以分析 TCP 包, 但是直接看 TCP 包不是那么直观的看出与 redis 的关系的。此时,我们将借助 Redis-wireshark 这个wireshark 插件来分析协议。
备注
- 我当前所用的 redis 版本是 2.8。
- 本文只是分析 C-S 模型的 redis server 的协议。redis cluster 是另一套二进制协议。
Tips
如果redis-server 和 redis-cli 都是运行在本机, wireshark 应该使用 loopback
这个虚拟接口来查看数据。至于原因, wireshark 的文档是这么解释的:
If you are trying to capture traffic from a machine to itself, that traffic will not be sent over a real network interface, even if it’s being sent to an address on one of the machine’s network adapters. This means that you will not see it if you are trying to capture on, for example, the interface device for the adapter to which the destination address is assigned. You will only see it if you capture on the “loopback interface”, if there is such an interface and it is possible to capture on it;
分析过程
redis 使用第一个字符来区分不同的数据类型
+
表示simple string-
表示错误 error:
表示冒号表示整数$
表示bulk string*
表示arrays
使用\r\n
CRLF 字符来表示结尾
举例:
1、 Simple string
12 | +OK\r\n+PONG\r\n |
2、 error
1 | -ERR unknown command ‘ada’\r\n |
3、 integer
删除一个不存在的key, 返回了下面的内容
1 </pre></td> |