tcpdump 抓包实时打印_从tcpdump抓包看TCP/IP协议

因为最近要解析 TCP 报文中 option 段的一块数据,所以不得不详细了解下 TCP/IP 报文。虽然之前看过,很长时间没这么细致地用过,导致了健忘,借着这个机会,通过 tcpdump 抓包分析,详细捋一遍 TCP/IP 报文。

报文获取

如果那样干巴巴地讲这个东西比较晕,而且网上的文章一大堆,没有什么创新。我选择换一个角度来切入 TCP/IP 协议。首先通过 tcpdump 准备报文。

【1】我在 192.168.1.22 这台机器的 10000 端口启一个 redis 服务。

【2】通过 tcpdump 这个工具来抓取数据包,命令如下:

tcpdump -w /tmp/logs -i eth0 port 10000 -s0

【3】在 192.168.1.26 这台机器上访问 192.168.1.22:10000 这个 redis 实例,可以用 redis-cli 客户端,也可以用 telnet,发送一个 ping, 得到对端回复 pong。

【4】停止抓包,用 tcpdump 读取这个数据包(-x 以16进制形式展示,便于后面分析)

tcpdump -r /tmp/logs -n -nn -A -x| vim -

其中有一个数据包是这样的,这也是这篇文章要分析的:

10:54:54.270967 IP 192.168.1.26.61096 > 192.168.1.22.10000: Flags [P.], seq 1041414875:1041414889, ack 658186233, win 115, options [nop,nop,TS val 2377448931 ecr 2741547141], length 14

0x0000: [4560 0042 7567 0000 3d06 6F3C C0A8 011A

0x0010: C0A8 0116] {eea8 2710 3e12 badb 273b 1ff9

0x0020: 8018 0073 64b0 0000 0101 080a 8db4 fde3

0x0030: a368 b085} 2a31 0d0a 2434 0d0a 7069 6e67

0x0040: 0d0a

注意:

【1】之前在文章常用 shell 中介绍过抓包神器 tcpdump,还不会的小伙伴可以偷瞄一眼。

【2】上面报文数据中的 [、]、{ 和 } 是为了方便区分数据,我自己加上的。[]包围的部分为本报文中的 IP 头,{}包围的部分为本报文中的 TCP 头。

报文分析

IP 报文整体结构如下,因为抓到的数据包是 redis 服务,因此在传输层为 TCP 协议。

IP 层解析

解析数据包之前,先把 IP 协议拿出来,如下:

可以看到,IP 报文头部采用固定长度(20B) + 可变长度构成,下面的 TCP 头部也是这样。

然后下面对着抓到的数据包进行分析:

【1】0x4 4bit, ip 协议版本

0x4 表示 IPv4。

【2】0x5 4bit,ip首部长度

该字段表示单位是32b

你可能感兴趣的:(tcpdump,抓包实时打印)