ICMP协议实战
最近想系统的学习TCP/IP协议,之前都是看书看技术文档,现在准备自动动手实践。根据自己学习3GPP LTE等协议的经验,想要学习一个协议,特别是数据面的协议,一定要实际分析数据协议格式,这样可以快速的掌握协议的精髓。
先从简单的协议栈开始,ICMP包,也就是大家熟悉的Ping包。
ICMP协议是IP协议的控制部分,主要有两个作用:
- 差错通知;
- 信息查询。
从协议格式上来讲,ICMP协议是IP协议的上层协议,ICMP协议数据是作为IP协议的数据来传输的。
具体的协议格式为:
前面20个字节为IP协议头,其中通过协议字段来指示该数据包为ICMP数据包。剩余的部分为ICMP协议数据,其中重要的字段为类型和代码。ICMP包用来进行差错通知和信息查询都是通过类型和代码两个字段的组合来实现的。
组合见下面的表格:
TYPE | CODE | Description | Query | Error |
0 | 0 | Echo Reply——回显应答(Ping应答) | x |
|
3 | 0 | Network Unreachable——网络不可达 |
| x |
3 | 1 | Host Unreachable——主机不可达 |
| x |
3 | 2 | Protocol Unreachable——协议不可达 |
| x |
3 | 3 | Port Unreachable——端口不可达 |
| x |
3 | 4 | Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 |
| x |
3 | 5 | Source routing failed——源站选路失败 |
| x |
3 | 6 | Destination network unknown——目的网络未知 |
| x |
3 | 7 | Destination host unknown——目的主机未知 |
| x |
3 | 8 | Source host isolated (obsolete)——源主机被隔离(作废不用) |
| x |
3 | 9 | Destination network administratively prohibited——目的网络被强制禁止 |
| x |
3 | 10 | Destination host administratively prohibited——目的主机被强制禁止 |
| x |
3 | 11 | Network unreachable for TOS——由于服务类型TOS,网络不可达 |
| x |
3 | 12 | Host unreachable for TOS——由于服务类型TOS,主机不可达 |
| x |
3 | 13 | Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 |
| x |
3 | 14 | Host precedence violation——主机越权 |
| x |
3 | 15 | Precedence cutoff in effect——优先中止生效 |
| x |
4 | 0 | Source quench——源端被关闭(基本流控制) |
|
|
5 | 0 | Redirect for network——对网络重定向 |
|
|
5 | 1 | Redirect for host——对主机重定向 |
|
|
5 | 2 | Redirect for TOS and network——对服务类型和网络重定向 |
|
|
5 | 3 | Redirect for TOS and host——对服务类型和主机重定向 |
|
|
8 | 0 | Echo request——回显请求(Ping请求) | x |
|
9 | 0 | Router advertisement——路由器通告 |
|
|
10 | 0 | Route solicitation——路由器请求 |
|
|
11 | 0 | TTL equals 0 during transit——传输期间生存时间为0 |
| x |
11 | 1 | TTL equals 0 during reassembly——在数据报组装期间生存时间为0 |
| x |
12 | 0 | IP header bad (catchall error)——坏的IP首部(包括各种差错) |
| x |
12 | 1 | Required options missing——缺少必需的选项 |
| x |
13 | 0 | Timestamp request (obsolete)——时间戳请求(作废不用) | x |
|
14 |
| Timestamp reply (obsolete)——时间戳应答(作废不用) | x |
|
15 | 0 | Information request (obsolete)——信息请求(作废不用) | x |
|
16 | 0 | Information reply (obsolete)——信息应答(作废不用) | x |
|
17 | 0 | Address mask request——地址掩码请求 | x |
|
18 | 0 | Address mask reply——地址掩码应答 | x |
下面我们使用WireShark抓包软件抓取Ping包过程中的ICMP包进行分析,首先我们选择Ping包的目的地址,目的地址选择百度的服务器,通过在终端中运行“ping www.baidu.com”找到百度服务器的地址。百度服务器的地址为“36.152.44.95”,然后在WireShark中设置过滤条件“ip.dst==36.152.44.95 or ip.src==36.152.44.95“。
然后在终端中进行ping包,抓取的数据包如下:
其中我的电脑的地址为192.168.2.127。
我们先分析下上面的第一个数据包,该数据包的Type为8,Code为0,根据上面的表格可以知道这个是一个回显请求包。
接着分析下第二个数据包,该数据包的Type为0,Code为0,根据上面的表格可以知道这个是一个回显应答包。可以看出这个数据包为上一个数据包的Ping回包。
可以进一步看下Ping包中的data字段,可以看到请求包和回包中的data字段是一样的,从协议中可以看出,这个data字段是随机的数据。