ICMP在IP系统间传递差错和管理报文,是不论什么IP实现必须和要求的组成部分。能够把ICMP分成两类:差错和查询。查询报文

是用一对请求和回答定义的。差错报文通常包括了引起错误的IP包的第一个分片的IP首部(和选项),加上该分片数据部分

的前8个字节。

下图显示了全部眼下定义的ICMP报文。双线上面的是请求和回答报文,双线以下的是差错报文。

PRC_栏显示了Net/3处理的与协议无关的差错码和ICMP报文之间的映射。对请求和回答,这一列是空的。由于在这样的情况

下不会产生差错。假设对一个ICMP差错,这一行为空。说明Net/3不识别该码,并自己主动丢弃该差错报文。

1.icmp结构

Net/3通过下图中的icmp结构訪问某个ICMP报文。

icmp_type标识特定报文,icmp_code进一步制定报文。icmp_cksum的算法与IP首部检验和同样。

联合icmp_hun(首部联合)和icmp_dun(数据联合)依照icmp_type和icmp_code訪问多种icmp报文。每一个icmp报文都使用

icmphun。仅仅有一部分报文使用icmp_dun。没有使用的字段必须设置为0.

icmp报文时封装在IP数据报中的。

2.ICMP的protosw结构

inetsw[4]的protosw结构描写叙述了icmp,并支持内核和进程对协议的訪问。

下图显示了该结构。

ipintr对数据报进行分用是依据IP首部中的传输协议编号ip_p。对于ICMP报文,ip_p是1。通过ip_protox选择inetsw[4]。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

3.输入处理:icmp_input函数

当一个icmp报文到达时,IP层通过inetsw[4]的pr_input函数,间接调用icmp_input。

在icmp_input中,每个ICMP报文被处理3次:被icmp_input处理一次;被与ICMP差错报文中的IP分组相关联的传输层协

议处理一次。被记录收到ICMP报文的进程处理一次。

ICMP输入处理过程的总的构成情况例如以下:

以下分五部分讨论icmp_input:

1.验证收到的报文

2.icmp差错报文

3.icmp请求报文

4.icmp重定向报文

5.icmp回答报文

函数大致流程例如以下:

推断icmp的报文长度。假设太短。就直接丢弃

icmp包结构中包括校验和字段。使用该字段检查icmp的校验和

推断icmp的报文类型,假设可以识别,依据报文类型运行对应操作。假设无法识别。则直接运行raw操作rip_input

运行raw操作rip_input,rip_input依据报文里含有的协议及源站和目的地址信息,把报文公布给正在监听的进程。

3.1.差错报文处理

当主机发出的数据报无法成功提交给目的主机时。目的主机或中间的路由器生成这些报文,并将它们返回到原来的系统。

下图显示了多种ICMP差错报文的格式:

icmp_input将icmp_type和icmp_code映射到一个协议无关的差错集码上,该差错码是由PRC_常量表示的,且PRC_常量是有

顺序的。

例如以下图所看到的:

然后icmp_input调用传输层协议的pr_ctlinput函数。该函数依据原始数据报的ip_p,把分组分用到正确的协议,从而构造

出原始的IP数据报。

3.2.请求处理

Net/3响应具有正确格式的ICMP请求报文。把无效的ICMP请求报文传给rip_input。除路由器通告报文外,大多数Net/3所接收

的ICMP请求报文都生成回答报文。

为避免回答报文分配新的mbuf,icmp_input把请求报文的缓存转成成回答缓存,并返回给

发送方。

3.2.1.回显询问:ICMP_ECHO和ICMP_ECHOREPLY

ping程序就是使用了回显询问请求。

下图是ICMP回显请求和回答报文的结构。

icmp_code总是0,icmp_id和icmp_seq设置成请求的发送方,回答中也不做改动。源系统能够用这些字段匹配请求和回答。

icmpdata中到达的全部数据也被反射。

3.2.2.时间戳询问:ICMP_TSTAMP和ICMP_TSTAMPREPLY

ICMP时间报文例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

请求的发送方设置icmp_otime(发出请求的时间)。icmp_rtime(收到请求的时间)和icmp_ttime(发出回答的时间)由回答

的发送方设置。

全部时间都是从UTC午夜開始的毫秒数。假设时间值没有以标准单位记录,就把高位置位,与IP时间戳选项

一样。

3.2.3.地址掩码询问:ICMP_MASKREQ和ICMP_MASKREPLY

该请求能够发现某个网络上使用的子网掩码。

除非系统被明白地配置成地址掩码的授权代理,否则,RFC1122禁止向其发送掩码回答。这样就避免系统与全部向它发送请求

的系统共享不对的地址掩码。假设没有管理员授权回答,系统也要忽略地址掩码请求。

ICMP地址掩码请求和回答例如以下图所看到的:

3.2.4.信息查询:ICMP_IREQ和ICMP_IREQREPLY

ICMP信息报文已经过时。它们企图广播一个源和目的站地址字段的网络部分为全0的请求,使系统发现连接的IP网络的数量。

响应该请求的主机将返回一个填好网络号的报文,主机还须要其它办法找到地址的主机部分。

3.2.5.路由器发现:ICMP_ROUTERADVERT和ICMP_ROUTESOLICIT

RFC1256定义了ICMP路由器发现报文,Net/3内核不直接处理这些报文,而由rip_input把它们传给一个用户级守护程序,由它

发送和响应这样的报文。

3.3.重定向处理

下图显示了ICMP重定向报文的格式。

