zookeeer client 通信协议
这里主要记录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 通信协议的更多相关文章
- 我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)
我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp) 分类: [自动化]2007-07-19 10:04 34038人阅读 评论(38) 收藏 举报 vb嵌入式dostcp ...
- Kafka 源代码分析.
这里记录kafka源代码笔记.(代码版本是0.8.2.1) kafka的源代码如何下载.这里简单说一下. git clone https://git-wip-us.apache.org/repos/a ...
- X11 FRAMEBUFFER QT
之前对X11 FRAMEBUFFER理解的不够,现在总结一下Qt Embedded是挪威Trolletch公司的图形化界面开发工具Qt的嵌入式版本,它通过QtAPI与LinuxI/O以及Framebu ...
- MapReduce源代码分析之JobSubmitter(一)
JobSubmitter.顾名思义,它是MapReduce中作业提交者,而实际上JobSubmitter除了构造方法外.对外提供的唯一一个非private成员变量或方法就是submitJobInter ...
- RPC框架实现 - 通信协议篇
RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面.其对业务隐藏了底层通信过程(TCP/UDP.打包/解包.序列化/反序列化),使 ...
- 【分布式】Zookeeper序列化及通信协议
一.前言 前面介绍了Zookeeper的系统模型,下面进一步学习Zookeeper的底层序列化机制,Zookeeper的客户端与服务端之间会进行一系列的网络通信来实现数据传输,Zookeeper使用J ...
- ROCKETMQ源码分析笔记2:client
CLIENT 之前讲过tools里面有大量调用client的东西.为了从源码层面了解rocket,决定啃下client这块骨头. pom 先看pom,看看CLIENT依赖谁.看完后原来是依赖commo ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
- [转载] TLS协议分析 与 现代加密通信协议设计
https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...
随机推荐
- Java IO详解(一)------File 类
File 类:文件和目录路径名的抽象表示. 注意:File 类只能操作文件的属性,文件的内容是不能操作的. 1.File 类的字段 我们知道,各个平台之间的路径分隔符是不一样的. ①.对于UNIX平台 ...
- HTML head头部标签总结
HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多差异性.移动互联网时代,head 头部结 ...
- MyBatis之级联——鉴别器
鉴别器(discriminator)是MyBatis为我们提供的第三个级联也是最后一个.基于之前两篇级联中的场景,现增加学生们去体检,但男女体检项目不一样,我们把男女体检表做成两张表,当然我想也可以设 ...
- 微信小程序开发之获取openid及用户信息
1. 获取openid 1.1 获取code 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的会话密钥(session_key).用户数据的加解 ...
- JVM方法调用
当我们站在JVM实现的角度去看方法调用的时候,我们自然会想到一种分类: 1.编译代码的时候就知道是哪个方法,永远不会产生歧义,例如静态方法,private方法,构造方法,super方法. 2.运行时才 ...
- OpenStack云平台的网络模式及其工作机制
网络,是OpenStack的部署中最容易出问题的,也是其结构中难以理清的部分.经常收到关于OneStack部署网络方面问题和OpenStack网络结构问题的邮件.下面根据自己的理解,谈一谈OpenSt ...
- 修改es最大返回结果数
curl -XPUT http://114.215.171.188:9200/logstash-serverlog/_settings -d '{"index":{"ma ...
- 从LINQ开始之LINQ to Objects(下)
前言 上一篇<从LINQ开始之LINQ to Objects(上)>主要介绍了LINQ的体系结构.基本语法以及LINQ to Objects中标准查询操作符的使用方法. 本篇则主要讨论LI ...
- python 字符串常用方法
字符串常用方法 capitalize() String.capitalize() 将字符串首字母变为大写 name = 'xiaoming' new_name = name.capitalize() ...
- Java阶段性测试--第二三大题参考代码
第二大题: 1.打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于它本身 package Test1; //1.打印出所有的 ...