tcpdump分析IP协议
2019-04-01 本文已影响0人
十毛tenmao
IP协议是互联网最基础的协议,在使用tcpdump查看数据包的时候,有时候对一些字段的汉所以不是很明确
比如:
[tenmao@localhost ~]$ sudo tcpdump -i any -n icmp -vvvv
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
21:11:21.505189 IP (tos 0x0, ttl 64, id 36112, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.58.100 > 14.215.177.38: ICMP echo request, id 61852, seq 1, length 64
21:11:21.509826 IP (tos 0x0, ttl 128, id 49303, offset 0, flags [none], proto ICMP (1), length 84)
14.215.177.38 > 192.168.58.100: ICMP echo reply, id 61852, seq 1, length 64
我们仔细对照IP协议来分析上面的内容
IP协议字段解释
IP协议头
- 版本号:IP协议的版本。对于IPv4来说值是4
- 头部长度:4位最大为0xF,注意该字段表示单位是字(4字节)
- 服务类型(Type Of Service,TOS):3位优先权字段(现已被忽略) + 4位TOS字段 + 1位保留字段(须为0)。4位TOS字段分别表示最小延时、最大吞吐量、最高可靠性、最小费用,其中最多有一个能置为1。应用程序根据实际需要来设置 TOS值,如ssh和telnet这样的登录程序需要的是最小延时的服务,文件传输ftp需要的是最大吞吐量的服务
- 总长度: 指整个IP数据报的长度,单位为字节,即IP数据报的最大长度为65535字节(2的16次方)。由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP分片数据报的长度远远没有达到最大值
下来的3个字段则描述如何实现分片:
-
标识:唯一地标识主机发送的每一个数据报,其初始值是随机的,每发送一个数据报其值就加1。同一个数据报的所有分片都具有相同的标识值
-
标志: 位1保留,位2表禁止分片(DF),若设置了此位,IP模块将不对数据报进行分片,在此情况下若IP数据报超过MTU,IP模块将丢弃数据报并返回一个ICMP差错报文;位3标识更多分片(MF),除了数据报的最后一个分片,其他分片都要把它设置为1
-
位偏移:分片相对原始IP数据报数据部分的偏移。实际的偏移值为该值左移3位后得到的,所以除了最后一个IP数据报分片外,每个IP分片的数据部分的长度都必须是8的整数倍
-
生存时间:数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置,常设置为64。数据报在转发过程中每经过一个路由该值就被路由器减1.当TTL值为0时,路由器就将该数据包丢弃,并向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环
-
协议: 区分IP协议上的上层协议。在Linux系统的/etc/protocols文件中定义了所有上层协议对应的协议字段,ICMP为1,TCP为6,UDP为17
-
头部校验和: 由发送端填充接收端对其使用CRC算法校验,检查IP数据报头部在传输过程中是否损坏
-
源IP地址和目的IP地址: 表示数据报的发送端和接收端。一般情况下这两个地址在整个数据报传递过程中保持不变,不论中间经过多少个路由器
-
选项:可变长的可选信息,最多包含40字节。选项字段很少被使用。可用的IP可选项有:
- 记录路由: 记录数据包途径的所有路由的IP,这样可以追踪数据包的传递路径
- 时间戳: 记录每个路由器数据报被转发的时间或者时间与IP地址对,这样就可以测量途径路由之间数据报的传输的时间
- 松散路由选择: 指定路由器的IP地址列表数据发送过程中必须经过所有的路由器
- 严格路由选择: 数据包只能经过被指定的IP地址列表的路由器
- 上层协议(如TCP/UDP)的头部信息
tcpdump抓取二进制数据
- 二进制数据
[tenmao@localhost ~]$ sudo tcpdump -i any -nxt icmp -vvvv
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
IP (tos 0x0, ttl 64, id 8012, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.58.100 > 14.215.177.38: ICMP echo request, id 9198, seq 1, length 64
0x0000: 4500 0054 df3d 4000 4001 a060 c0a8 3a64
0x0010: 0ed7 b127 0800 cbae 472e 0001 5d71 a35c
0x0020: 0000 0000 1e81 0700 0000 0000 1011 1213
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
0x0050: 3435 3637
IP头部对照解析
IP (tos 0x0, ttl 64, id 8012, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.58.100 > 14.215.177.38: ICMP echo request, id 9198, seq 1, length 64
4500 0054 1f4c 4000 4001 6053 c0a8 3a64
字段 | 协议 | 内容 | 对应的tcpdump文字描述 |
---|---|---|---|
0x4 | 4位的版本号 | IP版本号 | |
0x5 | 4位的头部长度 | 头部长度为5个字(20字节) | |
0x00 | 8位的服务类型TOS | 普通服务 | tos 0x0 |
0x0054 | 16位的总长度 | 数据包总长度(84字节) | length 84 |
0x1f4c | 16位的标识 | 数据报标识 | id 8012 |
0x4 | 3位的标志 | 禁止分片,因没携带数据 | flags [DF] |
0x000 | 13位的位偏移 | 为0表没发生位偏移 | offset 0 |
0x40 | 8位的生存时间 | 生存时间为64跳 | ttl 64 |
0x01 | 8位的协议字段 | 为1表上层协议是ICMP协议 | proto ICMP (1) |
0x6053 | 16位的IP头部校验和 | 头部校验和 | |
0xc0a8 3a64 | 32位的源端IP地址 | 源端IP地址192.168.58.100 | 192.168.58.100 |
0x0ed7 b126 | 32位的目的端IP地址 | 目的端IP地址14.215.177.38 | 14.215.177.38 |
更多字段
tos(Type of Service):
8个优先级的定义如下:
111--Network Control(网络控制);
110--Internetwork Control(网间控制);
101--Critic(关键);
100--Flash Override(疾速);
011--Flash(闪速);
010--Immediate(快速);
001--Priority(优先);
000--Routine(普通)
常见proto协议号
- 1
ICMP Internet
控制消息 - 6
TCP
传输控制 - 17
UDP
用户数据报