重定向信息被传给rtredirect,由这个函数更新路由表。重定向的目的地址被传给pfctlinput,由它通告重定向的全部协议域。使

协议有机会把缓存的到目的站的路由作废。

3.4.回答处理

内核从不处理不论什么ICMP回答报文,ICMP请求由进程产生,内核从不产生请求。所以内核把它接收的全部回答传给等待ICMP

报文的进程。内核直接将报文传给rip_input交给传输层进行处理。

3.5.输出处理

有几种方法产生外出的报文。IP调用icmp_error来产生和发送ICMP差错报文。icmp_reflect发送回答报文。

同一时候,进程也可能

通过原始ICMP协议生成ICMP报文。

下图显示了这些函数与ICMP外出处理之间的关系。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

3.6.icmp_sysctl函数

IP的icmp_sysctl函数仅仅支持下图中列出的选项。

系统管理员能够用sysctl程序改动该选项。

《TCP/IP具体解释卷2:实现》笔记--ICMP:Internet控制报文协议的更多相关文章

  1. 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  2. TCP/IP详解学习笔记(5)-- ICMP:internet 控制报文协议

    1.概述      ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制 ...

  3. 《TCP/IP 详解 卷1:协议》第 8 章:Internet 控制报文协议

    路由器是 Internet 的重要组成部分,严密监视 Internet 的操作.IP 协议未给发送失败的 IP 数据包提供一种错误处理,也没有给端系统提供直接的方法来发现错误.为了解决这一不足之处,I ...

  4. TCP/IP详解 卷一(第六章 ICMP:Internet控制报文协议)

    ICMP是(Internet Control Message Protocol)Internet控制报文协议. 用于在IP主机.路由器之间传递控制消息.控制消息是指网络通不通.主机是否可达.路由是否可 ...

  5. TCP/IP 笔记 - ICMPv4和ICMPv6 : Internet控制报文协议

    ICMP是一种面向无连接的协议,负责传递可能需要注意的差错和控制报文,差错指示通信网络是否存在错误(如目的主机无法到达.IP路由器无法正常传输数据包等.注意,路由器缓冲区溢出导致的丢包不包括在ICMP ...

  6. 《TCP/IP具体解释卷2:实现》笔记--IP多播

    D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组. 单个网络上的组成员利用IGMP协议在系统之间通信. 多播路由器用多播选录协议. ...

  7. 《TCP/IP具体解释卷2:实现》笔记--接口层

    接口层包含在本地网上发送和接收分组的硬件与软件. 我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口. Net/3接口层试图在网络协议和连接到一 ...

  8. 《TCP/IP具体解释卷2:实现》笔记--协议控制块

    协议层使用协议控制块(PCB)存放各UDP和TCP插口所要求的多个信息片.Internet协议维护Internet协议控制块 (internet protocol control block)和TCP ...

  9. 《TCP/IP详解卷1:协议》——第6章 ICMP:Internet控制报文协议(转载)

    1.引言 ICMP被认为是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息.ICMP报文通常被IP层或更高层协议(TCP或UDP)使用.一些ICMP报文把差错报文返回给用户进程. ICMP报 ...

随机推荐

  1. java基础43 IO流技术(输入字节流/缓冲输入字节流)

    通过File对象可以读取文件或者文件夹的属性数据,如果要读取文件的内容数据,那么我们就要使用IO技术. 一.输入字节流 输入字节流的体系:  -------| InputStream:所有输入字节流的 ...

  2. YUI Compressor 压缩 JavaScript 原理-《转载》

    YUI Compressor 压缩 JavaScript 的内容包括: 移除注释 移除额外的空格 细微优化 标识符替换(Identifier Replacement) YUI Compressor包括 ...

  3. poj 3270(置换群+贪心)

    Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6993   Accepted: 2754 Descr ...

  4. 编程六月定律 | 外刊IT评论网

    编程六月定律 上周,我被迫对一个很老的项目做一些修改.麻烦是,当开始着手时,我真的记不清这个项目究竟有多老了. 这实际上是我使用Codeigniter实现的第一个MVC项目.打开项目文件后,很多东西都 ...

  5. 毕设demo写好

    2015年1月20日 14:41:47 阶段性暂停!! 把运行结果截图给了老师,老师说先整理下文档,然后下学期来了再部署到服务器上. 那么,下学期来了,估计也要把Epm和CR1000什么的搞好了. 先 ...

  6. DDD领域模型企业级系统(一)

    领域模型的基本构造块: 1.实体(Entity):有业务生命周期,使用标识进行跟踪. 2.值对象(Value Object):无业务生命周期,用来描述实体. 3.服务(Service):无状态的行为类 ...

  7. Pg168—2题 修改

    package org.hanqi.pn0120; public class JuXing { JuXing(double chang,double kuan) { this.chang=chang; ...

  8. mysql 5.1 下载地址 百度云网盘下载

    mysql 百度云下载 链接: https://pan.baidu.com/s/1fPSEcgtDN7aU2oQ_sL08Ww 提取码: 关注公众号[GitHubCN]回复2539获取

  9. s12-day01-work01用户登录接口

    README # README.md # day001-work-1 @南非波波 功能实现:登录接口 流程图: ![](http://i.imgur.com/61eFd0u.jpg) 程序实现: 1. ...

  10. ASP.NET:MVC中文件上传与地址变化处理

    目录 文件的上传和路径处理必须解决下面列出的实际问题: 1.重复文件处理 2.单独文件上传 3.编辑器中文件上传 4.处理文章中的图片路径 5.处理上传地址的变化 一.上传文件和重复文件处理 文件处理 ...