icmp 订阅
ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 [1]  ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。 [2] 展开全文
ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 [1]  ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。 [2]
信息
协议族
TCP/IP协议族
类    型
控制报文协议
作    用
在主机与路由器之间传递控制信息
中文名
ICMP
归    属
网络层协议
外文名
Internet Control Message Protocol
ICMP简介
ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。 [3]  它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。 [1]  从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过ICMP向数据包的源端报告有关事件。其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP重定向),资料流量控制。ICMP在沟通之中,主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连线状况。ICMP 是个非常有用的协议﹐尤其是当我们要对网路连接状况进行判断的时候。 [3] 
收起全文
精华内容
下载资源
问答
  • ICMP

    2018-01-08 17:39:19
    ICMP Internet Control Message Protocol 网络控制消息协议 作用: 1.ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更...
    ICMP   Internet Control Message Protocol 网络控制消息协议
    
    作用:
    1.ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。

    2.   ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据报发送出去。


    报文分类:
    ICMP 差错报告报文、ICMP 查询报文。
    报文结构:






    CMP差错报文(56字节)-----------------------------------------------------------------
    发生情况:
    1>  终点不可达:分为:网络不可达,主机不可达,协议不可达,端口不可达,需要分片但DF比特已置为1,以及源路由失败等六种情况,其代码字段分别置为0至5。当出现以上六种情况时就向源站发送终点不可达报文。
    说明:
    端口不可达:UDP的规则之一是:如果收到UDP数据报而且目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文。
    2>  源站抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源站发送源站抑制报文,使源站知道应当将数据报的发送速率放慢。
    3>  时间超时:当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源站发送时间超过报文。当目的站在预先规定的时间内不能收到一个数据报的全部数据报片时,就将已收到的数据报片都丢弃,并向源站发送时间超过报文。
    4>  参数问题:当路由器或目的主机收到的数据报的首部中的字段的值不正确时,就丢弃该数据报,并向源站发送参数问题报文。
    5>  改变路由(重定向)路由器将改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器。

    以下几种情况都 不会导致产生ICMP差错报文
    1>ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)
    2>目的地址是广播地址或多播地址的IP数据报
    3>作为链路层广播的数据报
    4>不是IP分片的第一片
    5>源地址不是单个主机的数据报。即源地址不能为零地址、环回地址、广播地址或多播地址。
    这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。

    ICMP查询报文(40字节)-------------------------------------------------------------------
    1> ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的机器必须给源主机发送ICMP回送应答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
    2> ICMP时间戳请求允许系统向另一个系统查询当前的时间。该ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间只能提供秒级的分辨率。请求端填写发起时间,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。大多数的实现是把后面两个字段都设成相同的值。
    3>主机使用 ICMP地址掩码请求报文可向子网掩码服务器得到某个接口的地址掩码。系统广播它的ICMP请求报文。ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回,这样,发送端就可以把应答与请求进行匹配。
    4>主机使用 ICMP路由器询问和通过报文可了解连接在本网络上的路由器是否正常工作。主机将路由器询问报文进行广播(或多播)。收到询问报文的一个或几个路由器就使用路由器通过报文广播其路由选择信息

    常用场景:
    ping程序
    作用:
    1>Ping程序是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。
    2>Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有多远。
    详情:
    1>Unix系统在实现ping程序时把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息。
    2>序列号从0开始,每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失,失序或重复。.
    3>ping程序通过在ICMP报文中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。
    4>当返回ICMP回显应答时,要打印出序列号和TTL,并计算往返时间。TTL位于IP首部的生存时间字段。ping程序通过在ICMP报文数据段中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。

    问题:
    可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定,向主机发起“Ping of Death”(死亡之Ping)攻击。
    “Ping of Death” 攻击的原理是:如果ICMP数据包的尺寸超过64KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。
    此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”,使得目标主机耗费大量的CPU资源处理。
    解决:
    1.在路由器上对ICMP数据包进行带宽限制,将ICMP占用的带宽控制在一定的范围内,这样即使有ICMP攻击,它所占用的带宽也是非常有限的,对整个网络的影响非常少;第2.在主机上设置ICMP数据包的处理规则,最好是设定拒绝所有的ICMP数据包。
    设置ICMP数据包处理规则的方法也有两种,一种是在操作系统上设置包过滤,另一种是在主机上安装防火墙。

    traceroute程序:
    作用:
    1.traceroute是用来侦测主机到目的主机所经路由情况的工具,可以获取到所经路由器的IP地址。
     2.traceroute的另外一个作用是确定路径MTU。要做的就是发送分组,并设置“不分片”标志。发送的第一个分组的长度正好与出口MTU相等,每次收到ICMP“不能分片”差错时就减小分组的长度。
    traceroute的工作原理:
    收到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动将TTL减1.而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据包给主机。主机收到这个数据包以后就发送一个TTL=2的数据包给主机,然后刺激第二个路由器给主机发送ICMP数据包,如此反复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP,从而避免了IP头只能记录有限的路由IP 的问题。
       怎么知道UDP到没到达目的主机,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较 小的端口,比如说80,比如说23,等等。而traceroute发送的是端口号>30000的UDP报,所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了。
    linux下的tracert不一样,它的原理就是从ttl=1一直发送到一个很大的TTL值,如18或更大。每个TTL值也将发送三个请求回显,这样中间路由器将很快将数据包回复到目标主机,然后根据序列号值匹配数据流情况,将成功回显。速度非常快  linux下的traceroute是用的UDP协议(端口号33434-33463),TTL也是从1增加的。可以实现同样的路由跟踪功能,不过它收到的回复报文是类型3,代码3,即目标端口不可达。

    展开全文
  • ICMP

    2008-08-04 13:57:00
    ICMP 开放分类: 网络、网络协议英文原义:Internet Control Message Protocol中文释义:(RFC-792)Internet控制消息协议注解:该协议是TCP/IP协议集中的一个子协议,属于网络层协议,主要用于在主机与路由器之间...
    ICMP
    开放分类: 网络网络协议
    英文原义:Internet Control Message Protocol

    中文释义:(RFC-792)Internet控制消息协议

    注解:该协议是TCP/IP协议集中的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。我们可以通过Ping命令发送ICMP回应请求消息并记录收到ICMP回应回复消息,通过这些消息来对网络或主机的故障提供参考依据。

    应 用:要使用该协议,我们可以进行相应的ICMP设置,比如在Windows XP中,首先打开“网络连接”,右键单击启用Internet连接防火墙的“网络连接”,选择“属性”打开属性窗口。接着,选择“高级”选项卡,单击右下角“设置”按钮。然后,在高级设置窗口中选择“ICMP”选项卡,在其中就可以进行相应的设置,包括允许传入的回显请求等。


    ICMP是“Internet Control Message Protocol”(Internet控制消息协议)的缩写。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
    我们在网络中经常会使用到ICMP协议,只不过我们觉察不到而已。比如我们经常使用的用于检查网络通不通的Ping命令,这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。

    ICMP的重要性

    ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机. 例如,在1999年8月海信集团“悬赏”50万元人民币测试防火墙的过程中,其防火墙遭受到的ICMP攻击达334050次之多,占整个攻击总数的90%以上!可见,ICMP的重要性绝不可以忽视!

    比如,可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定,向主机发起“Ping of Death”(死亡之Ping)攻击。“Ping of Death” 攻击的原理是:如果ICMP数据包的尺寸超过64KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。

    此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”,使得目标主机耗费大量的CPU资源处理,疲于奔命。

    应对ICMP攻击

    虽然ICMP协议给黑客以可乘之机,但是ICMP攻击也并非无药可医。只要在日常网络管理中未雨绸缪,提前做好准备,就可以有效地避免ICMP攻击造成的损失。

    对于“Ping of Death”攻击,可以采取两种方法进行防范:第一种方法是在路由器上对ICMP数据包进行带宽限制,将ICMP占用的带宽控制在一定的范围内,这样即使有ICMP攻击,它所占用的带宽也是非常有限的,对整个网络的影响非常少;第二种方法就是在主机上设置ICMP数据包的处理规则,最好是设定拒绝所有的ICMP数据包。

    设置ICMP数据包处理规则的方法也有两种,一种是在操作系统上设置包过滤,另一种是在主机上安装防火墙。



    Vista系统常用英文专业词语

    ICMP,互联网控制信息协议(Internet CONTROL Message Protocol),用于错误报告和调试。ICMP回应请求,并回应流行的Ping命令所使用的回复信息。




    ICMP报文格式
    ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文(见图表,ICMP报文的结构和几种常见的ICMP报文格式),IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。RFC定义了13种ICMP报文格式,具体如下:
    类型代码 类型描述
    0 响应应答(ECHO-REPLY)
    3 不可到达
    4 源抑制
    5 重定向
    8 响应请求(ECHO-REQUEST)
    11 超时
    12 参数失灵
    13 时间戳请求
    14 时间戳应答
    15 信息请求(*已作废)
    16 信息应答(*已作废)
    17 地址掩码请求
    18 地址掩码应答
    其中代码为15、16的信息报文已经作废。
    下面是几种常见的ICMP报文:
    1.响应请求
    我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。
    2.目标不可到达、源抑制和超时报文
    这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。
    3.时间戳
    时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。

    如果您认为本词条还有待完善,需要补充新内容或修改错误内容,请 编辑词条
    展开全文
  • ICMP协议详解

    万次阅读 多人点赞 2018-05-30 18:51:00
    ICMP协议详解 ICMP协议是一个网络层协议。 一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。 ...

    ICMP协议详解

    ICMP协议是一个网络层协议。
    一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。
    所以我们就需要一种协议来完成这样的功能–ICMP协议。

    ICMP协议的功能

    ICMP协议的功能主要有:
    1. 确认IP包是否成功到达目标地址
    2. 通知在发送过程中IP包被丢弃的原因
    如下图所示:
    这里写图片描述
    我们需要注意几点:
    1.ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议
    2. ICMP只能搭配IPv4使用,如果是IPv6的情况下, 需要是用ICMPv6

    ICMP的报文格式

    ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。ICMP报头如下图所示。
    如下图:
    这里写图片描述
    字段说明:

    类型说明
    类型占一字节,标识ICMP报文的类型,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文
    代码占一字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型
    校验和这是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错(其计算方法与在我们介绍IP报头中的校验和计算方法是一样的)

    ICMP大概分为两类报文:
    一类是通知出错原因 ;一类是用于诊断查询
    类型及含义如下:

    类型(十进制)内容
    0回送应答
    3目标不可达
    4原点抑制
    5重定向或改变路由
    8回送请求
    9路由器公告
    10路由器请求
    11超时
    17地址子网请求
    18地址子网应答

    常见的ICMP报文

    相应请求

    我们用的ping操作中就包括了相应请求(类型字段值为8)和应答(类型字段值为0)ICMP报文。
    过程:
    一台主机向一个节点发送一个类型字段值为8的ICMP报文,如果途中没有异常(如果没有被路由丢弃,目标不回应ICMP或者传输失败),则目标返回类型字段值为0的ICMP报文,说明这台主机存在。

    目标不可达,源抑制和超时报文

    这三种报文的格式是一样的。
    (1)目标不可到达报文(类型值为3)在路由器或者主机不能传递数据时使用。
    例如:我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回类型字段值3、代码字段值为3的ICMP报文。
    常见的不可到达类型还有网络不可到达(代码字段值为0)、主机不可达到(代码字段值为1)、协议不可到达(代码字段值为2)等等。
    (2)源抑制报文(类型字段值为4,代码字段值为0)则充当一个控制流量的角色,通知主机减少数据报流量。由于ICMP没有回复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。
    (3)无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定的时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。
    超时报文(类型字段值为11)的代码域有两种取值:代码字段值为0表示传输超时,代码字段值为1表示分段重组超时。

    时间戳请求

    时间戳请求报文(类型值字段13)和时间戳应答报文(类型值字段14)用于测试两台主机之间数据报来回一次的传输时间。
    传输时,主机填充原始时间戳,接受方收到请求后填充接受时间戳后以类型值字段14的报文格式返回,发送方计算这个时间差。
    (有些系统不响应这种报文)


    ping命令

    用法如下:
    这里写图片描述
    注意, 此处 ping 的是域名,不是url,域名可以通过DNS解析成IP地址
    关于DNS可见这里写链接内容

    ping命令的功能

    (1)能验证网络的连通性
    (2)会统计响应时间和TTL(IP包中的Time To Live,生存周期)
    那么如何验证的呢?
    (1)ping命令会先发送一个 ICMP Echo Request给对端
    (2)对端接收到之后, 会返回一个ICMP Echo Reply
    (3)若没有返回,就是超时了,会认为指定的网络地址不存在。

    问题:

    telnet是23端口,ssh是22端口,那么ping是什么端口?
    答:ping命令是基于ICMP,是在网络层。
    而端口号,是传输层的内容。所以在ICMP中根本就不关注端口号这样的信息。


    traceroute

    traceroute也是基于ICMP协议实现的。
    功能:
    打印出可执行程序主机,一直到目标主机之前经历多少路由器。
    举例如下:
    这里写图片描述

    展开全文
  • 关于UDP接收icmp端口不可达(port unreachable)

    万次阅读 多人点赞 2015-02-03 17:18:34
    本篇分为3部分 1:报文格式 2:产生的原因 3:linux协议栈如何处理 ...服务器回复了一个类型为端口不可达的ICMPICMP数据部分就是请求UDP ip层及其以上的数据。 2:原因 首先原因就是接收udp报文...

    本篇分为3部分

    1:报文格式

    2:产生的原因

    3:linux协议栈如何处理

    4:应用层如何获取

    1:

    报文如下,10.30.13.1往10.30.16.10的80端口发送了一个UDP报文,80端口其实监听的是TCP。

    服务器回复了一个类型为端口不可达的ICMP,ICMP数据部分就是请求UDP ip层及其以上的数据。

    2:原因

       首先原因就是接收udp报文的服务器对应的端口没有开启UDP服务器。注意这里的描述,并不是端口没有开启服务,而是没有开启UDP服务,如果开启了TCP服务,照样也会回port unreachable。

    3:Linux内核对UDP处理:

    (1):作为服务器接受到一个UDP请求

    首先,做为服务器,当一个报文经过查路由,目的ip是上送本机的时候,经过netfilter 判决后,

    调用ip_local_deliver_finish,它根据ip头中的协议类型(TCP/UDP/ICMP/......),调用不同的4层接口函数进行处理。所以之前说了,即使开启了TCP服务,服务器建立的socket的hash和udp超找socket的hash不一致,也会回端口不可达。

    对于udp而言,handler 是udp_rcv,它直接调用了__udp4_lib_rcv,查找相应的sock,

    如果sk不存在if(sk != NULL),就回复icmp destination unreachable(这就是服务器没有对应端口接受UDP的处理流程),函数非常简单

        所以作为服务器,收到一个目的端口并未监听的报文,直接回复端口不可达。

    那么作为客户端,如何处理服务器回复的 端口不可达 报文呢?

    起始当初想法很简单,我认为,不同的协议之间是不会干涉的,即TCP和UDP直接是不会干涉的。

    何况这种不伦不类的icmp?后来想错了。

    (2)作为客户端收到ICMP端口不可达的回复

        作为客户端,端口不可达报文进入ip_local_deliver_finish,它调用icmp_rcv函数,进行处理。(其实这也是当初我认为客户端udp不会对端口不可达数据进行相应的原因,因为udp处理流程是udp_rcv)。

        

        实际上icmp_rcv函数最重要的是 它调用了:icmp_pointers[icmph->type].handler(skb);

    handler = icmp_unreach

    icmp_unreach函数最终的一步,就是它最后一步:

    是不是很像ip_local_deliver_finish?

    是很像,只是ip_local_deliver_finish中,调用了ipprot->handler,而这里调用了ipprot->err_handler

    对于udp,err_handler = udp_err = __udp4_lib_err

    在该函数中,只有进入如下的流程,应用程序才会反应:

    __udp4_lib_err先根据skb->data中dip和sip,查找socket,skb->data是icmp的负载

    故先调用 __udp4_lib_lookup 查找socket,传参时,sip和dip需要反一下。

    __udp4_lib_err:

    先决条件是inet->recverr为非0,或者inet->recverr为0但是udp处于TCP_ESTABLISHED状态。

    否则应用程序休想收到该端口不可达的数据,应用程序就等着read超时吧。所以说,为了获取udp端口不可达的情况

    有2种方法:

    (1):

    int val = 1;

    setsockopt(fd, IPPROTO_IP, IP_RECVERR , &val,sizeof(int));

    (2):

    对udp进行connect操作,并且将sendto改成send

    4:

    udp获知端口不可达的源程序(方法1:设置Socket选项;方法2:对UDP进行Connect)

    注意,阻塞情况下,recvfrom会阻塞,即使收到端口不可达消息,也会阻塞。但是经过 方法1 和 方法2后,recvfrom会返回,返回值是-1,然后 判断errno是否是ECONNREFUSED来判断是否收到端口不可达消息。

    #include <stdio.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <errno.h>
    unsigned char revc_buf[1024];
     
    int main()
    {
    	int fd,ret,recv_len,size=1024;
    	struct sockaddr_in server_addr,addr;
    	int val = 1;
    	server_addr.sin_family = AF_INET;
    	server_addr.sin_addr.s_addr = inet_addr("192.168.2.254");
    	server_addr.sin_port = htons(77);
    	
    	fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    	if(fd < 0)
    	{	
    		perror("socket fail ");
    		return -1;
    	}
    	
    	printf("socket sucess\n");
     
            //方法1
    	#if 1
    	setsockopt(fd, IPPROTO_IP, IP_RECVERR , &val,sizeof(int));
    	if(sendto(fd, "nihao", strlen("nihao"), 0, (const struct sockaddr *)&(server_addr), sizeof(struct sockaddr_in))<0)
    	{
    		perror("sendto fail ");
    		return -1;
    	}
    	printf("sendto sucess\n");
    	recv_len = recvfrom(fd, revc_buf, sizeof(revc_buf), 0, (struct sockaddr *)&addr, (int *)&size);
    	if (recv_len == -1)
    	{
    		if (errno == ECONNREFUSED)
    		{
    			printf("Recv port unreachable\n");
    		}
    	}
    	//方法2
    	#elif 0
    	ret = connect(fd, (const struct sockaddr *) &(server_addr), sizeof (struct sockaddr_in));
    	if(ret < 0)
    	{
    		printf("connect fail\n");
    		return -1;
    	}
    	
    	ret = send(fd, "ni hao", strlen("nihao"),0);
    	if(ret < 0)
    	{
    		printf("write fail\n");
    		return -1;
    	}
    	
    	ret = recvfrom(fd, revc_buf, sizeof(revc_buf), 0, (struct sockaddr *)&addr, (int *)&size);
    	if (ret == -1) {
    		if (errno == ECONNREFUSED)
    		{
    			printf("Recv port unreachable\n");
    		}
    	}
     
    	#endif
    	close(fd);
    	
    	return 0;
    }

    如果对你有用,请打赏一元哦:http://www.mrpre.com/

    展开全文
  • icmp icmp icmp icmp icmp icmp
  • ICMP详解

    千次阅读 多人点赞 2020-04-14 10:58:50
    ICMP(Internet Control Message Protocol)网际控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些...
  • ICMP-Tx:ICMP隧道-源码

    2021-07-03 13:35:24
    ICMP-Tx 创建具有自定义数据内容的 ICMP 数据包。 苹果电脑 你需要root权限才能启动start.py sudo ./start.py
  • 什么是ICMPICMP的功能特点.docx
  • 一、ICMP 协议、 二、ICMP 协议 简介、 三、ICMP 五种差错报告报文、 四、ICMP 差错报文形成、 五、ICMP 差错报文 不发送 情形、 六、ICMP 询问报文、 七、ICMP 应用、
  • ICMP报文

    万次阅读 2018-12-30 16:28:07
    主要介绍ICMP的两种报文,ICMP差错报文和ICMP询问报文。
  • icmp.cr:Crystal中ICMP Ping的简洁实现
  • ICMP协议和ICMP重定向详解

    千次阅读 2020-02-03 19:40:33
    ICMP协议 internet消息控制协议(ICMP)指定了多种消息类型,这些消息的共同目的就是管理网络,详见RFC792。ICMP的消息可以分为错误消息、请求消息和响应消失。ICMP数据包格式如图所示1-1。数据包可以通过类型来...
  • ICMP协议

    2020-01-30 21:14:13
    ICMP协议 简介 ICMP–INTERNET CONTROL MESSAGE PROTOCOL 网络控制信息协议 ICMP负责传递IP协议或更高层协议的差错报文以及其他需要注意的信息,正式规范在RFC792 ICMP报文在IP数据报内部被传输 ICMP报文格式与类型...
  • ICMP和IGMP

    2019-01-31 15:35:20
    ICMP差错报告采用路由器-源主机的模式,路由器在发现数据报传输出现错误时只向源主机报告差错原因; ICMP并不能保证所有的IP数据报都能够传输到目的主机; ICMP不能纠正差错,它只是报告差错。差错处理需要由高层...
  • Block-ICMP:阻止icmp数据包的C代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,059
精华内容 62,823
关键字:

icmp