浅析ICMP协议
来源:互联网 发布:诚意致知格物顺序 编辑:程序博客网 时间:2024/05/27 02:31
ICMP(Internet Control Message Protocol)是Internet控制报文协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。例如我们都知道IP 协议是不可靠协议,不能保证 IP 数据报能够成功的到达目的主机,无法进行差错控制,而 ICMP 协议能够协助 IP 协议完成这些功能。
(一)ICMP报文格式及类型
类型:一个 8 位类型字段,表示 ICMP 数据包类型;
代码:一个 8 位代码域,表示指定类型中的一个功能,如果一个类型中只有一种功能,代码域置为 0;检验和:数据包中 ICMP 部分上的一个 16 位检验和;
ICMP 报文类型
ICMP 报文大致可分为两类:差错报文、查询报文。具体消息类型如下表所示:
ICMP 差错报文
当发送一份差错报文时,报文始终包含 IP 的首部和产生 ICMP 差错报文的 IP 数据报的前 8 位字节。这样,接收 ICMP 差错报文的模块就会把它与某个特定的协议(根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含在 IP 数据报前 8 个字节中的 TCP 或 UDP 报文首部中的 TCP 或 UDP 端口号来判断)联系起来。
下面各种情况不会导致产生 ICMP 差错报文:
ICMP 报文差错(ICMP查询报文可能会产生ICMP差错报文);
目的地址是广播地址或多播地址的 IP 数据报;
作为链路层广播的数据报;
不是 IP 分片的第一片;
源地址不是单个主机的数据报,也就是说,源地址不可能是零地址、环回地址、广播地址或多播地址;
以下针对 ICMP 差错报文的类型进行分析:
1、ICMP 目标不可达消息:IP 路由器无法将 IP 数据报发送给目的地址时,会给发送端主机返回一个目标不可达 ICMP 消息,并在这个消息中显示不可达的具体原因。
2、ICMP 重定向消息:如果路由器发现发送端主机使用次优的路径发送数据时,那么它会返回一个 ICMP 重定向消息给这个主机,这个消息包含了最合适的路由信息和源数据。主要发生在路由器持有更好的路由信息的情况下,路由器会通过这个 ICMP 重定向消息给发送端主机一个更合适的发送路由。
3、ICMP 超时消息:IP 数据包中有一个字段 TTL(Time to live,生存周期),它的值随着每经过一个路由器就会减 1,直到减到 0 时该 IP 数据包被丢弃。此时,IP 路由器将发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。
4、源抑制消息:当 TCP/IP 主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个 ICMP 源抑制消息。
ICMP 查询报文
----ICMP 回送消息:用于进行通信的主机或路由之间,判断发送数据包是否成功到达对端的消息。可以向对端主机发送回送请求消息,也可以接收对端主机回来的回送应答消息。
----ICMP 地址掩码消息:主要用于主机或路由想要了解子网掩码的情况。可以向那些主机或路由器发送 ICMP 地址掩码请求消息,然后通过接收 ICMP 地址掩码应答消息获取子网掩码信息。
----ICMP 时间戳消息:可以向那些主机或路由器发送 ICMP 时间戳请求消息,然后通过接收 ICMP 时间戳应答消息获取时间信息。
Ping 程序
Ping 程序利用 ICMP 回显请求报文和回显应答报文(而不用经过传输层)来测试目标主机是否可达。它是一个检查系统连接性的基本诊断工具。
ICMP 回显请求和 ICMP 回显应答报文是配合工作的。当源主机向目标主机发送了 ICMP 回显请求数据包后,它期待着目标主机的回答。目标主机在收到一个 ICMP 回显请求数据包后,它会交换源、目的主机的地址,然后将收到的 ICMP 回显请求数据包中的数据部分原封不动地封装在自己的 ICMP 回显应答数据包中,然后发回给发送 ICMP 回显请求的一方。如果校验正确,发送者便认为目标主机的回显服务正常,也即物理连接畅通。
例如:在终端上 Ping 下谷歌的地址,神奇的发现谷歌地址既然不用翻墙都能上了,而且丢包率 0%。
1. $ ping www.google.com
2. PING www.google.com (173.194.127.148) 56(84) bytes of data.
3. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=1 ttl=48 time=11.0 ms
4. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=2 ttl=48 time=10.8 ms
5. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=3 ttl=48 time=11.1 ms
6. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=4 ttl=48 time=10.8 ms
7. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=5 ttl=48 time=11.1 ms
8. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=6 ttl=48 time=11.0 ms
9. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=7 ttl=48 time=10.5 ms
10. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=8 ttl=48 time=9.96 ms
11. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=9 ttl=48 time=10.9 ms
12. ^C
13. --- www.google.com ping statistics ---
14. 9 packets transmitted, 9 received, 0% packet loss, time 8009ms
15. rtt min/avg/max/mdev = 9.963/10.830/11.123/0.368 ms
Traceroute 程序
Traceroute 程序主要用来侦测源主机到目的主机之间所经过的路由的情况。
Traceroute 使用 ICMP 报文和 IP 首部中的 TTL 字段,它充分利用了 ICMP 超时消息。其原理很简单,开始时发送一个 TTL 字段为 1 的 UDP 数据报,而后每次收到 ICMP 超时萧后,按顺序再发送一个 TTL 字段加 1 的 UDP 数据报,以确定路径中的每个路由器,而每个路由器在丢弃 UDP 数据报时都会返回一个 ICMP 超时报文,而最终到达目的主机后,由于 ICMP选择了一个不可能的值作为 UDP 端口(大于30000)。这样目的主机就会发送一个端口不可达的 ICMP 差错报文。
以上部分内容转自:http://network.chinabyte.com/23/13155523.shtml
(二)常见的ICMP报文
1、响应请求
我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的traceroot通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。
2、目标不可到达、源抑制和超时报文
这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。
3、时间戳
时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。
(三)lwIP ICMP协议分析
ICMP协议分析
- ICMP 数据结构
类型8的回显请求
struct icmp_echo_hdr {
u16_t _type_code;
u16_t chksum;
u16_t id;
u16_t seqno;
};
类型3的目的不可达应答
struct icmp_dur_hdr {
u16_t _type_code;
u16_t chksum;
u32_t unused;
};
类型11的超时应答
struct icmp_te_hdr {
u16_t _type_code;
u16_t chksum;
u32_t unused;
};
- ICMP 处理函数
void icmp_input(struct pbuf *p, struct netif *inp);
lwIP ICMP只接受类型为8的ECHO。函数首先从pbuf中去除IP头,获得ICMP头。只有当type为ECHO时才处理。
首先忽略源ip为广播或多播的分组(ICMP协议规定)。检查校验和是否正确。然后准备回显分组,其实就是将接受到的分组的IP源/目的地址交换,设置ICMP报头类型为0,重新计算校验和。最后发送ECHO回应。
void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t);
发送主机不可达的ICMP回应。分配一个IP分组缓冲区,然后填充成ICMP错误报文。再交至ip_output发送。
该函数被ip_input及udp_input调用,来处理ip头中无效protocol域,发送无效协议ICMP及UDP包的目的地址是广播或多播地址,发送端口不可达ICMP分组。
void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t);
发送TTL超时错误报文,和icmp_dest_unreach处理方式一样。
该函数被ip_forward调用,如果TTL为0,则发送超时ICMP分组
参考链接:http://network.chinabyte.com/23/13155523.shtml
http://blog.sina.com.cn/s/blog_62a85b950101anyl.html
http://blog.csdn.net/snlying/article/details/4211396
http://blog.chinaunix.net/u/14459/showart_77759.html
- 浅析ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- icmp协议
- ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- ICMP协议
- icmp协议
- ICMP协议
- Android个人笔记 - Google Android揭秘_第一章
- 蚁群系统解决TSP问题
- 【C/C++学院】0801-重定向以及文件扫描/二进制加密解密/简单加密/按照密码加密/动态库与静态库
- Unity优化
- Android之 系统启动流程
- 浅析ICMP协议
- HP Storageworks MSA2312 基礎應用
- 【iOS开发】使用Paros监控iPhone发出的HTTP请求
- Xcode查看真机app沙盒内容
- c# 字节流与图片互转
- mac 下安装 CASPERJS
- JS清除IE浏览器缓存的方法
- 无刷新分页 jquery.pagination.js
- 避免长期持有了一个Context的引用造成内存泄露