这里主要记录zookeeper client通信协议的.在官方的文档里没找到协议相关部分.这里是记录的协议是通过分析客户端代码得来的.

一.通信流程

客户端发起连接,发送握手包进行timeout协商,协商成功后会返回一个session id和timeoout值.随后就可以进行正常通信,通信过程中要在timeout范围内发送ping包.

zookeeper client和server之间的通信协议基本规则就是发送请求获取响应.并根据响应做不同的动作.

发送数据格式为:

消息长度+xid+request. xid每次请求必须是唯一的.消息长度和xid同为4字节,命令长度为4字节且必须为request的开始4字节.

命令是从1到11的数字表示,close的命令为-11.不同类型请求request有些差异.详细在第二部分.

特殊请求具有固定的xid:watch_xid固定为-1,ping_xid为-2,auth_xid固定为-4.普通请求一般从0开始每次请求累加一次xid.

响应数据为:

消息长度+header+response.消息长度为4字节,表明header+response的总长度.

header为xid,zxid,err对应长度为4,8,4.response根据请求类型不同具有差别.详细在第二部分

根据header里xid的区别分为watch,ping,auth,data这四种类型

根据这四种类型来区分返回消息是事件,还是认证,心跳和请求数据.client并以此作出不同响应.

二.各命令request

1.首先是握手connect,

  request:

      protocol version+zxid+timeout+session id+passwd len+passwd+read only.对应的字节长度为4,8,4,8,4,16,1

         取值除timeout外其他几个皆可为0,password可以为任意16个字符.read_only为0或1(是布尔值).

   握手包没有xid和命令

  response:

    protocol version+timeout+session_id+passwd len+passwd+read only.

   握手响应包没有header.

2.ping

  request:

type (ping包只有一个字段就是命令值是11,它完整的发送包是4字节长度,4字节xid,4字节命令.)

  response:

      res_len+header+res (ping响应包一般只拆到header即可通过xid确认)

3.create

request:

      type+path_len+path+data_len+data+acl_len+acl+flags

      type=1,4字节

      path_len是4字节,为path的长度,path为需要创建的路径,支持utf8

      data_len为4字节,为data的长度,data为节点的值,支持utf8

      acl_len,4字节.表明acl的长度.

      acl,详见acl描述部分.

      flags为4字节.永久节点值为0,临时为1,时序节点为2,临时时序节点为前两者之和3.

   response:

      data_len+data (无特殊情况即不再将res_len和header写出来,下面各请求也将如此.如没有将表明)

      data_len为4字节,data可以使用utf8

4.delete

   request:

      type+path_len+path+protocol version

      type=2

      path_len,path同create request

      protocol version 4字节,为-1则不进行版本检查.否则版本不同则删除失败

   response:

      只返回res_len+header.不返回res_data.

5.exists

   request:

      type+path_len+path+watcher

      type=3

      path_len,path同create request

      watcher为布尔值.判断是否有事件注册.为1或0. 1字节

   response:

      stat

      stat由8,8,8,8,4,4,4,8,4,4,8字节顺序组成.

6.getdata

   request:

       type+path_len+path+watcher

       type=4.其他字段同exists request

   response:

       data_len+data+stat

       data_len为data长度,4字节.

       stat同exists response

7.setdata

   request:

       type+path_len+path+data_len+data+protocol version

       type=5,

       path,data字段同create request

       protocol version 字段同delete request.-1为不考虑版本.

   response:

       stat

       同exists response

8.getacl

   request:

       type+path_len+path

       type=6,其他字段同其他request

   response:

       acl count+acls+stat

       acl_count记录acls的数量,4字节,当值为-1时表示返回无,acls参见ACL部分.

       stat同其他部分

9.setacl

   request:

       type+path_len+path+acl_count+acls+protocol version

       type=7,path同其他request

       acl_count,acls同getacl response.

       pro version 同其他request

   response:

       stat

10.getchildren

   request:

       type+path_len+path+watcher

       type=8,其他字段同exists request

   response:

       children_count+childrens

       children_count记录childrens的个数.4字节,值为-1时表示返回无

       childrens是path_len+path的集合.

11.sync

   request:

       type+path_len+path

       type=9,所有字段同其他request

   response:

       path_len+path

       字段同其他response

12.getchildren2

   request:

       type+path_len+path+watcher

       type=12,其他字段同getchildren request

   response:

       返回同getchildren response.唯一不同是返回的最后多了stat.

13.checkversion

   request:

       type+path_len+path+protocol version

       type=13,其他字段同其他request

   response:

       无返回

14.transaction

   request:

       type+ops

       type=14

       ops为其他request的列表集.完整表示如下

       (op.type+flages+err+op.request)+(同样的集合)+....+(-1+1+-1)最后需要加上这个结束标志.

       op.request为其他类型的request不含type的部分.

       type 4字节,flages为0或1,1字节,err为数字,无错误为-1,4字节.结束部分的标志字节对应为4,1,4.

   response:

       返回比较杂.根据header.type有不同结果.

