2017-01-02 15 views
2

私のカフカ消費者と飼い主の間で交換されるデータをtcpdumpを使ってデバッグする必要があります。私は飼育係のドキュメントを見に行きましたが、動物園の通信プロトコルについて書かれていません。つまり、ヘッダーを削除した後、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] 

答えて

1

申し訳ありませんが、Apache ZooKeeperワイヤプロトコルについて詳しく説明している便利なドキュメントはありません。内部的には、私たちのコードベースはJuteと呼ばれるフレームワークを使用しています。これはApache Hadoopから元々適応されたコードに基づいています。このフレームワークは、構造化されたレコードの定義を可能にし、それらの定義に基づいてコードを生成し、ZooKeeperコードの残りの部分で呼び出される直列化/逆シリアル化ルーチンを提供します。

ジュートレコード定義がここに表示されている:

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

これらのレコード定義を処理するためのジュートのフレームワークのコードはここに表示されている:

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

私はのための唯一の選択肢を考えますワイヤプロトコルの深い理解は、このコードを掘り下げることです。

(構成に応じてNIO又は網状のいずれかを使用して)処理コード生ソケットの数層を通って掘削した後、ペイロードをデシリアライズの実際の仕事は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を逆シリアル化します。 RequestHeaderの定義がここに示されている:メッセージのタイプ、続いてコネクションID:

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

我々は、2〜4バイトの整数フィールドで構成されて見ることができます。タイプ値は、ここで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(または10進数で11)です。 ZooDefsを読むと、これが「ping」操作であることがわかります。 「ping」操作は、クライアントとサーバー間の定期的なハートビートに使用されます。 "ping"操作のためにペイロードに必要な追加データはないので、これはこのパケットの終わりであり、後に追加データはありません。異なる操作の場合、操作の引数を表す追加データがペイロードに存在します。

こちらがお役に立てば幸いです。

+1

私はドキュメントを読みましたが、メタデータはどのように添付されているのか分かりませんでしたか?特定のメッセージはどのようなタイプの要求ですか?申し訳ありませんが、私はTCPパケットのようなヘッダ分解の行で考えていました。ドキュメントは役に立ちます。 – ankshah

+0

@ankshah、私はちょうどZooKeeperコードベースのいくつかの関連するポイントへのリンクを提供するために私の答えを編集し、あなたの質問に投稿した特定のパケットキャプチャの詳細なウォークスルーを与えるためにその情報を使用しました。これが参考になることを願っています。 –

関連する問題