ICMP实验一:ICMP地址掩码请求与应答

2015年11月08日

一、实验目的

通过简单的实验来了解ICMP地址掩码请求与应答

二、ICMP地址掩码请求与应答简介

  • 数据包格式

图片失效

  • 字段说明
    • 类型和代码:类型17,代码0,代表ICMP地址掩码请求;类型18,代码0,代表ICMP地址掩码应答
    • 检验和:整个报文的检验和
    • 标识符与序列号:由发送端设定,在应答中被返回,这样发送端就能把应答和请求进行匹配
    • 32位子网掩码:发送端为0.0.0.0

三、实验环境

表1 ICMP实验环境
机器名称 网卡名称 IP地址 MAC地址 地址掩码 内核参数
FreeBSD V1 em0 192.168.146.141 00:0c:29:4b:8e:c3 255.255.255.0 net.inet.icmp.maskrepl=1(默认是0,避免局域网内广播风暴)
lo0 127.0.0.1 255.0.0.0
FreeBSD V2 em0 192.168.146.142 00:0c:29:c7:9f:61 255.255.255.0 net.inet.icmp.maskrepl=1(默认是0,避免局域网内广播风暴)

四、实验步骤一(广播)

  • 在FreeBSD V1和FreeBSD V2上监听局域网内所有ICMP数据包
1
2
# 命令
tcpdump -ntex -vnn icmp
  • FreeBSD V1对局域网广播ICMP地址掩码请求,代码为icmpaddrmask.c
1
2
3
4
5
6
7
# 命令
cc icmpaddrmask.c -o icmpaddrmask
icmpaddrmask 192.168.146.255

# 结果
received mask = ffffff00, from 192.168.146.141
received mask = ffffff00, from 192.168.146.142
  • FreeBSD V1和FreeBSD V2监听到的网络内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# FreeBSD V1 上监听到的网络内容
14:45:48.820263 00:0c:29:4b:8e:c3 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 46: (tos 0x0, ttl 64, id 4015, offset 0, flags [none], proto ICMP (1), length 32)
    192.168.146.141 > 192.168.146.255: ICMP address mask request, length 12
	0x0000:  4500 0020 0faf 0000 4001 c450 c0a8 928d
	0x0010:  c0a8 92ff 1100 30c3 850c 3930 0000 0000
14:45:48.820415 00:0c:29:4b:8e:c3 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 46: (tos 0x0, ttl 64, id 4015, offset 0, flags [none], proto ICMP (1), length 32)
    192.168.146.141 > 192.168.146.255: ICMP address mask request, length 12
	0x0000:  4500 0020 0faf 0000 4001 c450 c0a8 928d
	0x0010:  c0a8 92ff 1100 30c3 850c 3930 0000 0000
14:45:48.821057 00:0c:29:c7:9f:61 > 00:0c:29:4b:8e:c3, ethertype IPv4 (0x0800), length 60: (tos 0x0, ttl 64, id 3089, offset 0, flags [none], proto ICMP (1), length 32)
    192.168.146.142 > 192.168.146.141: ICMP address mask is 0xffffff00, length 12
	0x0000:  4500 0020 0c11 0000 4001 c85f c0a8 928e
	0x0010:  c0a8 928d 1200 30c2 850c 3930 ffff ff00
	0x0020:  0000 0000 0000 0000 0000 0000 0000

# FreeBSD V2 上监听到的网络内容
01:45:30.787903 00:0c:29:4b:8e:c3 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 60: (tos 0x0, ttl 64, id 4015, offset 0, flags [none], proto ICMP (1), length 32)
    192.168.146.141 > 192.168.146.255: ICMP address mask request, length 12
	0x0000:  4500 0020 0faf 0000 4001 c450 c0a8 928d
	0x0010:  c0a8 92ff 1100 30c3 850c 3930 0000 0000
	0x0020:  0000 0000 0000 0000 0000 0000 0000
01:45:30.788336 00:0c:29:c7:9f:61 > 00:0c:29:4b:8e:c3, ethertype IPv4 (0x0800), length 46: (tos 0x0, ttl 64, id 3089, offset 0, flags [none], proto ICMP (1), length 32)
    192.168.146.142 > 192.168.146.141: ICMP address mask is 0xffffff00, length 12
	0x0000:  4500 0020 0c11 0000 4001 c85f c0a8 928e
	0x0010:  c0a8 928d 1200 30c2 850c 3930 ffff ff00

五、实验结果分析一(广播)

  • 分析FreeBSD V2监听到的数据报,易得:
表2 IP数据报首部解析
版本 首部长度 服务类型 总长度 标识 标志 片偏移 TTL 协议 首部校验和 源IP地址 目的IP地址
0x4 0x5 0x00 0x0020 0x0faf 0x0 0x0 0x40 0x01 0xc450 0xc0a8928d 0xc0a892ff
IPV4 20 Bytes 一般服务 32Bytes(20Bytes IP首部 + 12Bytes ICMP报文) 4015 64 ICMP 置为0x0000 192.1658.146.141 192.1658.146.255


表3 ICMP地址掩码请求数据报解析
类型 代码 检验和 标识符 序列号 32位子网掩码
0x11 0x0 0x30c3 0x850c 0x3930 0x0
17 0 置为0x0000 0.0.0.0


