首页 > 其他分享 >3.2 ICMPv4 报文和报文类型

3.2 ICMPv4 报文和报文类型

时间:2024-04-05 18:01:08浏览次数:22  
标签:ICMP 报文 ICMPv4 handler 3.2 discard icmp

目录

3.2 ICMPv4 报文和报文类型

1. ICMPv4 报头

ICMPv4 是基于IP协议的。所以在 ICMPv4 的报文外面,还有一层 IP 报文格式。

image-20240319205705802

ICMPv4 报头struct icmphdr类型(8位)代码(8位)校验和(16位)可变部分(32位)组成。

image-20240319210559594

struct icmphdr {
  __u8		type;
  __u8		code;
  __sum16	checksum;
  union {
	struct {
		__be16	id;
		__be16	sequence;
	} echo;
	__be32	gateway;
	struct {
		__be16	__unused;
		__be16	mtu;
	} frag;
	__u8	reserved[4];
  } un;
};

在 ICMPv4 的报头中,typecode的组合构成了 ICMPv4 的各种报文类型。其它的字段则是不同的报文类型所携带的私有属性。下面将通过type和code的不同组合,先来整体的了解以下,icmp所能传达的信息。

2. ICMPv4报文类型

image-20240325163422715

在这张图中,报文类型分为2类:查询差错

查询报文,顾名思义,它并不是发生了错误而产生,它是为了在网路中获取数据。最常用的就是 Type 0Type 8 ping服务。

差错报文,当网路中发生错误信息时,将被发送出去。最常用的就是Type 3不可达差错和Type 11 超时差错。

ICMPv4 有一个结构体struct icmp_control 来描述ICMPv4处理函数。

struct icmp_control {
	bool (*handler)(struct sk_buff *skb); //处理函数
	short error; // 用来标记是否是错误信息
};

在文章开头提到,ICMPv4信息,有2个作用,一个是信息消息,一个是错误消息,在ICMPv4中,error注册为1的为错误消息。(ICMPv6则用bit位来表示)

在ICMPv4中记录消息类型处理的数组是icmp_pointers[NR_ICMP_TYPES + 1] 详见附录1.

以下是每个服务所对应的处理函数:

typeID 消息类型 处理函数 错误消息 信息消息
0 ICMP_ECHOREPLY ping_rcv x
3 ICMP_DEST_UNREACH icmp_unreach x
4 ICMP_SOURCE_QUENCH icmp_unreach x
5 ICMP_REDIRECT icmp_redirect x
8 ICMP_ECHO icmp_echo x
11 ICMP_TIME_EXCEEDED icmp_unreach x
12 ICMP_PARAMETERPROB icmp_unreach x
13 ICMP_TIMESTAMP icmp_timestamp x
14 ICMP_TIMESTAMPREPLY icmp_discard x
15 ICMP_INFO_REQUEST(作废) icmp_discard x
16 ICMP_INFO_REPLY(作废) icmp_discard x
17 ICMP_ADDRESS icmp_discard x
18 ICMP_ADDRESSREPLY icmp_discard x

处理函数进行归纳有:

  • 查询处理:ping_rcv() \ icmp_echo() \ icmp_timestamp()
  • 差错处理:icmp_unreach() \ icmp_redirect()
  • 不做处理:icmp_discard()

他们的功能如下:

  • ping_rcv 负责处理接收ping应答(ICMP_ECHOREPLY)。
  • icmp_echo 处理回应ping请求。(ICMP_ECHO)
  • icmp_timestamp 用来处理ICMP时间戳请求(ICMP_TIMESTAMP)。
  • icmp_unreach 消息不可达的消息类型。在很多情况下都会发送(ICMP_DEST_UNREACH).
  • icmp_redirect 处理重定向消息(ICMP_REDIRECT)。
  • icmp_discard 这是一个空处理函数。用于不存在的消息类型不需要做任何处理的消息。

下文我们将对如何接收一个ICMPv4报文做出描述。

3. 附录

附录1. ICMP消息处理数组:

