zoukankan      html  css  js  c++  java
  • 面试题-----ICMP协议简介

    ICMP协议简介

    l  ICMP网际控制报文协议,通过它可以知道故障的具体原因和位置。

    l  由于IP不是为可靠传输服务设计的,ICMP的目的主要是用于在TCP/IP网络中发送出错和控制消息。

    l  ICMP的错误报告只能通知出错数据包的源主机,而无法通知从源主机到出错路由中途所的所有路由器。

    l  ICMP数据包是封装在IP数据包中的。

    l  网络层的协议有:ICMP、IGMP、IP、RARP、ARP。

    l  ICMP报文的种类有三种,即ICMP差错报告报文、控制报文、请求/应答报

    报告IP数据报在传输层中的差错是ICMP报文的最基本的功能,ICMP差错报文有如下特点:

    l  ICMP差错报文都是右路由器发送到源主机的,因为IP数据报中含有源主机的IP地址,报告给源主机是最可行的方案,另外,发出IP数据报的源主机最需要知道数据是否达到目标主机。

    l  ICMP差错报文只提供IP数据报在传输过程中的差错报告,并不规定对各类差错采取什么样的处理措施。具体对差错的处理,由收到ICMP差错报文的源主机将相应的差错与应用程序联系起来才能进行相应的差错处理。

    l  ICMP差错报文不享受任何优先权,也没有特别的可靠性保证措施,与普通的IP数据报一样进行传输,传输过程中可能被丢失、损坏,谁知被抛弃。

    l  ICMP差错报文是伴随着抛弃出错的IP数据报而产生的。

    l  当路由器发送一份参数错误等的ICMP差错报文时,ICMP报文数据区始终包含产生ICMP差错报文的IP数据报的头部和其数据区的前8个字节。

    l  在有些情况下,为了防止在网络中产生大量的ICMP差错报文(广播风暴),影响网络的正常工作,即使发生错误,也不会产生ICMP差错报文,这些情况包括:

    1. ICMP发生差错。这是为了避免差错报文无休止产生(但是ICMP查询报文可能产生ICMP差错报文)
    2. 目的地址是广播或者多播地址(D类地址)的IP数据报。
    3. 作为链路层广播的数据报
    4. 不是IP分片的第一片
    5. 原地址不是单个主机的数据报。这就是说,源地址不能为零地址、会送地址、广播地址或多播地址。

    ICMP控制报文

    拥塞控制与源站抑制报文
    当一个路由器接收IP数据报的速度比其处理IP数据报的速度快,或者一个路由器传入数据报的速率大于传出数据报的速率时,就会产生拥塞现象。
    这时路由器可以通过发送源站抑制报文来抑制源主机发送IP数据报的速率,避免可能产生的差错。
    源站抑制技术进行拥塞控制的方法如下

    1. 当路由器放生拥塞时,便发出ICMP源站抑制报文。
    2. 源主机收到抑制报文后,按一定的速率降低发往目标主机的数据传输率。
    3. 如果在一定时间间隔内源主机没有收到抑制报文,便认为拥塞已经解除,源主机可以之间恢复到原来数据报的流量。

    路由控制与重定向报文
    假如源主机要向目标主机发送IP数据报,源主机默认路由是路由器1,则源主机先把IP数据报送到路由器1,再由路由器1进行路由选择。路由器1经过选路后,把IP数据报送到路由器2。
    同时路由器1也发现源主机要发送到目标主机的IP数据报以后可以直接发送到路由器2(因为路由器1和路由器2在同一个网络中)则由路由器1向源主机发送一个ICMP重定向报文,告诉它可以直接把IP数据报送到路由器2。这样,就使源主机始终保持着一个动态的、既小且优的路径表。

    请求与应答报文
    典型的有:ping程序使用回显请求和应答报文来确定一台主机是否可达;Tracert(linux下是traceroute)程序来确定通过网络的路由。

    n  ping直接使用ICMP,没有使用TCP或UDP

    n  tracert使用ICMP和UDP

    1. IP首部有个字段叫生存时间
      生存时间:IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。
    2. Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由(在判断是否达到目的主机时使用了UDP)。
      首先,tracert送出一个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1。此时,TTL变为0,所以该路由器会将此数据包丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),tracert 收到这个消息后,便知道这个路由器存在于这个路径上,接着tracert 再送出另一个TTL是2 的数据包,发现第2 个路由器...... tracert 每次将送出的数据包的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个数据包 抵达目的地。当数据包到达目的地后,该主机则不会送回ICMP time exceeded消息,一旦到达目的地,由于tracert通过UDP数据包向不常见端口(30000以上)发送数据包,因此会收到「ICMP port unreachable」消息,故可判断到达目的地。
  • 相关阅读:
    马士兵讲jsp项目--BBS项目分析笔记
    ubuntu 14.04中安装phpmyadmin即mysql图形管理界面
    Xman冬令营writeup
    python--gevent协程及协程概念
    python--multiprocessing多进程总结
    python--threading多线程总结
    浅析Java中print、printf、println的区别
    内存泄漏与内存溢出
    Java中==和equals的区别,equals和hashCode的区别
    vue五十七:电影院售票项目案例之使用swiper实现轮播功能
  • 原文地址:https://www.cnblogs.com/qingergege/p/7813689.html
Copyright © 2011-2022 走看看