表4 ICMP地址掩码应答数据报解析
类型 代码 检验和 标识符 序列号 32位子网掩码
0x12 0x0 0x30c2 0x850c 0x3930 0xffffff00
18 0 置为0x0000 255.255.255.0


  • 检验和的计算(具体原理可见 IP实验一:首部校验和算法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# IP首部
cksum = 0x4500 + 0x0020 + 0x0faf + 0x0000 + 0x4001 + 0x0000 + 0xc0a8 + 0x928d + 0xc0a8 + 0x92ff = 0x33bac
cksum = 0x33bac >> 16 + 0x2a32b & 0x33bac = 0x3baf
cksum = 0x3baf + 0x3baf >> 16 = 0x3baf
cksum = (0xffffffff - 0x3baf) & 0xffff = 0xc450

# ICMP地址掩码请求数据报
cksum = 0x1100 + 0x0000 + 0x850c + 0x3930 + 0x0000 + 0x0000 = 0xcf3c
cksum = 0xcf3c >> 16 + 0xcf3c & 0x33bac = 0xcf3c
cksum = 0xcf3c + 0xcf3c >> 16 = 0xcf3c
cksum = (0xffffffff - 0xcf3c) & 0xffff = 0x30c3

# ICMP地址掩码应答数据报
cksum = 0x1200 + 0x0000 + 0x850c + 0x3930 + 0xffff + 0xff00 = 0x2cf3b
cksum = 0x2cf3b >> 16 + 0x2cf3b & 0x33bac = 0xcf3d
cksum = 0xcf3d + 0xcf3d >> 16 = 0xcf3d
cksum = (0xffffffff - 0xcf3d) & 0xffff = 0x30c2
  • 几点注意

    • 发送端捕获到的由发送端的发送的IP数据包尚未填充空白字符,如FreeBSD V1上的14:45:48.820263与FreeBSD V2上的01:45:30.787903
    • 当以太网驱动程序识别出目的地址是广播地址后,它会把分组送到网络上,同时传一份拷贝到环路接口(lo0)上,所以FreeBSD V1会监听到两份一样的ICMP地址掩码请求

六、实验步骤二(本地地址)

  • 在FreeBSD V1上分别监听lo0和em0的ICMP数据包
1
2
3
# 命令
tcpdump -ntex -i lo0 -vnn icmp
tcpdump -ntex -i em0 -vnn icmp
  • FreeBSD V1对环路地址lo0发送ICMP地址掩码请求
1
2
3
4
5
# 命令
icmpaddrmask 127.0.0.1

# 结果
received mask = ff000000, from 127.0.0.1
  • FreeBSD V1监听到的网络内容如下
1
2
3
4
5
6
7
8
9
10
11
12
# 监听到lo0上的网络内容
16:35:22.869204 AF IPv4 (2), length 36: (tos 0x0, ttl 64, id 56452, offset 0, flags [none], proto ICMP (1), length 32, bad cksum 0 (->a056)!)
    127.0.0.1 > 127.0.0.1: ICMP address mask request, length 12
	0x0000:  4500 0020 dc84 0000 4001 0000 7f00 0001
	0x0010:  7f00 0001 1100 56b8 5f17 3930 0000 0000
16:35:22.869212 AF IPv4 (2), length 36: (tos 0x0, ttl 64, id 56453, offset 0, flags [none], proto ICMP (1), length 32, bad cksum 0 (->a055)!)
    127.0.0.1 > 127.0.0.1: ICMP address mask is 0xff000000, length 12
	0x0000:  4500 0020 dc85 0000 4001 0000 7f00 0001
	0x0010:  7f00 0001 1200 56b7 5f17 3930 ff00 0000

# 监听到em0上的网络内容
# 没有监听到任何内容
  • FreeBSD V1对环路地址em0发送ICMP地址掩码请求
1
2
3
4
5
# 命令
icmpaddrmask 192.168.146.141

# 结果
received mask = ff000000, from 192.168.146.141
  • FreeBSD V1监听到的网络内容如下
1
2
3
4
5
6
7
8
9
10
11
12
# 监听到lo0上的网络内容
16:37:18.982840 AF IPv4 (2), length 36: (tos 0x0, ttl 64, id 60654, offset 0, flags [none], proto ICMP (1), length 32, bad cksum 0 (->bbb7)!)
    127.0.0.1 > 192.168.146.141: ICMP address mask request, length 12
	0x0000:  4500 0020 ecee 0000 4001 0000 7f00 0001
	0x0010:  c0a8 928d 1100 48b8 6d17 3930 0000 0000
16:37:18.982847 AF IPv4 (2), length 36: (tos 0x0, ttl 64, id 60655, offset 0, flags [none], proto ICMP (1), length 32, bad cksum 0 (->bbb6)!)
    192.168.146.141 > 127.0.0.1: ICMP address mask is 0xff000000, length 12
	0x0000:  4500 0020 ecef 0000 4001 0000 c0a8 928d
	0x0010:  7f00 0001 1200 48b7 6d17 3930 ff00 0000

# 监听到em0上的网络内容
# 没有监听到任何内容

七、实验结果分析二(本地地址)

  • 本机发送给本机IP地址(包括环路地址)实际上都是送到环路地址,ICMP地址掩码应答必须是实际收到请求的接口的子网掩码,所以所有发送给本机IP的ICMP地址掩码请求得到的应答都是环回接口的应答
  • 包含发送到回环地址的ICMP地址掩码请求和应答的IP数据包首部都是不进行首部校验和计算的

八、参考内容