92-ICMP 协议(基础)

来源:互联网 发布:简单c语言程序代码 编辑:程序博客网 时间:2024/06/05 06:04

ICMP 协议(Internet Control Messages Protocol,网际控制报文协议)是网络层最重要的协议之一。前面的实验我们也看到了,它由 IP 协议承载,封装在 IP 协议的数据部分。


这里写图片描述
图1 ICMP 被封装在 IP 数据报的数据部分

1. ICMP 报文的作用

网络上经常会出现一些错误,比如目标主机不存在,目标端口不存在什么的,那么你要怎么知道呢?ICMP 的功能之一就是将错误反馈给你,这种 ICMP 报文通常被称为差错报文,表示网络出问题啦!

当然,ICMP 还有其它的功能,比如你发送一个时间戳请求 ICMP 报文给一台主机,那台主机知道这是请求时间的,就会把自己的时间放在 ICMP 报文中,然后再发回去给你,像这种 ICMP 报文称为 ICMP 查询报文和 ICMP 应答报文。

还有一种就是用于控制网络行为的,比如路由重定向啊等等。

当然啦,上面只是粗略的分类,后面我们写程序来练习。

2. ICMP 首部

2.1 ICMP 首部格式


这里写图片描述
图2 ICMP 首部格式

任何 ICMP 报文的首 4 字节的格式都是一样的,如图 2 所示。我们程序在收到了 ICMP 报文的时候,可以根据 ICMP 的类型,代码号来判断这个 ICMP 报文是哪个类别。

比如类型号是 3,表示这是差错报文,具体到是哪种差错报文,还要看 8 位代码号。如果类型号是 13 表示这是一个时间戳请求报文等等。

2.2 ICMP 结构体

按照图 2 中给出的首部,我们很容易写了 ICMP 的结构体。该结构体定义在系统的头文件 /usr/include/netinet/ip_icmp.h 中。为了方便学习,我在 unp/program/include/icmp.h 中重新定义了它,以后我们写程序的时候,包含 include/icmp.h 即可。

// icmp 头部struct icmp {                    uint8_t icmp_type;             uint8_t icmp_code;             uint16_t icmp_cksum;           // 不同类型的 icmp 报文,后面都不一样};

3. 常见的 ICMP 报文类型

我列举的几个,是我们将要学习的几种(用 type 表示类型,code 表示代码号):

  • ICMP 回显与应答(type = 8或0,code = 0)
  • ICMP 地址掩码请求与应答(type = 17或18,code = 0,已废弃,如今已使用 DHCP 协议取代,参考 RFC 6918 的 2.4 和 2.5 小节.)
  • ICMP 时间戳请求与应答(type = 13或14,code = 0)
  • ICMP 端口不可达差错报文(type = 3,code = 3)

还有很多其它类型的 ICMP 报文,这里就不细讲了。《TCP/IP 详细》一书的第 6 章对此描述的非常清楚,大家可以去看。

4. 总结

  • 掌握 ICMP 首部格式
  • 知道 ICMP 报文是根据什么分类的

练习:尝试着解析一个 ICMP 报文,并打印它的 type、code 和 cksum 字段。

原创粉丝点击