zoukankan      html  css  js  c++  java
  • TCP/IP的网际层协议——ICMP

    ICMP经常被认为是IP层的一个组成部分。它携带于IP数据包中,ICMP封装在IP数据包内部:

    IP首部 ICMP数据包

    下面是一份差错报文的例子:

    最右边的+或者-代表该报文是查询报文还是错误报文。


    ICMP的功能介绍:
    ICMP定义了一套差错报文查询报文,用于主机与路由器之间交换不可达目的地址、网络拥塞、重定向到更好的路径、报文生命周期超时等信息。
    例如,用ping命令来查询192.168.10.1的主机是否在线,路由器会给用户一个ICMP应答:目标主机不可到达或者从192.168.10.1有回应。
    ICMP报文主要有两大类:查询报文和错误报文。
    查询报文是指ICMP响应请求、相应回答、路由公告、地址屏蔽请求等。
    而绝大部分ICMP信息是错误报文,例如,目的地址不可到达、源地址消亡、生命周期超期等。
     
    目标地址是广播地址或多播地址(D类地址)的IP数据包不会产生ICMP错误报文,这是为了防止ICMP错误报文对广播分组的响应而带来的广播风暴。

    ICMP不可到达差错报文的原因及分析:
    ICMP不可到达的报文类型值为3,可以依据不同的代码值识别到底是因为什么不可达。下面根据代码值举几个例子:
    (1)网络不可到达(不细说)
    (2)主机不可到达(不细说)
    (3)禁止分割:
       在MTU较小的网络上,需要把大数据包划分成更小的数据包片(分片),以保证数据包正常通过网络。
       假如路由器A在将客户端的数据发往服务器时,需要分割客户机的数据包,但是数据包的IP头中的IP头中即设置了拒绝分片位,那么路由器将会向客户机返回一个代码为4的“禁止分割”的ICMP信息。
     
    以上3种信息都是有路由器发送的。
     
    (4)协议不可到达
       如果数据包成功地到达了Web服务器,但是服务器上没有运行TCP或者UDP协议(基本上不可能有有种情况),那么Web服务器将返回一个代码为2的“协议不可到达”的ICMP消息。
     
    (5)端口不可到达
       如果数据包成功地到达了Web服务器,服务器上也运行有TCP协议,但是服务器上的相关软件还没有运行,无法处理客户机的连接,于是 服务器上的TCP/IP将返回一个代码为3的“端口不可到达”的ICMP消息。

    以上两种信息是由主机发送的。

    代码描述 场合 发送方
    目标网络不可到达 路由表中无目标网络 路由器
    目标主机不可到达 主机无响应 路由器
    禁止分割 需要进行分割但设置了不分割个比特位 路由器
    协议不可到达 主机上无相关的传输层协议(TCP、UDP) 主机
    端口不可到达 目标端口没有被应用程序打开 主机

    ICMP超时的原因分析:
    超时ICMP报文与IP报头中TTL字段一起使用。下面接单介绍一下“传输期间TTL值为0”的代码。
    当数据包到达路由器时,路由器都需要把数据包IP头中的TTL减1.当TTL值被减到0时,数据包就会被丢弃。此时丢弃这个包的路由器会返回一个代码为“传输期间TTL值为0”的ICMP消息给原始发送者。
    TTL值可以防止数据包在网络上被循环往复地传输。例如,当发生路由回路时,数据包可能在回路上被一直循环地传输。但是TTL字段的值都会减1,因此当TTL值减为0时,循环就会被自动丢失。
  • 相关阅读:
    core mvc 分页
    core下的routelink
    python 3使用binascii方法的报错解决
    汉字乱码处理
    DLL的调用方法
    Python内置函数清单
    Linux 几种上传文件到linux服务的方法
    在VS中添加lib的第三种方法
    Bash Shell 数字/字符比较大小
    虚拟Linux服务器不能获取IP的解决办法
  • 原文地址:https://www.cnblogs.com/stemon/p/4717510.html
Copyright © 2011-2022 走看看