怎样去研究一个协议的过程,协议的格式,好处,怎么样模拟发包等,下面是一个简单的过程记录。

研究的步骤:

  1. 协议相关的资料,RFC,官方文档等。弄清楚协议工作在4层还是7层,是二进制还是文本协议等
  2. 抓包,通过分析数据包来真实的看到通信过程,另外一个就是自己实现时候方面调试
  3. 看客户端或者服务端的源码,了解实现细节(如果你需要拆轮子和造轮子)
  4. 总结下它的优缺点等

1 协议信息

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

特点小结

  • 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的数据包),见下图。

编号1的数据包

发送给服务的set命令

通过截图可以清晰的看到,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的数据包

服务端返回值

这个内容比较简单

+OK\r\n 简单字符串,OK

更复杂的例子也是如此分析,根据data的内容,结合文档中协议的定义,可以比较容易的反推出交互内容。

3 客户端实现

当然这里不仅仅是协议的东西,还涉及很多应用层开发的知识,协议承载的还是应用数据交互,如果有二次开发啦,或者移植到别的语言等需求,还是要好好研究下的。 完成一个简单的协议实现很简单,但是如何让它高效,稳定,经得起考验,还是挺需要功夫的。

4 总结

  • 数据格式非常简单
  • 基于文本的协议,可读性好
  • 协议中控制字段非常少,很简洁,解析高效
  • 协议本身是明文,公网使用注意加密传输

Redis 协议为例谈简单的协议分析的更多相关文章

  1. 【http协议】浅谈

    [http协议]浅谈 一. 概述 http,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. 请求与响应: 客户端发送请求,服务器端响应数 ...

  2. 转:基于HTTP协议的轻量级开源简单队列服务:HTTPSQS

    [文章作者:张宴 本文版本:v1.7.1 最后修改:2011.11.04 转载请注明原文链接:http://blog.zyan.cc/httpsqs/] HTTPSQS(HTTP Simple Que ...

  3. NetAnalyzer笔记 之 二. 简单的协议分析

    [创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 上篇我们回顾完了NetAnalyzer一些可有可无的历史,在本篇,我决定先不对NetAnalyzer做介绍,而是先 ...

  4. Paxos协议超级详细解释+简单实例

    转载自:  https://blog.csdn.net/cnh294141800/article/details/53768464 Paxos协议超级详细解释+简单实例   Basic-Paxos算法 ...

  5. 旧文备份:简单CANOpen 协议说明

    (十年前的旧文,不舍等扔) 创建日期:2005-11-17 修改日期:2005-11-17 文件名称:简单CANOpen 协议说明.doc 作者:winshton 版本:V1.0 (注:本文以24in ...

  6. 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[转]

    HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key ...

  7. TFTP简单文件传送协议

    T F T P ( Trivial File Transfer Protocol)即简单文件传送协议,最初打算用于引导无盘系统(通常是工作站或X终端).和将在介绍的使用T C P的文件传送协议(F T ...

  8. SNMP简单网络管理协议

    声明:以下内容是学习谌玺老师视频整理出来(http://edu.51cto.com/course/course_id-861.html) SNMP(Simple Network Management ...

  9. SNMP简单网络管理协议(转载)

    SNMP SNMP 网络管理的历史 美国国防部设计了世界上头几个包交换网之一的ARPANET,在70年代,TCP/IP协议族正式被定为军方通信标准,随着此协议的广泛使用,网络管理成了一件大事.在80年 ...

随机推荐

  1. 分布式内存文件系统Tachyon

    UCBerkeley研发的Tachyon(超光子['tækiːˌɒn],名字要不要这么太嚣张啊:)是一款为各种集群并发计算框架提供内存数据管理的平台,也可以说是一种内存式的文件系统吧.如下图,它就处于 ...

  2. Android加速度传感器

    Android加速度传感器 效果图 手机平放桌面的两张截屏,数据一直在刷新 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487 ...

  3. 看见的力量 – (II) 影响地图

    本文转自台湾的李智桦老师的博客,原文地址 Impact Mapping 真是令人惊艳的可视化工具.等你看完这篇文章,你会爱上它的. 典故 继2011年6月Example of specificatio ...

  4. 【移动开发】SparseArray替代HashMap

    SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch). p ...

  5. 皮尔森相似度计算举例(R语言)

    整理了一下最近对协同过滤推荐算法中的皮尔森相似度计算,顺带学习了下R语言的简单使用,也复习了概率统计知识. 一.概率论和统计学概念复习 1)期望值(Expected Value) 因为这里每个数都是等 ...

  6. leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题

    三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...

  7. 发运模块中如何创建Debug 文件

     版本11.5.9到12.x A. 针对发运事务处理或者快速发运产生Debug文件 注意:如果通过发运事务处理执行发放,请参考B部分,下面这部分销售订单发放是格外的设置和日志文件. 1.   每一 ...

  8. 1025. PAT Ranking (25)

    题目如下: Programming Ability Test (PAT) is organized by the College of Computer Science and Technology ...

  9. XML解析之sax解析案例(二)使用sax解析把 xml文档封装成对象

    Demo1类: import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import javax ...

  10. (NO.00003)iOS游戏简单的机器人投射游戏成形记(十七)

    现在玩家选择机器人后,可以在屏幕上或手臂上点击来移动robot's arm了. 但是玩家选择一个机器人后没有视觉效果来表明哪个机器人被选中.玩家做了一个操作后没有视觉反馈会惹恼强迫症用户滴 ;) 这篇 ...