某天,梳理kafka每个Topic流量,其中有个Topic有流量,但是业务负责人不知道从哪台机器生产的消息。我们知道server端IP
+端口
,Topic名字
也知道,现在需要查找生产IP
.此为背景。
首先,在kafka的server端使用tcp抓包,并记录存到文件中。然后scp到本地使用wireshark分析。‘
TCP 知识点
一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, dst_port)准确说是五元组,还有一个是协议。但因为这里只是说TCP协议,所以,这里我只说四元组。
tcp头格式
Seq (S ,Sequence Number是包的序号,用于解决包乱序的问题)
标志位 (tcp flag)
- C Reduced
- E ECN Echo
- S (Syn Synchronize Sequence Numbers 用于同步seq序列号)
- A (ACK Acknowledgement Number就是ACK——用于确认收到,用于解决不丢包的问题)
- R (Reset)
- P (Push)
- F (Fin )
三次握手,四次挥手
-
对于建链接的3次握手,主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。
-
对于4次挥手,其实你仔细看是2次,因为TCP是全双工的,所以,发送方和接收方都需要Fin和Ack。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态。
下图两边同时断开连接
Tcpdump抓包过程
tcpdump -i eth0 -w - src host 10.138.83.150 and dst port 2181 | strings
tcpdump -i eth0 -c 1000000 -nn port 9092 -w 9092.pcap