tcpdump 是Linux平台上网络抓包、分析神器,wireshark可用在Windows上以可视化方式直接分析查看tcpdump抓取的数据文件。且wireshark内置支持很多常见应用协议解析,其中就包括kafka通信协议(Wireshark 2.4.0到2.6.0)。因此我们可以通过tcpdump抓取kafka数据包保存到文件,通过wireshark分析学习kafka通信协议交互。
Wireshark支持的kafka协议字段可参考此链接: https://www.wireshark.org/docs/dfref/k/kafka.html
Wireshark内置支持的协议类型非常多,可以参考: https://www.wireshark.org/docs/dfref/
下面以librkafka中的performance Demo程序为例,以高级消费者API连接kafka消费消息,简单分析一下抓包和解析过程。
首先需要注意,必须将kafka收、发两端的包都抓取到,才能正确解析。因此我们在客户端,根据kafka所使用9092端口抓包: (为便于分析,kafka中只有一条消息)
tcpdump -i any -nn -vv tcp port 9092 -s 0 -w rdkafka_performance.cap
然后将抓包文件传到Windows机器,用wireshark打开:
1、wireshark可能未能自动识别出kafka协议(例如本例中一开始协议被识别为SMPP)。首先检查一下Wireshark是否支持kafka协议解析:在过滤条件那里输入"kafka",如果自动弹出下拉列表,对应各个kafka字段,说明是支持kafka协议解析的。
2、接下来点选中一条数据消息(注意不要选中TCP三次握手的消息),右键,点击“解码为”:
3、在弹出窗口的“当前”下拉列表中选择“kafka”,然后点击“OK”。
4、可以看到除了tcp控制报文外,其他报文都被解析成kafka协议(如解析不出来,可尝试退出wireshark重新打开)。
选中某一条kafka协议,可以看到前面会用箭头标注与之相关的请求报文或响应报文。可能一个请求报文会对应多个响应报文。
5、 接下来就可以具体查看某个请求或响应报文的详细字段了。例如
1)下图是请求MetaData消息
2) 下图展示了一个kafka OffsetFetch Response 消息。可以看到partition 0、partition 1的offset都是 -1(KAFKA_OFFSET_END)
3) kafka Fetch Request,可以看到向Partition 0请求消息,起始offset是0,Max Bytes是1MB。
4) Kafka Fetch Response,消息内容为“The first record”。Partition是0。
5)这里只是简单分析了几个协议,完整的协议介绍可以参考:
A Guide To The Kafka Protocol :
https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol
kafka协议指南 :
http://colobu.com/2017/01/26/A-Guide-To-The-Kafka-Protocol/