zoukankan      html  css  js  c++  java
  • ICMP(网际控制报文协议)

    ICMP(Internet Control Message Protocol)运行在网络层,其目的为了更有效的转发IP数据报和提高交付成功的机会。

    ICMP协议的格式

    使用wireshark抓取含有ICMP的数据报:

    ICMP报文作为IP数据报的数据部分来传输,在ICMP报文中含有一下字段:

    字段名 描述
    Type 占1个字节,标识ICMP报文的类型
    Code 占1个字节,标识对应ICMP报文的代码
    Checksum 占2个字节,校验包括数据在内的整个ICMP数据包
    Identifier 占2个字节,用于标识本ICMP进程
    Sequence Number 占2个字节,用于标识请求、响应报文

    其中,标识符(Identifier)与序列号(Sequence Number)的值取决于ICMP报文的类型。

    ICMP报文的种类

    ICMP报文种类 类型的值 ICMP报文的类型
    差错报告报文 3 终点不可达
    11 时间超过
    12 参数问题
    5 改变路由(redirect)
    询问报文 8或5 回显(echo)请求或回答
    13或14 时间戳(Timestamp)请求或回答

    其中,所有的ICMP差错报告报文中的数据字段都具有如下图所示的格式。把需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上ICMP报文的前8个字节。

    ICMP应用

    Ping

    在MS DOS中使用ping命令:

    使用wireshark抓包:

    在输入ping hostname之后,连续发送4个ICMP回显请求报文,并等待ICMP回显应答。
    使用Ping可以测试网络的连通性,还能测出两台主机间的往返时间,以表明两者的距离。

    Tracert

    在MS DOS中使用tracert命令:

    使用wireshark抓包:

    在输入tracert hostname之后,源主机向目的主机发送一连串的IP数据报,该数据包中封装的是“无法交付”的UDP用户数据报。
    第一个数据报(P_1)TTL设置为1。当(P_1)到达路径上的第一个路由器(R_1)时,该路由器收下(P_1),接着将TTL的值减1。由于TTL的的值变为了0,(R_1)将该数据报丢弃然后向源主机发送一个超时ICMP差错报告报文。
    源主机接受到ICMP差错报告报文,便发送第二个数据报(P_2),设置其TTL的值为2,当(P_2)被路径上的第二个路由器(R_2)接收后,TTL的值变为0,(R_2)丢弃该数据报并向源主机发送超时ICMP差错报告报文。就这样一直下去,直到最后一个数据报到达目的地址,由于IP数据报中封装的是“无法交付”的UDP数据报,目的主机源主机发送一个终点不可达ICMP差错报告报文。
    通过上述操作,源主机得到了到达目主机所经过的路由器的IP地址,以及到达每个路由器的往返时间。

    对“无法交付”的UDP用户数据报的解释
    所谓“无法交付”,是指让发送的UDP报文故意使用一个错误的端口,在该报文到达目的主机后被丢弃,目的主机向源主机发送终点不可达ICMP差错报告报文。

    总结

    ICMP协议位于网络层,在网络层的抽象上提供了差错报告服务,为传输层的实现提供了基础。

    本文介绍了:

    • ICMP报文的格式
    • ICMP报文的类型(差错报文与询问报文)
    • ICMP的应用(Ping与Tracert)
    CS专业在读,热爱编程。
    专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
  • 相关阅读:
    Android开源项目收藏
    ubuntu修改ip获取方式(静态,动态)
    linux内核调用用户空间程序
    linux 改变目录下所有文件及其子文件夹下的权限
    jquery remove() empty()
    jquery之attr()和removeAttr() prop的使用场所
    jquery 获取对象的八种总结
    html子标签浮动父标签无法扩充
    静态代码块
    java static介绍
  • 原文地址:https://www.cnblogs.com/jmhwsrr/p/14099762.html
Copyright © 2011-2022 走看看