写点什么

网络协议之:memcached binary protocol 详解

作者:程序那些事
  • 2022 年 5 月 13 日
  • 本文字数:1472 字

    阅读完需:约 5 分钟

网络协议之: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/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 刚刚阅读数: 3
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
网络协议之:memcached binary protocol详解_Java_程序那些事_InfoQ写作社区