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

研究的步骤:

  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. ROS(indigo)MoveIt!控制ABB RobotStudio 5.6x 6.0x中机器人运动

    Gazebo以及相关参考文献,参考: ROS(indigo)ABB机器人MoveIt例子 这里需要配置RobotStudio,请参考ROS官网教程.下面列出要点:   window端配置结束后,在Ub ...

  2. iOS中 CocoaPods Mac App的安装和使用 韩俊强的博客

    CocoaPods Mac App的安装和使用 CocoaPods桌面应用版下载地址:https://cocoapods.org/app打开应用会提示你是否安装命令行工具,选择install就也可以在 ...

  3. Android中常用开发工具类—持续更新...

    一.自定义ActionBar public class ActionBarTool { public static void setActionBarLayout(Activity act,Conte ...

  4. 详解EBS接口开发之供应商导入(补充)--供应商银行账户更新

    CREATE OR REPLACE PACKAGE BODY update_vendor_account IS PROCEDURE main(errbuf OUT VARCHAR2, retcode ...

  5. nginx+uwsgi+django 部署原理

    python开发群里经常有同学问 nginx+uwsgi+django 着了教程部署,但是不知道他们之间怎么样的关系,于是我就google到了一个让我看起来很认同的图,大家看了也比较认同,于是就分享出 ...

  6. Java中把JSON和List结果集互转的代码片段整理

    1.将JSON字符串转换成List结果集的方式: //查询结果集 PageDatums picPageDatums = pictureLibraryService.selectPagePictureF ...

  7. Win7/Win8/Win10下安装Ubuntu14.04双系统 以及常见问题

    整理自网络. 1. 制作镜像 将ubantu镜像刻录到优盘(我使用UltraISO刻录,镜像下载地址:链接: http://pan.baidu.com/s/1bndbcGv 密码: qsmb) 2. ...

  8. Tensorflow使用Cmake在Windows下生成VisualStudio工程并编译

    传送门: https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/contrib/cmake http://www.udpwork ...

  9. Cocos2D:塔防游戏制作之旅(十五)

    Yes,貌似添加了好多的代码啊 ;] ,在你添加更多代码时,你可能注意到一些Xcode中的一些警告.首先你先忽略这些警告,我们先添加少量最终缺失的部分,然后再来解释上面代码做了什么! 在Enemy.m ...

  10. Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)

    前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...