精华内容
下载资源
问答
  • ICMP报文

    千次阅读 2019-04-17 10:43:04
    ICMP报文
                   

    一。为什么需要ICMP?

    因为IP协议不提供可靠性且不能保证信息传递,因此发生问题时,通知发送人是很重要的。(IP协议是一种不可靠的协议,无法进行差错控制。但IP协议可以借助其他协议来实现这一功能,如ICMP)

    。什么是ICMP? 

    ICMP: Internet Control Message Protocol 即Internet消息控制协议。ICMP报文分为两种类型(1)ICMP差错报告报文  (2)ICMP询问报文

     ICMP差错报告报文共有5种

    1、终点不可达:终点不可达分为:网络不可达,主机不可达,协议不可达,端口不可达,需要分片但DF比特已置为1,以及源路由失败等六种情况,其代码字段分别置为0至5。当出现以上六种情况时就向源站发送终点不可达报文。

    说明:

    端口不可达:UDP的规则之一是:如果收到UDP数据报而且目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文。

    2、 源站抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源站发送源站抑制报文,使源站知道应当将数据报的发送速率放慢。

    3、 时间超过:当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源站发送时间超过报文。当目的站在预先规定的时间内不能收到一个数据报的全部数据报片时,就将已收到的数据报片都丢弃,并向源站发送时间超过报文。

    4、参数问题:当路由器或目的主机收到的数据报的首部中的字段的值不正确时,就丢弃该数据报,并向源站发送参数问题报文。

    5、改变路由(重定向)路由器将改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器。


    ICMP定义了一套差错报文控制报文,用于用户主机与路由之间交换不可到达地址、网络拥塞、重定向到更好的路径、报文生命周期超时等信息

    ICMP协议是一种提供(有关阻止数据包传递的)网络故障问题反馈信息的机制。(针对阻止数据包传递或者网络故障。)它让TCP等上层协议能够意识到数据包没有送达目的地。他的主要功能:

    支持网络管理PING命令
        报告一个特定的目的地不可到达
        请求一个发送主机减少它的数据流量,以缓解网络拥塞
        报告配置和路由的变化
        报告一个特定的数据报中IP报头参数的问题
        因超时而丢弃一个数据报
        CMP差错报文

    差错报告作为ICMP最初始的功能,具有两大特点:

        第一,ICMP作为差错报文传输机制,最根本的功能是提供差错报告,但ICMP并不严格规定对 某种差错应采取什么处理方式。
        第二,ICMP的差错报告都是网关——源机模式的,因为:首先,IP数据报只包含信源地址 和信宿地址(除非选用“记录路径”选项),一旦发生错误,差错情况要么报告信源机, 要么报告信宿机,但报告信宿机首先没有意义(因为传输与信宿机毫无关系),其次也许 根本做不到(因为传输错误可能使信宿机不可到达),于是,差错信息只能传给信源机。(这句话的意思就是,网络层提供的是点对点的服务,就是一个路由给另一个路由发送数据的时候出现错误,这个使用ICMP的差错报告都是网关,都是发送端的网关!它只是报告,并不能采取什么措施)

    关于ICMP与TCP的差错控制对比?

    比如主机A到主机B的通信,中间Router  r1 到Router  r2 的网络连接断了。

    通过ICMP,则可以快速诊断出出错原因,并且报告主机。(差错诊断)

    TCP的差错控制,主要是体现在,网络断了,收不到确认回复,TCP会一直再次发送数据包,直到收到确认回复。(差错处理)

     

    ICMP提供一组易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者发送设备随后可根据ICMP报文确定发生错误的类型,确定如何才能更好地重发失败的数据报但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。

    。ICMP协议有哪些数据包?

    一个ICMP数据包实际上就是一个(数据部分为ICMP协议数据的)IP数据包。 

    IP头

    ICMP头

    Type

    Code

    Checksum

    ICMP数据


    如前所述,ICMP主要分为差错报文控制报文

    差错报文包括:目标不可到达(网络、协议、主机、端口不可到达;禁止分割、目标网络不认识、目标主机不认识等等)、超时、参数问题、重定向(网络重定向、主机重定向等)等等

    控制报文包括:请求回显(ping请求)、回显应答(ping应答)、地址掩码请求、地址掩码应答等等

    如上,我们可以发现,同一类型的错误(不可到达)可能有不同种类(网络不可到达、主机不可到达),因此,我们使用type来code两个标志来确定一个具体的错误。

    因为需要指出具体是哪个主机上的哪个程序发出的信息没有到达。

    因此,每一个ICMP的错误消息,应该包含:

    1.具体的错误类型(Type/code 决定)

    2.引发ICMP错误消息的数据包的完全IP包头(哪个主机的数据)

    3.数据报的前8个字节----UDP报头或者TCP中的port部分(主机上的哪个程序)

    因此,ICMP错误消息的格式应该为如下

    Type(8)

    Code(8)

    Checksum(16)

    Unused(32)

    Internet Header +64 Bits of Original Data Datagram

     
    控制报文因为控制的消息各不相同,所以有所差异。下面分析下请求回显(ping)和回显应答,其他的消息,大家可以触类旁通。

    Type

    Code

    Checksum

    Identifier

    Sequence Number

    Data

    当主机A需要知道和主机B通信的状况(信息传递延时、丢包率)时,我们该怎么办呢?

    我们可以参考声纳和雷达的原理:主机A发送一个ICMP回显请求(type=8,code=0)报文,数据域中存放当前时间T1,目的IP为主机B。主机B收到该ICMP回显请求报文后,将目的IP和源IP调换位置,其他信息都不变(Indentifier,SequenceNumber),回复一个ICMP回显应答(type=0,code=0)。主机A收到改ICMP回显应答的时间为T2。则,到主机B的通信时间为:T2-T1。

    又因为,要考虑丢包,所以我们向主机B发送多个回显请求,用Sequence Number来区分各个请求,根据Sequence Number,即可知道应答对应的请求数据包。

     

    Ping命令就是这样的一个实现,其实我们在命令行下输入ping ip命令时,就是调用Ping程序。Ping程序根据输入的IP(域名)封装ICMP请求应答,发送出去,并且接受ICMP回显应答,进行解析,输出。

     

    关于超时:IP报头中的生存期(TTL)属性,用来控制报文段在网络中的生存期。

     

    试想一下,当网络中的某些路由出现问题,Router A将IP a 的下一跳路由为Router B。同时在Router B中,又将IP a 的下一跳路由为 Router A。那么显然,两个路由器之将会间形成回路,通往网段a的数据包,将会一直在两个路由之间发送,导致网络流量爆炸,同时,数据包也无法正确的到达网络a。

     

    因此,当IP数据包每经过一个路由器时,路由器将IP数据包中的TTL值减一。当TTL值为0时,路由器判断数据包超时,发送ICMP超时信息给源主机。

     

    当我们想知道:从主机A发送到主机B的数据包在网络中都经过了哪些路由器的时候,我们有什么办法呢?

    我们知道,当IP数据包在路由中出错时,路由器会向发送源发送一个ICMP错误报文,发送端从该ICMP错误报文中,可以得到该路由的IP

    我们可以利用此原理。要得到从主机A到目标主机B之间的所有路由的IP,那么我们必须让IP数据包在每个路由器中都出错一次。

    又因此,TTL值在经过的每个路由器中都会减1。因此,我们可以利用TTL的超时信息,在每个路由中都发生一次。即可得到从从主机A到主机B之间的所有路由的IP。

     

    PS.怎么判断数据包正确到达了目标主机B?

    当IP数据包到达了目标主机,将不会再发送TTL超时错误。而且在目标主机B中,没有运行相对应的应用层程序,因此,将没有程序会回应我们发送的IP数据包。那么,我们将如何知道IP数据包已经到达了目标主机呢?

    我们可以为数据包分配一个目标主机几乎不可能监听的端口,从而,当IP数据包到达目标主机后,目标主机会回复相应的不可到达、端口不可到达”的ICMP错误信息,从而,我们可以确认IP数据包已经到达了目标主机。

     

    综上,我们可以:源主机A发送IP数据包,IP为目标主机B,port几乎不可能监听的port,TTL从一开始一直往上增加,直道收到来自主机B的ICMP 不可到达(端口不可到达)信息。

    Tracerouter 命令就是实现这样功能的一个程序。我们可以通过tracerouter ip来调用此功能。

     

    PS.因为每次路由时的路由路径可能不一样,那么在tracerouter过程中,我们又如何解决这个问题?

    而且,如果目标主机正好监听了这一我们认为不可能监听的端口呢?

     

    1. 回送或回送响应

      我们使用一个ICMPECHO数据包来探测主机地址是否存活(当然在主机没有被配置为过滤ICMP形式),通过简单的发送一个ICMPECHO(Type 8)数据包到目标主机,如果ICMPECHOReply(ICMPtype0)数据包接受到,说明主机是存活状态。  如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。这种机制就是我们通常所用的ping命令来检测目标主机是否可以ping到.

    回送消息的源地址是回送响应消息的目的地址。若要形成一个回送响应消息,应该将源和目的地址交换,将类型代码更改为0,重新计算机校验码。

    下面是这个报文的格式:

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     Type        |     Code      |          Checksum             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           Identifier            |        Sequence Number        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     Data ...
       +-+-+-+-+-

    类型:
    8代表回送消息;
    0代表回送响应消息。
    代码:0

    校验码:
    16位数据(从ICMP类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。这些零在 以后会被校验码取代。
    标识符:如果代码=0,帮助匹配回送和回送响应的代码可以为0。
    序列码:如果代码=0,帮助匹配回送和回送响应的序列码可以为0。
    说明:
    回送消息中接收到的消息应该在回送响应消息中返回。标识符和序列码由回送发送者使用帮助匹配
    回送请求的响应。代码: 从主机或网关接收0


    2. 超时报文

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     Type      |     Code      |          Checksum             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                             unused                            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |      Internet Header + 64 bits of Original Data Datagram      |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
    类型:11
    代码:
    0 = 传送超时;
    1 = 分段级装超时。
    校验码:
    16位数据(从ICMP类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。
    这些零在以后会被校验码取代。
    Internet包头+64位源数据报数据:
    Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。
    如果高层协议使用端口号,应该假设其在源数据的头64个字节之中。
    说明:
    如果网关在处理数据报时发现生存周期域为零,此数据报必须抛弃。网关同时必须通过超
    时信息通知源主机。如果主机在组装分段的数据报时因为丢失段未能在规定时间内组装数据,
    此数据报必须抛弃。网关发送超时信息。
    如果段零不可用则不用发送超时信息。
    代码0由网关发送,代码1由主机发送。

     

    3. 目标主机不可达报文

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     Type      |     Code      |          Checksum             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                             unused                            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |      Internet Header + 64 bits of Original Data Datagram      |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
    类型:3
    代码:
    0 = 网络不可达;
    1 = 主机不可达;
    2 = 协议不可用;
    3 = 端口不可达;
    4 = 需要段和DF设置;
    5 = 源路由失败;

    校验码:
    16位数据(从ICMP类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。
    这些零在以后会被校验码取代。
    Internet包头+源数据报:
    Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。
    如果高层协议使用端口号,应该假设其在源数据的头64个字节之中。
    说明:
    相应于网关的路由表,如果在目的域中指定的网络不可达,如网络距离为无限远,网关会向发送
    源数据的主机发送目的不可达消息。而且,在一些网络中,网关有能力决定目的主机是否可达。
    如果目的地不可达,它将向发送源数据的主机发送不可达信息。
    在目的主机,如果IP模块因为指定的协议模块和进程端口不可用而不能提交数据报,目的主机将
    向发送源数据的主机发送不可达信息。

    另外一种情况是当数据报必须被分段传送,而“不可分段”位打开,在这种情况下,网关必须抛弃
    此数据报,并向向发送源数据的主机发送不可达信息。

    代码0,1,4和5由网关发送,而代码2和3由主机发送。

    ICMP差错报文的格式

     

                  不可达,超时,源泉抑制

     

    type

    len

    cksum

    Void(必须是0)

    被破坏分组的IP首部

     

     

                    需要分片

     

    type

    len

    cksum

    Pmvoid(必须是0)

    nextmtu

    被破坏分组的IP首部

     

     

                    参数问题

     

    type

    len

    cksum

    pptr

    (必须是0)

    被破坏分组的IP首部

     

     

     

                              信宿不可达报文类型表

     

    代码值

    类型描述

     

    代码值

    类型描述

    0

    网络不可达

     

    7

    信宿主机未知

    1

    主机不可达

     

    8

    信源主机被隔离

    2

    协议不可达

     

    9

    与信宿网络的通信被禁止

    3

    端口不可达

     

    10

    与信宿主机的通信杯禁止

    4

    需要分片和DF设置

     

    11

    对请求的服务类型,网络不可达

    5

    源路由失败

     

    12

    对请求的服务类型,主机不可达

    6

    信宿网络未知

     

     

     

     

    /* Handle ICMP_UNREACH and ICMP_QUENCH. */处理ICMP_UNREACHICMP_QUENCH//处理不可达和源终止//

    static void

    icmp_unreach(struct icmphdr *icmph, struct sk_buff *skb);//调用icmp_unreach函数类型3

    {

      struct inet_protocol *ipprot;

      struct iphdr *iph; //定义IP头部

      unsigned char hash;

      int err;//定义变量

     

      err = (icmph->type << 8) | icmph->code;// ICMP包类型小于8,响应请求

      iph = (struct iphdr *) (icmph + 1);//IP的头标位ICMP的头标加1

      switch(icmph->code & 7) //将icmph指向代码(为8位)并与7与后进行判断,得到不可达类型的代号

    {

        case ICMP_NET_UNREACH://当网络不可达时

            DPRINTF((DBG_ICMP, "ICMP: %s: network unreachable.\n",

                                in_ntoa(iph->daddr)));//输出网络不可访问的目的IP地址 

    break;

        case ICMP_HOST_UNREACH://当主机不可达时

     

            DPRINTF((DBG_ICMP, "ICMP: %s: host unreachable.\n",

                            in_ntoa(iph->daddr))); //输出主机不可访问  目的IP地址    

    break;

     

            break;

        case ICMP_PROT_UNREACH://当端口不可达时

     

            printk("ICMP: %s:%d: protocol unreachable.\n",

                in_ntoa(iph->daddr), ntohs(iph->protocol));

    //输出ICMP协议不可达   目的IP地址     协议首地址

    break;

        case ICMP_PORT_UNREACH:

            DPRINTF((DBG_ICMP, "ICMP: %s:%d: port unreachable.\n",

                in_ntoa(iph->daddr), -1 /* FIXME: ntohs(iph->port) */));

            break;

        case ICMP_FRAG_NEEDED://当需要分片时和DF设置时

            printk("ICMP: %s: fragmentation needed and DF set.\n",

                                in_ntoa(iph->daddr));//输出碎片需要和DF设置目的IP地址

            break;

        case ICMP_SR_FAILED://当源路由失败时

            printk("ICMP: %s: Source Route Failed.\n", in_ntoa(iph->daddr));

            break;//目的IP地址 源路由失败

        default:

            DPRINTF((DBG_ICMP, "ICMP: Unreachable: CODE=%d from %s\n",

                        (icmph->code & 7), in_ntoa(iph->daddr)));

            break;

      }

    //若不是上述情况 则输出DBG_ICMP icmp不可达 code的值 目的ip地址

     

     

      /* Get the protocol(s). *///获取通讯协定

      hash = iph->protocol & (MAX_INET_PROTOS -1);

    //hash等于iph->protocol并(MAX_INET_PROTOS -1)

     

     

      /* This can change while we are doing it. */

      ipprot = (struct inet_protocol *) inet_protos[hash];//如果找到相关的协议

      while(ipprot != NULL) {

        struct inet_protocol *nextip;//到路由的下一跳

     

        nextip = (struct inet_protocol *) ipprot->next;// ipprot等于inet的协议   inet_protos[hash],ipprot不为空,ipprot等于 inet的协议 *,ipprot指向下一个值

     

     

        /* Pass it off to everyone who wants it. */

        if (iph->protocol == ipprot->protocol && ipprot->err_handler) {

            ipprot->err_handler(err, (unsigned char *)(icmph + 1),

                        iph->daddr, iph->saddr, ipprot);

        }//发送给目的端口

     

        ipprot = nextip;

      }

      skb->sk = NULL;

      kfree_skb(skb, FREE_READ);//查看接收缓存还够不够

    }

     

    功能:处理ICMP_DEST_UNREACH, ICMP_TIME_EXCEED, and ICMP_QUENCH.

    1.长度小于IP头结构长度,则转入FLUSHIT(6)

    2.长度小于ihl*4,则转入FLUSHIT(6)

    3.处理ICMP-DEST-UNREACH:CODE(低4个bit)为

    A.NET、HOST-UNREACH:转入4

    B.PROT-UNREACH:调用NETDEBUGprotocol unreachable,其它同C

    C.PORT-UNREACH:match_addr=1,其它同A

    D.FRAG-NEEDED:没有PMTU-Discovery,则同B(参数不同,为fragmentation needed and DF set.)其它同A;否则,①skb结构对应的路由表的MTU小于等于IP头的TTL,发NETDEBUG(指明基于4.2BSD的路由),然后将MTU置为TTL-4*IHL②若新估MTU小于68或大于旧MTU,则据RFC1191重新定新的MTU③将新MTU放入IP头的ID域,然后动作同A。

    E.SR-FAILED:NETDEBUG(源路由失败)其它同A

    F.其它情况同A

    4.CODE码大于NR-ICMP-UREACH(为非法类型),转入FLUSHIT

    5.若match_addr为0或入参saddr等于IP包头的目标地址,据IP头的协议号找到协议哈希表的对应表,遍历这个表,若协议相同且差错处理不为空,则调用差错处理,否则转FLUSHIT:以FR入6。

    6.EE_READ为参数释放skb结构空间。

           

    小节:这段代码主要的功能是查看在发送数据包源端口到目的端口这个路程中有没有出现异常,出现异常则打印其类型,否则进行路由的转发。

               
    展开全文
  • icmp报文

    千次阅读 2018-05-09 20:14:50
    一.概述:1. ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更...3. ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询...

    一.概述:

    1.   ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。

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

    3.   ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。

    二.ICMP报文的格式


    1.   类型:占8位

    2.   代码:占8位

    3.   检验和:占16位

    说明:ICMP所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。

    4.   其它字段都ICMP报文类型不同而不同。

    1>  ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和。

    2>  8位类型和8位代码字段一起决定了ICMP报文的类型。

    类型8,代码0:表示显请求(ping请求)。

    类型0,代码0:表示回显应答(ping应答)

    类型11,代码0:超时

    3>16位的检验和字段:包括数据在内的整个ICMP数据包的检验和;其计算方法和IP头部检验和的计算方法一样的。

    ICMP报文具体分为查询报文和差错报文(对ICMP差错报文有时需要做特殊处理,因此要对其进行区分。如:对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文,否则会出现死循环)

    .ICMP差错报文(56字节)

    1.   ICMP差错报告报文共有5种

    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差错报文对广播分组响应所带来的广播风暴。

    2.所有的ICMP差错报告报文中的数据字段都具有同样的格式。将收到的需要进行差错报告IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上响应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段的前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。


    注:一下情况不发送ICMP差错报告报文

    三.ICMP询问报文(40字节)


    1.ICMP询问报文有四种回送请求和回答,时间戳请求和回答,掩码地址请求和回答,以及路由器询问和通过。

    1>ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的机器必须给源主机发送ICMP回送应答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。

    2>ICMP时间戳请求允许系统向另一个系统查询当前的时间。该ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间只能提供秒级的分辨率。请求端填写发起时间,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。大多数的实现是把后面两个字段都设成相同的值。

    3>主机使用ICMP地址掩码请求报文可向子网掩码服务器得到某个接口的地址掩码。系统广播它的ICMP请求报文。ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回,这样,发送端就可以把应答与请求进行匹配。

    4>主机使用ICMP路由器询问和通过报文可了解连接在本网络上的路由器是否正常工作。主机将路由器询问报文进行广播(或多播)。收到询问报文的一个或几个路由器就使用路由器通过报文广播其路由选择信息

    四.Ping程序

    1.概述

    1>Ping程序是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。

    2>Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有多远。

    2.我们将发送回显请求的ping程序为客户,而称被ping的主机为服务器。

    3.ICMP回显请求和回显应答报文格式:


    1>Unix系统在实现ping程序时把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息。

    2>序列号从0开始,每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失,失序或重复。.

    3>ping程序通过在ICMP报文中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。

    4>当返回ICMP回显应答时,要打印出序列号和TTL,并计算往返时间。TTL位于IP首部的生存时间字段。ping程序通过在ICMP报文数据段中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。

    展开全文
  • ICMP报文详解

    千次阅读 2020-09-01 16:15:16
    通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。 ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据报发送出去。 ICMP报文的种类有两种,即ICMP差错报告报文...

    在这里插入图片描述

    概述

    1. ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。

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

    3. ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。

    ICMP报文的格式

    在这里插入图片描述

    1. 类型:占8位

    2. 代码:占8位

    3. 检验和:占16位

    说明:ICMP所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。

    1. 其它字段都ICMP报文类型不同而不同。

    1> ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和。

    2> 8位类型和8位代码字段一起决定了ICMP报文的类型。

    类型8,代码0:表示回显请求(ping请求)。

    类型0,代码0:表示回显应答(ping应答)

    类型11,代码0:超时

    3>16位的检验和字段:包括数据在内的整个ICMP数据包的检验和;其计算方法和IP头部检验和的计算方法一样的。

    ICMP报文具体分为查询报文和差错报文(对ICMP差错报文有时需要做特殊处理,因此要对其进行区分。如:对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文,否则会出现死循环)

    ICMP差错报文(56字节)

    1. ICMP差错报告报文共有5种

    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差错报文对广播分组响应所带来的广播风暴。

    2.所有的ICMP差错报告报文中的数据字段都具有同样的格式。将收到的需要进行差错报告IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上响应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段的前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。

    在这里插入图片描述

    ICMP询问报文(40字节)

    在这里插入图片描述

    1.ICMP询问报文有四种回送请求和回答,时间戳请求和回答,掩码地址请求和回答,以及路由器询问和通过。

    1>ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的机器必须给源主机发送ICMP回送应答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。

    2>ICMP时间戳请求允许系统向另一个系统查询当前的时间。该ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间只能提供秒级的分辨率。请求端填写发起时间,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。大多数的实现是把后面两个字段都设成相同的值。

    3>主机使用ICMP地址掩码请求报文可向子网掩码服务器得到某个接口的地址掩码。系统广播它的ICMP请求报文。ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回,这样,发送端就可以把应答与请求进行匹配。

    4>主机使用ICMP路由器询问和通过报文可了解连接在本网络上的路由器是否正常工作。主机将路由器询问报文进行广播(或多播)。收到询问报文的一个或几个路由器就使用路由器通过报文广播其路由选择信息

    Ping程序

    1.概述

    1>Ping程序是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。

    2>Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有多远。

    2.我们将发送回显请求的ping程序为客户,而称被ping的主机为服务器。

    3.ICMP回显请求和回显应答报文格式:

    在这里插入图片描述

    1>Unix系统在实现ping程序时把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息。

    2>序列号从0开始,每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失,失序或重复。.

    3>ping程序通过在ICMP报文中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。

    4>当返回ICMP回显应答时,要打印出序列号和TTL,并计算往返时间。TTL位于IP首部的生存时间字段。ping程序通过在ICMP报文数据段中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。

    增加:
    抓包看过icmp ping 请求包(类型8,代码0) 和 响应包(类型0,代码0)后,发现 请求包 和 响应包的 标识符 和 序号 以及 选项数据完全一致。这样可能是为了一 一 对应。
    截图:

    在这里插入图片描述

    展开全文
  • ICMP报文格式

    2020-07-08 16:47:13
    ICMP的前8字节,即ICMP报文首部的类型、代码、检验和ICMP报文的类型
    • 网际控制报文协议ICMP
      在这里插入图片描述
      在这里插入图片描述
      ICMP的前8字节,即ICMP报文首部的类型、代码、检验和ICMP报文的类型
    展开全文
  • icmp报文类型说明

    2011-08-16 20:55:54
    icmp报文类型,详细介绍icmp报文的原理类型
  • 典型的ICMP报文

    2015-01-19 10:27:50
    典型的ICMP报文简单介绍以供大家学习参考
  • wireshark捕获icmp报文

    2021-06-25 13:11:06
    wireshark 捕获不到物理机ping虚拟机的icmp报文
  • ICMP/ICMP报文分析

    千次阅读 2017-07-01 13:38:30
    这篇文章是从网上DownLoad下来的,感谢上传的那位兄弟。   一....1. ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但...2. ICMP报文作为IP层数据报的数据,加上数据报的首部,组成
  • wireshark中抓取ICMP报文

    万次阅读 多人点赞 2018-06-06 14:56:39
    为了更有效地转发IP数据报和提高交付成功的机会,在网络层使用了网际控制报文...ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据报发送出去。 ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文...
  • icmp 报文详解

    万次阅读 2016-12-08 17:29:14
    写的很好的 icmp 报文详解: ...一....1. ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议
  • ICMP报文分析

    2014-03-03 18:43:11
    ICMP报文的格式 三ICMP差错报文56字节 三ICMP询问报文40字节 四Ping程序   一.概述: 1. ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。...
  • 类型:占一字节,标识ICMP报文的类型,目前已定义了14种,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文。 代码:占一字节,标识对应ICMP报文的代码。它与...
  • 9-ICMP报文种类

    万次阅读 2018-04-26 00:09:48
    1. ICMP报文种类   ICMP报文的种类分为两种:一种是差错报告报文,另一种是查询报文。   对于差错报告报文来说,ICMP总是把差错报文报告给发送数据源端(源主机)。比如:主机A给主机发送一个数据,结果这个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,024
精华内容 20,809
关键字:

icmp报文