【网络层】网际控制报文协议 ICMP
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议。ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告,它是互联网的标准协议。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。ICMP报文格式下图所示。
目录
2、ICMP 的应用:ping命令,traceroute/tracert命令
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP(Intermet Control Message Protocol)。
ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告,它是互联网的标准协议。
ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。ICMP 报文格式下图所示。
1、ICMP 报文的种类
ICMP 报文有两种,即 ICMP 差错报告报文和 ICMP 询问报文。
ICMP 报文的前 4 字节(0-31)是统一的格式,共有三个字段:类型、代码和检验和。接着的 4 字节的内容与 ICMP 的类型有关。最后面是数据字段,其长度取决于 ICMP 的类型。下表给出了几种常用的 ICMP 报文类型:
差错报告报文类型:
(1)终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
(2)时间超过:当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
(3)参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
(4)改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器。也就是说,找到了更好的路由。
ICMP差错报告报文的数据字段的内容构成:
所有的 ICMP 差错报告报文中的数据字段都具有同样的格式,如下图所示:
把收到的需要进行差错报告的 IP 数据报的首部和数据字段的前 8 个字节提取出来,作为 ICMP 报文的数据字段。再加上相应的 ICMP 差错报告报文的前 8个字节,就构成了 ICMP 差错报告报文。
提取收到的数据报的数据字段前 8 个字节是为了得到运输层的端口号以及运输层报文的发送序号,这些信息对源点通知高层协议是有用的。
ICMP 询问报文类型:
(1)回送请求或回送回答:ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。// ping
(2)时间戳请求或时间截回答:在 ICMP 时间截请求报文发出后,就能够收到对方响应的 ICMP 时间戳回答报文。利用在报文中记录的时间戳(如报文的发送时间和接收时间),发送方很容易计算出当前网络的往返时延。
2、ICMP 的应用:ping命令,traceroute/tracert命令
(1)分组网间探测 PING(Packet InterNet Groper):
ICMP 的一个重要应用就是分组网间探测 PING(Packet InterNet Groper),用来测试两台主机之间的连通性。PING 使用了 ICMP 回送请求与回送回答报文。PING 是应用层直接使用网络层ICMP 的一个例子,它没有通过运输层的 TCP 或 UDP。
如上图,给出了上海一台 PC 到百度 www.baidu.com 的连通性的测试结果。PC 一连发出 4 个 ICMP 回送请求报文。百度如果正常工作而且响应这个 ICMP 回送请求报文,那么它就发回 ICMP 回送回答报文。
由于往返的 ICMP 报文上都有时间戳,因此很容易得出往返时间。最后显示出的是统计结果:发送到哪个机器(IP 地址),发送的、收到的和丢失的分组数(但不给出分组丢失的原因),以及往返时间的最小值、最大值和平均值。
补充:
一般 ping 局域网的时间不超过 10ms,否则可能存在局域网拥堵问题。一般 ping 的目标距离越远,延迟时间也就越长。
TTL 表示发送数据包的生存周期,数据包每经过一个路由器,TTL 值减 1,当 TTL 值为 0 时,网络不会再继续转发该数据包,该数据包就会在网络中消失,此方法用来解决数据包在网络中无限循环的问题。
各类型系统的 TTL 初始数:Linux(64)、Windows(128)、Unix(255)
(2)traceroute / tracert 命令:
traceroute(UNIX) / tracert(Win) 命令,用来跟踪一个分组从源点到终点的路径。
下面简单介绍这个命令的工作原理:
tracert 从源主机向目的主机发送一连串的 IP 数据报,数据报中封装的是无法交付的 UDP 用户数据报。//无法交付的UDP用户数据报使用了非法的端口号
第一个数据报 IP 的生存时间 TTL 设置为 1。当 P1 到达路径上的第一个路由器 R1 时,路由器 R1 先收下它,接着把 TTL 的值减 1。由于 TTL 等于零了,因此 R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文。
源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达路由器 R1,R1 收下后把 TTL 减 1 再转发给路由器 R2。R2 收到 P2 时 TTL 为 1,但减 1 后 TTL 变为零了。R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报告报文。
这样一直继续下去。当最后一个数据报刚刚到达目的主机时,数据报的 TTL 是 1。主机不转发数据报,也不把 TTL 值减 1。但因 IP 数据报中封装的是无法交付的运输层的 UDP 用户数据报,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
这样,源主机达到了自己的目的,因为这些路由器和最后目的主机发来的 ICMP 报文正好给出了源主机想知道的路由信息:到达目的主机所经过的路由器的 IP 地址,以及到达其中的每一个路由器的往返时间。
如上图所示,每一行有三个时间出现,是因为对应于每一个 TTL 值,源主机要发送三次同样的 IP 数据报。//整个过程,可见 tracert 从源主机向目的主机发送了大量的 IP 数据报
那么,tracert 跟踪结果时,出现了请求超时的情况是怎么回事?这可能由多种原因引起的,比如网络拥塞、网络延迟、又或者是一些网络设备可能被配置为限制对特定类型的 ICMP 请求的响应,从而可能导致 tracert 的某些节点无法获取回应。
至此,全文结束。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)