文档章节

6_ICMP

pp__qq
 pp__qq
发布于 2014/06/25 18:57
字数 1240
阅读 21
收藏 0
  • ICMP 报文由 IP 层负责传输,ICMP 报文的格式如下:

类型: 1 byte,用于指定 ICMP 报文的类型.
代码: 1 byte,用于进一步描述 ICMP 报文为何生成.
检验和: 2 bytes,使用的算法与 IP 首部检验和算法相同,覆盖了整个 ICMP 报文.
其他内容: 不同类型和代码的 ICMP 报文有不同的内容.

ICMP 目的不可达

  • 报文格式:

    1. 类型: 1 byte,取值为 3.

    2. 代码: 1 byte,取值为 [0,16)

    3. 检验和: 2 byte,

    4. 未用位: 4 byte,必须置 0,但当代码字段的值为4('需要分片但设置了不分片比特')时,允许路由器把外出接口的 MTU 填在这个32 bit字的低 16 bit中.

    5. 引起该 ICMP 差错报文的 IP 数据包的IP 首部(包括选项)+数据部分的前8字节(正好将 TCP,UDP 的端口号也包含了其中).

ICMP 回显

  • ICMP 回显请求,应答报文的格式:

类型: 1 byte
代码: 1 byte
检验和: 2 byte
标识符: 2 byte
序列号: 2 byte
额外的数据

请求报文的取值:{8;0;算法生成;任意设置;任意设置;...}
应答报文的取值:{0;0;算法生成;不变;不变;不变}

ICMP 地址掩码请求/应答

  • 用于无盘主机在引导过程中获取自己所处子网的子网掩码.此时分组格式:

ICMP 地址掩码格式:
类型: 1 byte,
代码: 1 byte,
检验和: 2 byte,
标识符: 2 byte,
序列号: 2 byte,
子网掩码: 4 byte.
请求格式:{17;0;算法生成;可能是随机生成;可能是随机生成;0}
应答格式:{18;0;算法生成;不变;不变;子网掩码}

    • 其中应答格式中的'子网掩码'必须是必须是'收到 ICMP 地址掩码请求'的网络接口的子网掩码,因为一个主机可能具有多个网络接口,每一个网络接口具有不同的掩码,如:

# icmpaddrmask 用于向主机名为 argv[1] 的主机发送 ICMP 地址掩码请求
sun$ icmpaddrmask sun  # 此时 ICMP 地址掩码请求会转交给环回接口,所以返回的是环回接口的地址掩码.
received mask= ff000000, from 140.252.13.33
sun$ icmpaddrmask localhost # 此时 ICMP 地址掩码请求直接交给环回接口,
received mask= ff000000, from 127.0.0.

ICMP 时间戳请求/应答

  • 允许主机向另一个主机查询当前的时间,下面的'时间戳'是指自午夜(不是 1900-01-01 00:00:00 了)开始计算的毫秒数,协调的统一时间 UTC.此时 ICMP 报文格式:

类型: 1 byte,
代码: 1 byte,
检验和: 2 byte,
标识符: 2 byte,
序列号: 2 byte,
发起时间戳: 4 byte
接受时间戳: 4 byte
传送时间戳: 4 byte

# 请求格式:
{13;0;算法生成;可能是随机生成;可能是随机生成;发送'ICMP 时间戳请求报文'时的时间戳;0(TODO 不确定),0 }
# 应答格式:
{14,0,算法生成,不变,不变,不变,接受到'ICMP 时间戳请求报文'时的时间戳,发送'ICMP 时间戳应答报文'时的时间戳};

  • 根据 ICMP 时间戳应答报文的内容与 RTT 调整时间:

var orig; /* 发起时间戳 */
var recv; /* 接受时间戳 */
var xmit; /* 传送时间戳 */  
var rtt;  /* RTT,往返时间,假设 RTT 的一半用于请求报文的传输,另一半用于应答报文的传输 */
则本机时间应该加上 recv-(orig+rtt/2);

若干个概念

  • 日期服务程序,以人们可读的格式返回当前的时间和日期,是一行 ASCII 字符.

  • 时间服务程序,返回的是一个 32 bit 的二制进数值,表示自 UTC,1900年1月1日午夜起算的秒数

  • NTP,采用先进的技术来保证 LAN 或 WAN 上的一组主机的时钟误差在毫秒级以内.

BSD 系统对 ICMP 报文的处理

  • 仅当作一个参考.对处理方法的解释:

    • 若处理方法指明为'用户进程',则报文就被传送到所有在内核中登记的用户进程,以读取收到的 ICMP 报文.如果不存在任何这样的用户进程,那么报文就悄悄地被丢弃

    • 若处理方法指明为'内核',则 ICMP 报文就由内核来处理,在处理完毕之后,内核会将该 ICMP 报文拷贝给'感兴趣'的用户进程(即已经在内核中登记的用户进程)

    • 标明的是引号内的一串字符,那么它就是对应的 Unix 差错,即 errno 的字符串描述.如当内核收到类型为3,代码为3的 ICMP 差错报文时,内核会根据差错报文中带有的端口号来找到引起差错的用户进程,然后让该用户进程中的 errno 变量取值为'连接被拒绝'.



© 著作权归作者所有

上一篇: TCP/IP程序工具
下一篇: 4-5_ARP,RARP
pp__qq
粉丝 17
博文 66
码字总数 97223
作品 0
合肥
程序员
私信 提问
每天一个linux命令(54):ping命令

Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”、不能打开网页时会说“你先ping网关地址192.168.1.1试试”。它通过...

长平狐
2013/06/17
71
0
GIT@OSC ping 不通,看起来像是dns问题。

我在ucloud 的服务器里面下载代码的时候出现的问题。 [liubing@server ~]$ ping git.oschina.net PING git.oschina.net (124.202.141.153) 56(84) bytes of data. ^C --- git.oschina.net p......

iflamed
2015/05/24
465
1
6.ICMP:Internet控制报文协议

介绍 ICMP通常被认为是IP层的组成部分。它用来传送差错报文以及一些需要注意的信息,通常被IP层、TCP层、UDP层使用,偶尔也被用户层使用 ICMP报文 ICMP报文是放在IP数据报中进行传输 ![imag...

loda0128
2018/07/08
14
0
ping 与 straceroute

ping 命令是通过 ICMP 测试数据包 [air@air ~]$ ping www.baidu.com PING www.a.shifen.com (111.13.100.91) 56(84) bytes of data. 64 bytes from 111.13.100.91: icmp_req=1 ttl=55 time=......

昏鸦
2014/02/27
167
0
透析ICMP协议

对于熟悉网络的人来说, ICMP是再熟悉不过了. 它同IP协议一样工作在ISO模型的网络层, 它的全称是: Internet Control Message Protocal. 其在网络中的主要作用是: - 主机探测 - 路由维护 - 路由...

长平狐
2012/09/03
102
1

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部