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.(他能分清楚回来的包吗???)