《TCP/IP具体解释卷2:实现》笔记–ICMP:Internet控制报文协议

《TCP/IP具体解释卷2:实现》笔记–ICMP:Internet控制报文协议

大家好,又见面了,我是全栈君。

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

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

的前8个字节。

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

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

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

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

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

1.icmp结构

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

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

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

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,并支持内核和进程对协议的訪问。

下图显示了该结构。

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

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

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

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

3.输入处理:icmp_input函数

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

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

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

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

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

以下分五部分讨论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差错报文的格式:

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

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

顺序的。

例如以下图所看到的:

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

然后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回显请求和回答报文的结构。

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

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

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

3.2.2.时间戳询问:ICMP_TSTAMP和ICMP_TSTAMPREPLY

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

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

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

的发送方设置。

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

一样。

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

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

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

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

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

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

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重定向报文的格式。

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

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

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

3.4.回答处理

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

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

3.5.输出处理

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

同一时候,进程也可能

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

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

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

3.6.icmp_sysctl函数

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115311.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • hybrid app开发教程_公司员工大会历程分享

    hybrid app开发教程_公司员工大会历程分享关于这个话题,本文并不准备详述移动开发相关的一些通用技术,例如:viewport、rem、flexbox、媒体查询等。这里主要讲述我们的hybrid产品策略、开发流程与规范、性能优化以及我们踩过的坑。而往往就是这些,网上相关的资料相对比较匮乏的,又缺少类似经验文章,所以希望通过此篇文章,跟大家分享一些魅族团队关于hybrid产品开发的经验。产品背景我们希望这一类产品具备比较强大的

  • 目前主流的app开发方式

    目前主流的app开发方式移动应用开发三种方式比较随着H5标准的发布以及推广,使得移动应用的开发也受到了很大影响,出于效率、成本等等的原因,移动应用的开发不在完全依赖于“原生”。今天就简单总结一下目前的三大主流移动应用开发类型。APP,一般认为是mobileapplication,也就是移动移动应用程序。1.NativeApp:本地应用程序(原生App)NativeApp是一种基于智能手…

  • windows搭建php环境_如何安装php环境

    windows搭建php环境_如何安装php环境使用apache+php+mysql的方式一、安装mysql1、下载mysql,下载地址:https://dev.mysql.com/downloads/installer/2、下载完成后解压我解压的路径是:D:\ProgramFiles\mysql-8.0.253、配置文件首先在解压的路径下查看是否含有my.ini的文件,如果没有则新建一个,内容如下:[mysqld]#设置3306端口port=3306#设置mysql的安装目录basedir=D:\ProgramFiles\

  • storm kafka_kafka poll timeout

    storm kafka_kafka poll timeouthttp://blog.csdn.net/liuxinghao/article/details/50553060

    2022年10月14日
  • python 初中课程_8年级将新增Python课程内容

    python 初中课程_8年级将新增Python课程内容从2020年9月1日开始,浙江3~9年级信息技术课程将替换新的教材。其中变化较大的是,8年级将新增Python课程内容。这也就意味着:从今天起,Python正式成为浙江中学生信息技术必修课!新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法。网友们直呼:我连Excel都还没整明白,人家后浪们就开始学Python了。从的教材目录上我们可以看到,不止是初中,从小学阶段开始…

  • C++语法篇之STL库[通俗易懂]

    C++语法篇之STL库[通俗易懂]STL是StandardTemplateLibrary的缩写,即标准模板库。之前在写Templates模板的时候,提到过STL对于模板的应用。STL是由多个模板类构成,能够为开发者提供通用的数据结构和算法。STL主要包含以下内容:一个简单的vector示例:创建int类型的向量,并实现初始化、赋值和打印操作。输出结果:从上边的例子可以体现出vector的健壮性,vector是一个动态的数组模板,可以在程序运行过程中高效地添加或者删除元素,为程序设计提供了很大的灵活性。最后,关于STL还有很

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号