• TCP/IP之ICMP(Internet控制报文协议),Ping程序和Traceroute程序


    ICMP简述

    ICMP是在rfc792中被定义。我们知道,IP协议是用来进行host-to-host之间的数据传输连接,但是IP数据报在传输中可能出现各种错误,发送方发送某个IP数据报后,如果发送失败,它是希望能够收到出错的反馈信息的,这就出现了ICMP协议。ICMP协议并不是用来保证IP数据报传输的可靠性,它只是对发送出现错误时进行反馈报到,要想保证数据传输的可靠性,需要高层相关协议定义,如TCP协议。

    ICMP是基于IP协议的,也就是说它利用IP数据报格式传输,所以它的头定义格式和IP协议一样。可参考我前篇文章:IP协议

    ICMP报文格式

    type字段指示出错的类型,code字段指示出错的代码。它们两个的组合可以唯一定位出出错点在哪里。如下摘自RFC里面介绍的一些type值:

    Summary of Message Types
    
        0  Echo Reply
    
        3  Destination Unreachable
    
        4  Source Quench
    
        5  Redirect
    
        8  Echo
    
       11  Time Exceeded
    
       12  Parameter Problem
    
       13  Timestamp
    
       14  Timestamp Reply
    
       15  Information Request
    
       16  Information Reply

    Ping程序

     有时间我们想ssh,telnet,ftp,或者通过浏览器器访问某个主机时总是连接不成功,这时我们想确定本台机器是否该连接主机是否连通,这时我们一般这样做:

    ping baidu.com

     其实它就是发送的一个type为0,并且返回为8的ICMP数据报。我们执行上面的ping请求时通过tcpdump拦截的数据可以看得到:

    root@tony:/home/tony# tcpdump host 123.125.114.144
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
    20:45:03.461241 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 1, length 64
    20:45:03.615962 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 1, length 64
    20:45:04.462946 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 2, length 64
    20:45:04.615983 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 2, length 64
    20:45:05.463949 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 3, length 64
    20:45:05.617809 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 3, length 64
    20:45:06.465749 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 4, length 64
    20:45:06.619782 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 4, length 64
    20:45:07.466709 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 5, length 64
    20:45:07.621152 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 5, length 64
    20:45:08.468119 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 6, length 64
    20:45:08.622387 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 6, length 64
    20:45:09.469352 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 7, length 64
    20:45:09.623731 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 7, length 64
    20:45:10.470701 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 8, length 64
    20:45:10.625282 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 8, length 64
    20:45:11.472277 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 9, length 64
    20:45:11.627035 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 9, length 64

    Traceroute程序

    traceroute这个程序的目的就是要确立一个IP数据包是怎么到达目的地主机的(经过了哪些路由器网关)。它的工作原理就是利用IP协议中首部中TTL(time to live)这个字段来工作的。在前面的IP协议文章中,我们讲过TTL就是用来设置一个最大的路由中转数的,如果超过了这个值,则会返回一个ICMP数据报进行错误报告,这样我们就可以根据数据报中的首部信息中源IP地址知道此路由器地址。

    所以,如果中间要经过6个路由器网关的话,则要发送7次IP探测数据包,也返回7次ICMP报文来反馈当前所处的路由器或目的主机IP地址。

    另外,我在我本机上进行traceoute命令时,只打印星号标记,在Google上也找不到答案,只是好像说是ICMP的数据包被禁止了还是怎么回事,如果有知道原因的同学,麻烦留言告诉我一下,我的机器环境是:ubuntu12.04 + ADSL上网(电信)

    root@tony:/home/tony# traceroute 119.146.200.16
    traceroute to 119.146.200.16 (119.146.200.16), 30 hops max, 60 byte packets
     1  * * *
     2  * * *
     3  * * *
     4  * * *
     5  * * *

    可是ping是通的:

    root@tony:/home/tony# ping 119.146.200.16
    PING 119.146.200.16 (119.146.200.16) 56(84) bytes of data.
    64 bytes from 119.146.200.16: icmp_req=1 ttl=54 time=28.1 ms
    64 bytes from 119.146.200.16: icmp_req=2 ttl=54 time=28.0 ms
    64 bytes from 119.146.200.16: icmp_req=3 ttl=54 time=26.6 ms
    64 bytes from 119.146.200.16: icmp_req=4 ttl=54 time=24.6 ms

    原创文章,转载请注明出处,谢谢!

  • 相关阅读:
    使用init_connect记录MySQL登录日志
    MySQL 在线开启GTID的每个阶段是要做什么
    chrome控制台发送post请求
    口语练习
    adb_usb.ini在adb找不到设备时
    ubuntu 12.04硬盘分区,格式化,挂载
    编译错误处理noproguard.classeswithlocal.dex已杀死
    ubuntu 12.04(gcc降级)编译android代码遇到"_FORTIFY_SOURCE"的解决方法
    ubuntu在update的时候报错GPL ERROR
    工作站环境搭建
  • 原文地址:https://www.cnblogs.com/jcli/p/2919744.html
Copyright © 2020-2023  润新知