网络协议之:memcached binary protocol详解
简介
前面讲到了memcached的文本协议,虽然文本协议看起来非常简单,但是对于客户端来说一般还是会选择效率更高的二进制协议。
二进制协议的本质和文本协议是一样的,只是他们的表现方式不同而已。本文将会详细介绍memcached中二进制协议的实现细节。
memcached的协议包
对于memcached的请求包和响应包来说,除了请求头有所区别之外,其他的格式都是一样的。
所以对memcached的请求和响应都可以用同一个包的格式来表示:

前面的24个byte是包头部分,接下来的是命令行的额外数据extra,memcached中的key和value。
上面也提到了,请求包和响应包的区别就是header,下面是请求包头和响应包头的定义:
请求包头:

响应包头:

包头中各个字段的含义如下:
- Magic: 魔法数字,用来区分包头是请求包头还是响应包头
如果是请求,那么对应的Magic= 0x80,如果是响应,那么对应的Magic= 0x81。
在最初的设计中,Magic应该和协议的版本相对应的,当版本升级之后,对应的Magic也要进行相应的调整。但是到目前为止,binary协议的magic值还没有变化过。
- Opcode: 操作符,也就是对应的命令
memcached协议中有下面这些操作符:

其中带星号的表示该命令未定,未来可能会有修改。
以Q结尾的命令,表示这个命令是一个quiet的版本,它会忽略不感兴趣的返回数据。
Key length: key的长度
Status: 请求响应response的状态
response的值有下面几种:

Extras length: command extras的长度
Data type:保留字段
data type是一个保留字段,目前只有一个固定的值:0x00。
vbucket id: 命令对应的virtual bucket
Total body length:extra + key + value的总长度
Opaque: 请求生成的一个数据,会被原封不动在对应的响应中返回
CAS:数据的一个唯一标记
memcached命令举例
为了更好的理解memcached的二进制协议,我们以几个常用的命令为例,来看一下memcached具体的请求和响应流程。
最常用的就是get请求,用于向服务器端请某个key对应的值。
假如现在客户端要向服务器端get一个key=hello的数据,那么请求的包如下所示:

其中Magic=0x80, Opcode=0x00,Key length=0x0005,Total body=0x00000005,Key="Hello"
如果服务器端存在对应的key的值,那么将会返回如下的数据包:

我们要注意下面几个跟request值不同的字段:
其中Magic=0x81表示这个是一个response, 因为这是一个response,所以对应的Key length=0x0000。
另外response中包含了get请求中并不存在的Extra length和Extras Flags,这里他们的值分别是0x04和0xdeadbeef,表示Extra length是4个bytes,它的值是0xdeadbeef。
那么这个Extras Flags值是哪里来的呢?如果对比之前讲到的text协议,就可以知道,Extras Flags是在set key value的时候传入的,这个Flags会存放到服务器端,并在get请求中返回。
最后,response中包含了要返回的值"World"。
如果服务器端并没有这个key的值,那么对应的返回包可能是这样的:

其中Status=0x0001,表示是一个异常返回。
对应的value是:"Not found"。
之前还提到了一个以Q结尾的命令行版本,比如getQ,它和get的区别是getQ会把请求的key也放在response包中返回:

