http://blog.csdn.net/weikanghuan/article/details/50825762?locationNum=6&fps=1
曾经看过这样的一道面试题,icmp报文是基于什么传输层协议进行传输的?顺着他的思路传输层的两个主要协议tcp和udp,区别也就是在于是否保障可靠性的传输。当时还没有系统的学习过ICMP的报文结构和组成,因此也没有过多思考,基于tcp。然而实际上来说,ICMP报文是不基于传输层的协议进行传输的,它只是对ip功能的一个补充。
ICMP报文通过ip报文发送,ICMP报文当做是ip数据包的数据部分,而IP数据包又被放倒了以太网的数据帧中的数据区。
我们知道ip数据报的首部有一个协议类型的字段,这个部分封装的是传输层的协议的类型,当ip数据部分为ICMP报文时,这里的首部协议类型字段也将改为1,表示为ICMP报文。
那么,ICMP到底是什么样的报文,它有什么用处吗?
首先,ICMP报文分为了三类:差错控制类,请求/应答类,通知类。这三类报文包括了所有的ICMP报文的类型。
我们先看看ICMP报文的结构:
icmp的不同的报文的类型中,首部的结构是确定的。其中校验和部分和ip首部的校验和的计算方法相同,并且这个计算方法贯穿于整个的icmp报文中。
类型1:差错空中类报文
发送差错控制类的报文的规则如下:
1. icmp差错控制报文的数据区包括发生差错的ip数据包的首部和数据区的至少前64bite。
2.仅能向数据包的源端发送差错控制报文,不能向中间的路由器报告差错。
3.当携带差错控制的报文发生差错时,不再报告差错。
4.对于进行了分片的ip数据包,紧能对第一个分片应用icmp协议。
1.目的站不可达
当路由器无法转发或者交付数据时,使用icmp报文通知数据包的发送者,并且告诉不可达的原因。
2.超时报文
发送超时报文的两种情况:1 TTL值为0
2 数据报分片重组超时。
3 参数错误报告
不是以上两种情况的错误时,就会向源主机报告此报文。
类型2:请求/应答类报文
1.回送请求和回送应答报文
测试网络的连通性的时候,可以用这种类型的报文,ping 的应用。
2.地址掩码请求和应答报文
当主机使用子网编码时,为了知道本网络中的子网掩码,主机可以向路由器发送地址掩码请求报文,路由器收到这个报文后,发送携带有掩码的应答报文。
(此时,主机可能知道路由器的IP地址,这时就直接发给路由器,也肯那个不知道ip地址,这时就要以广播的方式进行发送,路由器收到后再单播给主机。)
3.时戳请求和应答报文
4.路由器通告和路由器恳求报文
通告报文:是路由器在网络中定时的向主机发送自己存在的通告,告诉主机自己还在正常的运行着。
恳求报文:这个报文是主机发送的,用于需找默认的路由
(注意,这两种报文都是可以主动发送的,当一种报文发送后,另外的一种报文在接收方作为响应报文发送给发送方。)
类型3:单向通知控制类报文
1.源站抑制报文
这种报文产生的原因是:路由器接收的数据是有上限的,不能无限的接收,当路由器中缓冲区快满时,路由器会向源主机发送这种类型的报文,告诉主机要降低发送速度。如果一段时间内,源主机没有收到源站抑制的报文,就会提高发送速度。
2.重定向报文
路由器选路时,不一定都选择最近的路,优化路由选路。
我们回到开始提出的问题,icmp到底是基于什么传输层的协议的,答案是它根本不基于传输层的协议,只是封装在了ip数据包中。
icmp报文的应用:ping traceroute等。