gpt4 book ai didi

apache-zookeeper - Zookeeper 通信协议(protocol)

转载 作者:行者123 更新时间:2023-12-04 23:39:44 26 4
gpt4 key购买 nike

我需要使用 tcpdump 调试我的 kafka 消费者和 zookeeper 之间交换的数据。我浏览了 zookeeper 文档,但找不到任何关于 zookeeper 通信协议(protocol)的文章,即我在删除 header 后使用wireshark 获得以下数据转储。如何解释数据部分?

Frame 1: 78 bytes on wire (624 bits), 78 bytes captured (624 bits)
Ethernet II, Src: 22:00:0a:xx:xx:xx (22:00:xx:xx:xx:xx), Dst: fe:ff:xx:xx:xx:xx (fe:ff:ff:xx:xx:xx)
Internet Protocol Version 4, Src: 10.234.xxx.xxx, Dst: 10.231.xxx.xxx
Transmission Control Protocol, Src Port: 51720 (51720), Dst Port: 2181 (2181), Seq: 1, Ack: 1, Len: 12
Data (12 bytes)
Data: 00000008fffffffe0000000b
[Length: 12]

最佳答案

抱歉,我不知道有任何方便的文档详细描述了 Apache ZooKeeper 有线协议(protocol)。在内部,我们的代码库使用一个名为 Jute 的框架,它基于最初改编自 Apache Hadoop 的代码。该框架允许定义结构化记录,根据这些定义生成代码,然后提供由 ZooKeeper 代码的其余部分调用的序列化/反序列化例程。

黄麻记录定义在这里可见:

https://github.com/apache/zookeeper/blob/release-3.4.9/src/zookeeper.jute

用于处理这些记录定义的 Jute 框架代码在此处可见:

https://github.com/apache/zookeeper/tree/release-3.4.9/src/java/main/org/apache/jute

我认为深入了解有线协议(protocol)的唯一选择是深入研究此代码。

在挖掘了几层原始套接字处理代码(根据配置使用 NIO 或 Netty)后,反序列化有效负载的真正工作发生在 ZooKeeperServer#processPacket(ServerCnxn, ByteBuffer) :

https://github.com/apache/zookeeper/blob/release-3.4.9/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java#L941

这是它反序列化 RequestHeader 的地方,它是所有协议(protocol)消息前面的元数据的通用 header 。 RequestHeader的定义显示在这里:

https://github.com/apache/zookeeper/blob/release-3.4.9/src/zookeeper.jute#L88-L91

我们可以看到它由 2 个 4 字节的整数字段组成:一个连接 ID,后跟消息的类型。类型值在 ZooDefs 中定义这里:

https://github.com/apache/zookeeper/blob/release-3.4.9/src/java/main/org/apache/zookeeper/ZooDefs.java#L28

了解了所有这些,让我们回到你的数据包捕获并尝试理解它:

Data: 00000008fffffffe0000000b

00000008 - payload length
fffffffe - connection ID
0000000b - op code ("ping")

在每条消息的前面(甚至在 RequestHeader 之前),都有有效负载的长度。在这里,我们看到长度为 8 个字节。

接下来的 4 个字节是连接 ID, fffffffe .

最后 4 个字节是操作码, 0000000b (或十进制的 11)。阅读 ZooDefs ,我们可以看到这是“ping”操作。 “ping”操作用于客户端和服务器之间的周期性心跳。 “ping”操作的有效载荷中不需要额外的数据,所以这是这个数据包的结尾,后面没有额外的数据。对于不同的操作,有效载荷中会有额外的数据,代表操作的参数。

我希望这有帮助。

关于apache-zookeeper - Zookeeper 通信协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41422395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com