2.icmp介绍
icmp经常被人为是ip层的一个组成部分。它传递差错报文以及其他需要注意的信息。icmp报文通常被ip层或更高层协议(tcp或udp)使用。一些icmp报文把差错报文返回给用户进程。
icmp报文是在ip数据报内部被传输的。
icmp报文的格式如图6-2所示。所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同,下面我们逐个介绍各种报文格式。
类型字段可以有15个不同的值,以描述特定类型的icmp报文,某些icmp报文还适用代码字段的值来进一步描述不同的条件。
检验和字段覆盖整个icmp报文,适用的算法与我们在3.2节中介绍的ip首部检验和算法相同。icmp的检验和是必需的。
icmp封装在ip数据报内部
icmp报文的类型
1.主机不可达
2.端口不可达
3.需要分片但设置了不分片比特
4.源站选路失败
5.由于过滤,通讯被强制禁止
6.重定向
icmp报文的类型(续)
不同类型由报文中的类型字段和代码字段来共同决定。
图中的最后两列表明icmp报文是一份查询报文还是一份差错报文。
当发送一份icmp差错报文时,报文始终包含ip的首部的产生icmp差错报文的ip数据报的前8个字节。这样,接受icmp差错报文的模块就会把它与某个特定的协议(根据ip数据报首部中的协议字段来判断)和用户进程(根据包含在ip数据报前8个字节中的tcp或udp报文首部中的tcp或udp端口号来判断)联系起来。
icmp差错报文
下面各种情况都不会导致产生icmp差错报文
1.icmp差错报文(但是,icmp查询报文可能会产生icmp差错报文。
2.目的地址是广播地址(见图3-9)或多播地址(d类地址,见图1-5)的ip数据报
3.作为链路层广播的数据报。
4.不是ip分片的第一片(将在11.5节介绍分片)
5.源地址不是单个主机的数据报,这就是说,源地址不能为零地址、换回地址、广播地址或多播地址。
这些规则是为了防止过去允许icmp差错报文对广播分组相应所带来的广播风暴。
icmp差错报文结构
当icmp报文返回时,为什么tftp客户程序还要继续重发请求呢,这是由于网络编程中的一个因素,即bsd系统不把从插口(socket)接收到的icmp报文中的udp数据通知用户进程,除非该进程已经发送了一个connect命令给该接口,标准的bsd tftp客户程序并不发送connect命令,因此永远不会受到icmp差错报文通知。
icmp端口不可达差错
最后两小结我们来讨论icmp查询报文--地址掩码和时间戳查询及应答,现在来分析一种icmp差错报文,即端口不可达报文,它是icmp目的不可到达报文中的一种,以此来看一看icmp差错报文中所附加的信息。
可以用tftp来强制生成一个端口不可达报文
3.ping介绍
ping这个名字源于声纳定位操作。ping程序由mike muuss编写,目的是为了测试另一台主机是否可达,该程序发送一份icmp回显请求报文给主机,并等待返回icmp回显应答。
可以用ping程序来确定问题出在哪里,ping程序还能测出到这台主机的往返时间,以表明该主机离我们有多远。
一台主机的可达性可能不只取决于ip层是否可达,还取决于使用何种协议以及端口号,ping程序的运行结果可能显示某台主机可不达,但我们可以用telnet远程登录到该主机的25号端口。
ping程序
我们称发送回显请求的ping程序为客户,而称被ping的主机位服务器,大多数的tcp/ip实现都在内核中直接支持ping服务器--这种服务器不是一个用户进程(在第6章中描述的两种icmp查询服务,地址掩码和时间戳请求,也都是直接在内核中进行处理的)
对于其他类型的icmp查询报文,服务器必须相应标示符和序列号字段,另外,客户发送的选项数据必须回显,假设客户对这些信息都会感兴趣。
unix系统在实现ping程序时是把icmp报文中的标示符字段置为成发送进程的id号,这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回信息。
在windows下,不管开多少个窗口ping的identifier都是相同的,而且每增加一个出去的ping包序列号增加256.(他能分清楚回来的包吗???)
标签:ip,报文,ping,介绍,差错,主机,icmp From: https://www.cnblogs.com/smoke520/p/18359988