因为最后的值中包含了key,所以这里的Key length是有值的,他就是key的长度=0x0005。
最后的返回数据部分包含了两部分,分别是Key="Hello",value="World"。
总结
以上我们介绍了memcached二进制协议的基本格式,并举例说明了get请求的具体使用和包的内容。有了这些知识,我们就可以开发一个支持memcached二净值协议的客户端了。
更多内容请参考 http://www.flydean.com/24-memcached-binary-protocol/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
网络协议之:memcached binary protocol详解的更多相关文章
- 网络协议之ts---ts 流分析详解
名词缩写翻译: es:elements stream 基本流 pes:packet elements stream 打包流 pts:presentation time stamp 显示时间戳 dts: ...
- HTTP协议头部与Keep-Alive模式详解
HTTP协议头部与Keep-Alive模式详解 .什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器 ...
- Linux 网络流量实时监控工具之ntopng详解
大纲一.前言二.ntopng 简介三.ntopng 功能说明 四.ntopng 安装详解五.ntopng 配置详解 六.ntopng 使用详解注,操作系统 CentOS 5.5 X86_64,软件版本 ...
- 搞懂分布式技术4:ZAB协议概述与选主流程详解
搞懂分布式技术4:ZAB协议概述与选主流程详解 ZAB协议 ZAB(Zookeeper Atomic Broadcast)协议是专门为zookeeper实现分布式协调功能而设计.zookeeper主要 ...
- memcached 命令操作详解
memcached 命令操作详解 一.存储命令 存储命令的格式: <command name> <key> <flags> <exptime> < ...
- Linux网络状态工具ss命令使用详解【转】
ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...
- (转)Linux网络状态工具ss命令使用详解
Linux网络状态工具ss命令使用详解 原文:http://www.landui.com/help/show-5991.html ss 是 socket statistics 的缩写.顾名思义,ss ...
- 网络传输层之TCP/UDP详解
一.运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层. 运输层的任务就是负责主机中两个进程之间的通信,其数据传输的单 ...
- python网络编程-OSI七层模型详解
OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...
随机推荐
- 电机三环pid控制及调试经验
一.伺服电机的双环pid 双环pid在正常底盘运动的控制中已经足够了,但是对于双轴云台的控制来说,双环pid的云台控制的响应速度是远远不够的,所以加入了电流环的控制. 两篇大佬的文章--这是我学习pi ...
- 帝国cms7.5忘记登录密码以及多次登录失败被锁定终极解决办法
其实网上很多忘记登录密码的解决方法都是相对于7.5版本以下的,在7.5的版本里根本不适用,今天小编主要给大家说的是针对帝国cms7.5忘记登录密码正确的解决办法. 前提是你能登陆服务器: 一.忘记登录 ...
- C++五子棋(一)——开发环境
开发环境 环境准备 Visual Studio Windows EasyX图形库 素材文件 素材文件已经准备了,点击此处获取 百度网盘链接 提取码:su6p 创建项目 打开Visual Studio ...
- Markdown练习
这是一级标题 这是二级标题 这是三级标题 这是无序列表1 这是无序列表2 有序1 有序2 重点 计网 1. 第一章 第一部分 1.概念.组成.功能和分类 1. 概念 计算机网络是互连的.自治的计算机的 ...
- python基础练习题(题目 文本颜色设置)
day23 --------------------------------------------------------------- 实例035:设置输出颜色 题目 文本颜色设置. 分析:不会, ...
- 云平台短信验证码通知短信java/php/.net开发实现
一.本文目的 大部分平台都有一个接入发送短信验证码.通知短信的需求.虽然市场上大部分平台的接口都只是一个非常普通的HTTP-GET请求,但终归有需要学习和借鉴使用的朋友. 本文的初衷是主要提供学习便利 ...
- v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码
本篇关键词:指令格式.条件域.类型域.操作域.数据指令.访存指令.跳转指令.SVC(软件中断) 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 ...
- .Net Core 操作 MongoDB 常见问题及解决方案
System.FormatException:"Element '_id' does not match any field or property of class XXXX." ...
- 【ACM程序设计】求短路 Floyd算法
最短路 floyd算法 floyd是一个基于贪心思维和动态规划思维的计算所有点到所有点的最短距离的算法. P57-图-8.Floyd算法_哔哩哔哩_bilibili 对于每个顶点v,和任一顶点对(i, ...
- Caused by: java.lang.Exception: No native library is found for os.name=Mac and os.arch=aarch64. path=/org/sqlite/native/Mac/aarch64
编译项目报错: Caused by: java.lang.Exception: No native library is found for os.name=Mac and os.arch=aarch ...