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
                      查看全文
                    
  • 相关阅读:
    问题解决-Plugin with id 'com.github.dcendents.android-maven' not found
    hadoop 04 一 HA高可用配置
    hadoop 03 一 Hadoop机架感知配置
    Windows平台安装配置Hadoop
    hadoop 02一 hadoop配置
    hadoop 01一 hadoop安装配置
    Centos7下载和安装教程
    mysql 命令行导出数据
    RabbitMQ 集群部署(linux-centos6.5)
    Spring 集成RabbitMq
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7100810.html
Copyright © 2011-2022 走看看