速读原著-TCP/IP(UDP检验和)

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

11.3 UDP检验和

U D P检验和覆盖U D P首部和U D P数据。回想I P首部的检验和,它只覆盖 I P的首部—并不覆盖I P数据报中的任何数据。

U D P和T C P在首部中都有覆盖它们首部和数据的检验和。 U D P的检验和是可选的,而T C P的检验和是必需的。

尽管U D P检验和的基本计算方法与我们在 3 . 2节中描述的 I P首部检验和计算方法相类似(16 bit字的二进制反码和),但是它们之间存在不同的地方。首先, U D P数据报的长度可以为奇数字节,但是检验和算法是把若干个 16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。

其次,U D P数据报和T C P段都包含一个 1 2字节长的伪首部,它是为了计算检验和而设置的。伪首部包含 I P首部一些字段。其目的是让 U D P两次检查数据是否已经正确到达目的地(例如, I P没有接受地址不是本主机的数据报,以及 I P没有把应传给另一高层的数据报传给U D P)。U D P数据报中的伪首部格式如图 11 – 3所示。

在该图中,我们特地举了一个奇数长度的数据报例子,因而在计算检验和时需要加上填充字节。注意,U D P数据报的长度在检验和计算过程中出现两次。

如果检验和的计算结果为 0,则存入的值为全 1(6 5 5 3 5),这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。

如果发送端没有计算检验和而接收端检测到检验和有差错,那么 U D P数据报就要被悄悄地丢弃。不产生任何差错报文(当 I P层检测到I P首部检验和有差错时也这样做)。

U D P检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现U D P首部和数据在发送端到接收端之间发生的任何改动。

尽管U D P检验和是可选的,但是它们应该总是在用。在 8 0年代,一些计算机产商在默认条件下关闭U D P检验和的功能,以提高使用 U D P协议的N F S(Network File System)的速度。

在单个局域网中这可能是可以接受的,但是在数据报通过路由器时,通过对链路层数据帧进行循环冗余检验(如以太网或令牌环数据帧)可以检测到大多数的差错,导致传输失败。不管相信与否,路由器中也存在软件和硬件差错,以致于修改数据报中的数据。如果关闭端到端的U D P检验和功能,那么这些差错在 U D P数据报中就不能被检测出来。另外,一些数据链路层协议(如S L I P)没有任何形式的数据链路检验和。

Host Requirements RFC声明,U D P检验和选项在默认条件下是打开的。它还声明,如果发送端已经计算了检验和,那么接收端必须检验接收到的检验和(如接收到检验和不为0)。但是,许多系统没有遵守这一点,只是在出口检验和选项被打开时才验证 接收到的检验和。

11.3.1 tcpdump输出

很难知道某个特定系统是否打开了 U D P检验和选项。应用程序通常不可能得到接收到的U D P首部中的检验和。为了得到这一点,作者在 t c p d u m p程序中增加了一个选项,以打印出接收到的U D P检验和。如果打印出的值为 0,说明发送端没有计算检验和。

测试网络上三个不同系统的输出如图 11 – 4所示(参见封面二)。运行我们自编的 s o c k程序(附录C),发送一份包含9个字节数据的U D P数据报给标准回显服务器。

从这里可以看出,三个系统中有两个打开了 U D P检验和选项。

还要注意的是,在这个简单例子中,送出的数据报与收到的数据报具有相同的检验和值(第3和第4行,第5和第6行)。从图11-3可以看出,两个IP地址进行了交换,正如两个端口号一样。

伪首部和U D P首部中的其他字段都是相同的,就像数据回显一样。这再次表明 U D P检验和(事实上,TCP/IP协议簇中所有的检验和)是简单的16 bit和。它们检测不出交换两个16 bit的差错。作者在1 4 . 2节中在8个域名服务器中各进行了一次 D N S查询。D N S主要使用U D P,结果只有两台服务器打开了UDP检验和选项。

11.3.2 一些统计结果

文献[Mogul 1992 ]提供了在一个繁忙的N F S服务器上所发生的不同检验和差错的统计结果,时间持续了 4 0天。统计数字结果如图 11 – 5所示。

最后一列是每一行的大概总数,因为以太网和 I P层还使用其他的协议。例如,不是所有的以太网数据帧都是 I P数据报,至少以 太网还要使用 A R P协议。不是所有的 I P数据报都是U D P或T C P数据,因为I C M P也用I P传送数据。

注意,T C P发生检验和差错的比例与 U D P相比要高得多。这很可能是因为在该系统中的T C P连接经常是“远程”连接(经过许多路由器和网桥等中间设备),而U D P一般为本地通信。

从最后一行可以看出,不要完全相信数据链路(如以太网,令牌环等)的 C R C检验。应该始终打开端到端的检验和功能。而且,如果你的数据很有价值,也不要完全相信 U D P或T C P的检验和,因为这些都只是简单的检验和,不能检测出所有可能发生的差错。