如何去研究一个协议的过程。协议的格式。优点,怎么样模拟发包等。以下是一个简单的过程记录。
研究的步骤:
- 协议相关的资料,RFC。官方文档等。
弄清晰协议工作在4层还是7层,是二进制还是文本协议等
- 抓包,通过分析数据包来真实的看到通信过程,另外一个就是自己实现时候方面调试
- 看client或者服务端的源代码,了解实现细节(假设你须要拆轮子和造轮子)
- 总结下它的优缺点等
1 协议信息
尽量找到原始的资料和精辟的分析
- Redis Protocol specification
- Request/Response protocols and RTT
- A Beginner’s Guide to the Redis Protocol
特点小结
- 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命令
通过截图能够清晰的看到,TCP包里的data内容,0d0a
相应的ASCII字符就是
, 这样非常easy的把client的内容还原
*3
相关阅读:
玩懂Log,打开Android大门(sundy深入浅出)之一
ListView 中getView的原理+如何在ListView中放置多个item(android.widget.ListView)
验证视图状态MAC失败问题正确的解决办法
Coolite Extjs Store开发心得(转)
Delphi进制转换
得到Exitjs DataView中图片文件名
C#文件常用操作
Delphi中TList类应用
代码优化的第一步是判定程序热点(转)
Asp.net性能优化
-
原文地址:https://www.cnblogs.com/yxysuanfa/p/7100810.html
- 最新文章
-
wince 关于windows embedded compact 7
wince6 com0 改成普通串口方法
亲身体验CORBA: 使用java和C++混合编程
Linux中x86的内联汇编
CORBA Programming with TAO (基本概念)
Linux汇编语言开发指南
AT&T asm
GNU gcc 使用手册
AT&T ASM Syntax
AT&T 汇编 (AT&T ASM) 参考
- 热门文章
-
接触 CORBA 内幕: IOR、GIOP 和 IIOP
Linux下AT&T汇编语法格式简介(Haison整理)
怎样在android系统启动时自动运行自己的程序(RECEIVE_BOOT_COMPLETED)
使用 Android PreferenceScreen 偏好显示类(android.preference.PreferenceScreen)
[Android]ListView性能优化之视图缓存(android.widget.ListView)
第一次用真机做测试
android应用开发全程实录你有多熟悉listview?
android.Manifest.permission
百度地图
android中设置ListView的选中的Item的背景颜色(附源码)