速读原著-TCP/IP(ICMP不可达差错(需要分片))

第11章 UDP:用户数据报协议

11.6 ICMP不可达差错(需要分片)

发生I C M P不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在 I P首部又设置了不分片(D F)的标志比特。如果某个程序需要判断到达目的端的路途中最小 M T U是多少—称作路径M T U发现机制(2 . 9节),那么这个差错就可以被该程序使用。

这种情况下的I C M P不可达差错报文格式如图 11 – 9所示。这里的格式与图 6 – 1 0不同,因为在第2个32 bit字中,16~31 bit可以提供下一站的M T U,而不再是0。

如果路由器没有提供这种新的 I C M P差错报文格式,那么下一站的 M T U就设为0。新版的路由器需求RFC [Almquist 1993]声明,在发生这种I C M P不可达差错时,路由器必须生成这种新格式的报文。

例子 关于分片作者曾经遇到过一个问题, I C M P差错试图判断从路由器n e t b到主机s u n之间的拨号S L I P链路的M T U。我们知道从s u n到n e t b的链路的M T U:当S L I P被安装到主机s u n时,这是S L I P配置过程中的一部分,加上在 3 . 9节中已经通过n e t s t a t命令观察过。现在,我们想从另一个方向来判断它的M T U(在第2 5章,将讨论如何用S N M P来判断)。在点到点的链路中,不要求两个方向的M T U为相同值。

所采用的技术是在主机 s o l a r i s上运行p i n g程序到主机b s d i,增加数据分组长度,直到看见进入的分组被分片为止。如图 11 – 1 0所示。

在主机s u n上运行t c p d u m p,观察S L I P链路,看什么时候发生分片。开始没有观察到分片,一切都很正常直到 p i n g分组的数据长度从5 0 0增加到6 0 0字节。可以看到接收到的回显请求(仍然没有分片),但不见回显应答。

为了跟踪下去,也在主机 b s d i上运行 t c p d u m p,观察它接收和发送的报文。输出如图11 – 11所示。

首先,每行中的标记( D F)说明在I P首部中设置了不分片比特。这意味着 Solaris 2.2 一般把不分片比特置1,作为实现路径M T U发现机制的一部分。

第1行显示的是回显请求通过路由器 n e t b到达s u n主机,没有进行分片,并设置了 D F比特,因此我们知道还没有达到 n e t b的SLIP MTU。

接下来,在第2行注意到D F标志被复制到回显应答报文中。这就带来了问题。回显应答与回显请求报文长度相同(超过 6 0 0字节),但是s u n外出的S L I P接口M T U为5 5 2。因此回显应答需要进行分片,但是 D F标志比特又被设置了。这样, s u n就产生一个I C M P不可达差错报文返回给b s d i(报文在b s d i处被丢弃)。

这就是我们在主机 s o l a r i s上没有看到任何回显应答的原因。这些应答永远不能通过s u n。分组的路径如图11 – 1 2所示。

最后,在图11 – 11中的第3行和第6行中,m t u = 0表示主机s u n没有在I C M P不可达报文中返回出口M T U值,如图11 – 9所示(在2 5 . 9节中,将重新回到这个问题,用 S N M P判断n e t b上的S L I P接口M T U值为1 5 0 0)。