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

研究的步骤:

  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. Hibernate配置文件current_session_context_class的意思

    转自:http://shuaigg-babysky.iteye.com/blog/563423 此设置的作用如下: What does sessionFactory.getCurrentSession ...

  2. [IDE工具配置]myeclipse 2014 专业版 安装 svn插件

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/38342411 本文作者:sushengmiyan 团队合作的项目肯定少不了版本控制,那 ...

  3. javascript之cookie对象

    属性 name          唯一必须设置的属性,表示cookie的名称 expires       指定cookie的存活周期,如不设置,浏览器关闭自动失效 path           决定c ...

  4. Android初级教程短信防火墙

    如果你有女神,而且有情敌的话,你看到这篇文章会有一种窃喜的感觉. 需求:对情敌的号码进行拦截,让女神手机永远收不到它的号码. 首先定义一个广播接收者类: package com.example.sms ...

  5. JAVA代码规范笔记(下)

    声明 17.推荐一行一个声明,因为这样有利于写注释.换句话说,下面的声明方法中, int level; // indentation level int size; // size of table ...

  6. 【Unity技巧】开发技巧(技巧篇)

    写在前面 和备忘录篇一样,这篇文章旨在总结Unity开发中的一些设计技巧,当然这里只是我通过所见所闻总结的东西,如果有不对之处欢迎指出. 技巧1:把全局常量放到一个单独的脚本中 很多时候我们需要一些常 ...

  7. 数据拟合:多项式拟合polynomial curve fitting

    http://blog.csdn.net/pipisorry/article/details/49804441 常见的曲线拟合方法 1.使偏差绝对值之和最小 2.使偏差绝对值最大的最小       3 ...

  8. Ajax数据返回格式问题解决

    Ajax数据返回格式问题解决 服务端返回的数据格式为: response.setContentType("text/xml;charset=utf-8"); 设置发送到客户端的响应 ...

  9. shell脚本整段注释

    摘自:http://zhidao.baidu.com/link?url=XmCCZmfluRe6n8TjPRKJTx4GGOUPSGX1VNBm-euqGdpKGpveTESxC0HL90UBNT5n ...

  10. jquery easyui datagrid 分页实现---善良公社项目

    接着上篇文章,接下来给大家分享分页的实现,分页其实多多少少见过很有几种,框架中带的图片都特别的好看,会给用户以好的使用效果,具体实现,需要自己来补充代码: 图示1: 通常情况下页面数据的分页显示分成真 ...