通信协议
基于TCP/IP协议,zk实现了自己的通信协议来完成客户端与服务端,服务端与服务端之间的网络通信,zk的通信协议整体上的设计非常简单,
客户端发起连接,发送握手包进行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消息体
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.