static const struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = {
	[ICMP_ECHOREPLY] = {
		.handler = ping_rcv,
	},
	[1] = {
		.handler = icmp_discard,
		.error = 1,
	},
	[2] = {
		.handler = icmp_discard,
		.error = 1,
	},
	[ICMP_DEST_UNREACH] = {
		.handler = icmp_unreach,
		.error = 1,
	},
	[ICMP_SOURCE_QUENCH] = {
		.handler = icmp_unreach,
		.error = 1,
	},
	[ICMP_REDIRECT] = {
		.handler = icmp_redirect,
		.error = 1,
	},
	[6] = {
		.handler = icmp_discard,
		.error = 1,
	},
	[7] = {
		.handler = icmp_discard,
		.error = 1,
	},
	[ICMP_ECHO] = {
		.handler = icmp_echo,
	},
	[9] = {
		.handler = icmp_discard,
		.error = 1,
	},
	[10] = {
		.handler = icmp_discard,
		.error = 1,
	},
	[ICMP_TIME_EXCEEDED] = {
		.handler = icmp_unreach,
		.error = 1,
	},
	[ICMP_PARAMETERPROB] = {
		.handler = icmp_unreach,
		.error = 1,
	},
	[ICMP_TIMESTAMP] = {
		.handler = icmp_timestamp,
	},
	[ICMP_TIMESTAMPREPLY] = {
		.handler = icmp_discard,
	},
	[ICMP_INFO_REQUEST] = {
		.handler = icmp_discard,
	},
	[ICMP_INFO_REPLY] = {
		.handler = icmp_discard,
	},
	[ICMP_ADDRESS] = {
		.handler = icmp_discard,
	},
	[ICMP_ADDRESSREPLY] = {
		.handler = icmp_discard,
	},
};

标签:ICMP,报文,ICMPv4,handler,3.2,discard,icmp
From: https://www.cnblogs.com/kmist/p/18116006

相关文章

  • 3.3 ICMPv4 数据包的接收和发送
    目录3.3ICMPv4数据包的接收和发送1.接收ICMPv4数据包2.ICMPv4报文处理2.1ping请求和应答2.2时间戳请求与应答2.3地址掩码请求和回应2.4消息不可达信息的回应与请求2.4.1消息不可达信息的处理2.4.2消息不可达信息的发送情况2.5网关发出的重定向2.6时间戳超时信息3.IC......
  • 3.28
    这个任务中,你需要实现前端上传Excel文件,然后将文件传输到后端,后端再将Excel文件解析并将数据插入数据库。下面是一种可能的实现方法:前端(Vue.js):使用 <el-upload> 组件实现文件上传功能,并绑定一个上传文件的事件。通过Axios或其他方式将上传的Excel文件发送到后端。......
  • 3.2 标准库类型string
    3.2标准库类型string标准库类型string代表了一个可变长度的字符序列,是C++中用于处理文本数据的主要方式。为了使用string类型,首先必须包含string头文件:#include<string>usingstd::string;这种类型作为标准库的一部分,被定义在std命名空间中,这意味着你可以使用std::str......
  • 如何查看java代码编写的soap请求报文头信息
    在浏览器中打开接口地址,点击浏览器中的插件查看接口点击具体方法之后可以看到请求报文头工具如下: ......
  • acwing算法基础课学习记录2(2024.3.29)
    对昨日的补充朴素dijkstra算法模板:1.dist[i]=+INFdist[1]=02.fori1~nn次t<-不在s中的距离最近的点(s:当前已经确定最短距离的点存储在内)n次s<-tn次用t更新其他点的距离总共m次堆优化版dij......
  • 界面组件DevExpress WinForms v23.2 - 进一步增强HTML & CSS支持
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!DevExpressWinForms控件日前正式发布了v23.2,此......
  • 就业班 第二阶段 2401--3.29 day9 shell之正则+数组
    九、shell编程-数组普通数组:只能用整数作为数组的索引关联数组:可以使用字符串作为数组的索引数组定义普通数组定义:[root@newrainshell]#books=(linuxshellawksed) 引用:[root@newrainshell]#echo${books[0]}linux[root@newrainshell]#echo${books......
  • 就业班 第二阶段 2401--3.28 day8 shell之循环控制
    七、shell编程-循环结构shell循环-for语句foriin{取值范围}  #for关键字i变量名in关键字取值范围格式12345do          #do循环体的开始循环体done         #done循环体的结束#!/usr/......
  • 常见面试算法题-报文解压缩
    ■ 题目描述为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。压缩规则:n[str],表示方括号内部的str正好重复n次。注意n为正整数(0<n<=100),str只包含小写英文字母,不考虑异常情况。输入描述:输入压缩后的报文:1)不考......
  • 3.26
    所花时间:4h代码行:300博客量:2学到的知识:创建Web服务:在服务器端创建一个Web服务,用于处理Android应用程序发送过来的请求,并与MySQL数据库进行交互。配置网络权限:在Android应用程序的清单文件(AndroidManifest.xml)中添加网络权限,以允许应用程序与Web服务进行通信。示例代码如......