zoukankan      html  css  js  c++  java
  • 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 第一个字节是"*"

    不同数据块之间使用 (CRLF) 来切割

    Simple String

    简单字符串类型: 编码格式例如以下,一个 “+” 号。后面跟着字符串(可是不包括 或者 ), 结尾是

    主要用来传输。比較短的非二进制安全字符串, 比如传递 “OK”。

    +OK
    
    

    以下的就不介绍了,具体的内容全在 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字符就是 , 这样非常easy的把client的内容还原

    
    *3
                      查看全文
                    
  • 相关阅读:
    如何使用Flannel搭建跨主机互联的容器网络
    移动端——touch事件
    Javascript 模块化指北
    vue重构--H5--canvas实现粒子时钟
    redux-saga框架使用详解及Demo教程
    前端代码编写规范
    探秘JS的异步单线程
    POJ 3714 Raid 近期对点题解
    EditText把回车键变成搜索
    Swift语言概览
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7100810.html
Copyright © 2011-2022 走看看