ACL:

   acl分两部分.一部分是标志.一部分是数据和id

   标志:

      all,read,write,create,delete,admin

      all=31,read=1,write=2,create=4,delete=8,admin=16 均为4字节

      若想表示其中某几项则使用对应项的值的和即可

   数据和id:

      数据和id都是字符串可以使用utf8,均为长度加字符.长度为4字节

   ACL完整标识:

      acl_标志+data_len+data+id_len+id

zookeeer client 通信协议的更多相关文章

  1. 我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)

    我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp) 分类: [自动化]2007-07-19 10:04 34038人阅读 评论(38) 收藏 举报 vb嵌入式dostcp ...

  2. Kafka 源代码分析.

    这里记录kafka源代码笔记.(代码版本是0.8.2.1) kafka的源代码如何下载.这里简单说一下. git clone https://git-wip-us.apache.org/repos/a ...

  3. X11 FRAMEBUFFER QT

    之前对X11 FRAMEBUFFER理解的不够,现在总结一下Qt Embedded是挪威Trolletch公司的图形化界面开发工具Qt的嵌入式版本,它通过QtAPI与LinuxI/O以及Framebu ...

  4. MapReduce源代码分析之JobSubmitter(一)

    JobSubmitter.顾名思义,它是MapReduce中作业提交者,而实际上JobSubmitter除了构造方法外.对外提供的唯一一个非private成员变量或方法就是submitJobInter ...

  5. RPC框架实现 - 通信协议篇

    RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面.其对业务隐藏了底层通信过程(TCP/UDP.打包/解包.序列化/反序列化),使 ...

  6. 【分布式】Zookeeper序列化及通信协议

    一.前言 前面介绍了Zookeeper的系统模型,下面进一步学习Zookeeper的底层序列化机制,Zookeeper的客户端与服务端之间会进行一系列的网络通信来实现数据传输,Zookeeper使用J ...

  7. ROCKETMQ源码分析笔记2:client

    CLIENT 之前讲过tools里面有大量调用client的东西.为了从源码层面了解rocket,决定啃下client这块骨头. pom 先看pom,看看CLIENT依赖谁.看完后原来是依赖commo ...

  8. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  9. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

随机推荐

  1. Linux的环境变量设置和查看

    一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.永久的:需要修改配置文件,变量永久生效. 2.临时的:使用export命令声明即可,变量在关闭shell时失效. 二. ...

  2. 你真的用好了Python的random模块吗?

    random模块 用于生成伪随机数 源码位置: Lib/random.py(看看就好,千万别随便修改) 真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结 ...

  3. java web 导出Excel 的工具类公用实现

    平时我们在开发后端管理的系统时,经常会出现导出Excel的功能.这个功能很简单,但是呢,我一般就会使用公用的工具类,在一个Util中,暴露公用导出的接口,只需要传入需要导出的数据(一般使用list集合 ...

  4. 【基础】新手任务,五分钟全面掌握JQuery选择器

    1. 基本选择器 1.1 ID选择器: //选中id为myDiv的元素,速度最快 $("#myDiv") 1.2 类选择器: //选中class属性为red的所有元素 $(&quo ...

  5. Node.js入门以及第一个helloworld程序

    1.概念:简单的说 Node.js 就是运行在服务端的 JavaScript.学之前需要明白Node.js是无法挑战jsp.php或者asp这种老牌网站的地位的,是永远不会出现在证券.金融这种领域的. ...

  6. python 列表、元组、字符串、字典、集合、return等梳理

    有必要对这些数据类型及操作做下梳理: 1.列表:增删改查 a.查找: >>> names=["zhang","wang","li&q ...

  7. python求职Top10城市,来看看是否有你所在的城市

    前言 从智联招聘爬取相关信息后,我们关心的是如何对内容进行分析,获取用用的信息. 本次以上篇文章“5分钟掌握智联招聘网站爬取并保存到MongoDB数据库”中爬取的数据为基础,分析关键词为“python ...

  8. scauoj 18025 小明的密码 数位DP

    18025 小明的密码 时间限制:4000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC Description 小明的密码由N(1<=N& ...

  9. grunt基础配置

    grunt基础配置 要使用grunt来管理项目,一般需要如下的几个步骤: 安装grunt命令行工具grunt-cli 在项目中安装grunt 安装grunt插件 建立并配置Gruntfile.js 安 ...

  10. c++概括

    c++到底是什么样的语言 在过去的几十年,计算机技术的发展令人吃惊,当前的笔记本电脑的计算速度和存储信息的能力超过了20世纪60年代的大型机.20世纪七十年代,C和Pascal语言引领人们进入结构化编 ...