您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > TCPIP详解-卷一-协议-11.11ICMP源站抑制差错
11.11ICMP源站抑制差错我们同样也可以使用UDP产生ICMP“源站抑制(sourcequench)”差错。当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生这个差错。注意限定词“可能”。即使一个系统已经没有缓存并丢弃数据报,也不要求它一定要发送源站抑制报文。图11-18给出了ICMP源站抑制差错报文的格式。有一个很好的方案可以在我们的测试网络里产生该差错报文。可以从bsdi通过必须经过拨号SLIP链路的以太网,将数据报发送给路由器sun。由于SLIP链路的速度大约只有以太网的千分之一,因此,我们很容易就可以使其缓存用完。下面的命令行从主机bsdi通过路由器sun发送100个1024字节长数据报给solaris。我们将数据报发送给标准的丢弃服务,这样,这些数据报将被忽略:bsdi%sock-u-i-w1024-n100solarisdiscard图11-19给出了与此命令行相对应的tcpdump输出结果在这个输出结果中,删除了很多行,这只是一个模型。接收前26个数据报时未发生差错;我们只给出了第一个数据报的结果。然而,从第27个数据报开始,每发送一份数据报,就会接收到一份源站抑制差错报文。总共有26+(74×2)=174行输出结果。图11-18ICMP源站抑制差错报文格式图11-19来自路由器sun的ICMP源站抑制从2.10节的并行线吞吐率计算结果可以知道,以9600b/s速率传送1024字节数据报只需要1秒时间(由于从sun到netb的SLIP链路的MTU为552字节,因此在我们的例子中,20+8+1024字节数据报将进行分片,因此,其时间会稍长一些)。但是我们可以从图11-19的时间中看出,sun路由器在不到1秒时间内就处理完所有的100个数据报,而这时,第一份数据报还未通过SLIP链路。因此我们用完其缓存就不足不奇了。尽管RFC1009[BradenandPostel1987]要求路由器在没有缓存时产生源站抑制差错报文,但是新的RouterRequirementsRFC[Almquist1993]对此作了修改,提出路由器不应该产生源站抑制差错报文。由于源站抑制要消耗网络带宽,且对于拥塞来说是一种无效而不公平的调整,因此现在人们对于源站抑制差错的态度是不支持的。在本例中,还需要指出的是,sock程序要么没有接收到源站抑制差错报文,要么接收到却将它们忽略了。结果是如果采用UDP协议,那么BSD实现通常忽略其接收到的源站抑制报文(正如我们在21.10节所讨论的那样,TCP接受源站抑制差错报文,并将放慢在该连接上的数据传输速度)。其部分原因在于,在接收到源站抑制差错报文时,导致源站抑制的进程可能已经中止了。实际上,如果使用Unix的time程序来测定sock程序所运行的时间,其结果是它只运行了大约0.5秒时间。但是从图11-19中可以看到,在发送第一份数据报过后0.71秒才接收到一些源站抑制,而此时该进程已经中止。其原因是我们的程序写入了100个数据报然后中止了。但是所有的100个数据报都已发送出去—有一些数据报在输出队列中。这个例子重申了UDP是一个非可靠的协议,它说明了端到端的流量控制。尽管sock程序成功地将100个数据报写入其网络,但只有26个数据报真正发送到了目的端。其他74个数据报可能被中间路由器丢弃。除非在应用程序中建立一些应答机制,否则发送端并不知道接收端是否收到了这些数据。类型(4)代码(0)检验和8字节未用(必须为0)IP首部(包括选项)+原始IP数据报中数据的前8字节
本文标题:TCPIP详解-卷一-协议-11.11ICMP源站抑制差错
链接地址:https://www.777doc.com/doc-2851584 .html