zoukankan      html  css  js  c++  java
  • TCP/IP协议---ICMP协议及ping、traceroute

      ICMP Internet控制报文协议
    通常被认为是IP层的组成部分,一般被IP层或更高层(TCP、UDP)使用。
    ICMP报文是在IP数据报内部被传输的。如图:

    ICMP报文的格式如下:


    报文的前4个字节都一样: 8bit类型,8bit代码,16bit检验和。

    16bit检验和,算法和计算IP首部检验和一样,ICMP检验和要覆盖整个报文,包括首部和数据。
    ICMP报文有不同的报文类型,不同类型由这个8bit的类型和8bit的代码共同决定。一个类型下可能有多个代码。
    比如: 类型0表示回显应答(ping应答);类型1表示目的不可达,其中代码0表示网络不可达,代码1表示主机不可达,代码2表示协议不可达,代码3表示端口不可达等等...

    报文也分为查询类型还是差错类型。因为有时要对差错报文进行特殊处理,比如对ICMP差错报文进行响应时就不会再生成一个ICMP差错报文...
    当发生的是差错报文时,报文始终包含导致产生ICMP差错报文的原IP首部和数据部分的前8个字节(比如传输层的UDP或者TCP,这包含了端口号)。这里的原IP首部中的协议字段和前8个字节的端口号,可以判断出是哪个协议和哪个用户进程。
    除了上述的ICMP差错报文不会再产生ICMP差错报文,一般目的地址是广播的数据报不会再产生ICMP差错报文了,这样防止广播风暴...

    ICMP地址掩码请求与应答
    ICMP时间戳请求与应答
    ICMP端口不可达差错:
    如果说报文发送到目的主机的未监听的端口,那么目的主机就会返回一个端口不可达的ICMP差错报文。traceroute就利用了这一点。

    可以看出ICMP报文的数据部分,包含了原IP的首部和IP数据部分的前8个字节(这里就是UDP首部)。

    ============Ping============== 

       ping程序是由Mike Muuss编写,目的是为了测试一个主机是否能到达。
    该程序的原理就是向目的主机发送一个请求回显类型(ICMP众多类型的一个,类型是8,代码是0)的ICMP报文,并等待返回ICMP回显应答(ICMP众多类型的一个,类型是0,代码是0)。
    一般来说,如果ping不通主机,就表示不能访问那台机器。不过随着Internet安全意识提高,比如现在的路由器和防火墙已经可以提供访问控制列表了,ping不通也不一定是访问不了主机了...

    ping程序ICMP回显请求和回显应答的报文格式如下:

    Unix系统在实现ping程序时,标识符字段置成发送进程的ID号,这样一台机器启用多个ping的时候,当本机接到应答报文时,就能识别出是哪个ping实例发出的。
    ping返回每个序列号,ttl,time...序列号是每发送一个新的回显请求就加1,起始是0。ttl就是过了几个路由(ping局域网内的机器发现ttl就不会减少)。time就是计算的往返时间,发送的时候在数据部分记录下发送时间,收到的时间减去这个发送时间。
    ping的时候,往往会发现第一个回来的报文比别的要用的往返时间长,这个多出去的时候就可能是arp寻找mac地址...

    ping程序也提供了查看IP记录路由选项的.在IP首部中,还记得有个选项的字段吧~这些个ip记录就放在这个字段里。每经过一个路由,就把这个路由出口的ip(注意这里规范是出口地址),回显应答报文回到源端时仍然会记录下每个路由的出口地址。
    IP首部最长是60个字节,减去固定的20字节长度,剩下40个字节。记录路由IP的这个类型项、长度项、记录ip位置的指针各占1个字节,这样存放各个路由ip就只剩下37个字节,一个ip4个字节,因此最多只能记录9个路由...
    IP首部的选项还可以记录IP时间戳。这个类似于IP记录路由选项。

    ============Traceroute==============

      traceroute程序--可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由情况。

    ping程序中也提供了查看IP记录路由选项,为啥还要再搞一个traceroute咧?主要原因还是因为IP首部选项能存储的ip数量太少了,最多9个。如果只考虑去和回的一个方向,那么最多只能存储4-5个路由,这在现在的互联网规模来看显然是不太满足的。
    traceroute几个核心知识:利用TTL通过路由减1,直到变为1或者0时(路由不会传送TTL为0的包),路由就会发送超时类型的ICMP报文通知源端主机。利用UDP发送一般不常见的端口号给目的主机,当真正到达目的主机时,目的主机会发送一个端口不可达错误的ICMP报文(在未到达时,是路由返回的超时类型的ICMP报文,需要辨识开)。源端主机根据这个确认是否到达。TTL开始是1,逐渐递增。

    一个细节:对于每个TTL值,都会发送三个包。每接到一个报文,就计算并打印出来往返时间。如果5秒钟内一个包没收到,就打印一个*号,并发送下一份数据报。

    ICMP超时报文格式如下:

    IP源站选路选项:
    通常IP路由是动态的,每个路由都要判断下一站转发给谁。源站选路:就是由发送者指定路由。采用类似Traceroute程序的工具来发现实际的路由。
    一般分为严格和宽松的两种。严格的源站,是由发送端确切指明每个路由,如果发现指定的路由不在这个连接的路由上,那么就会发送“源站路由失败”的ICMP报文。
    宽松的:发送端指明一个路由的IP地址清单,每两个IP路由之间可以通过其他路由器。
    这里指定的路由和IP记录路由选项是一样的,都是利用IP首部的选项字段,格式也很类似。

    --

  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/firstForEver/p/5345900.html
Copyright © 2011-2022 走看看