速读原著-TCP/IP(最大UDP数据报长度)

2020-03-09 15:37:06 浏览数 (1)

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

11.10 最大UDP数据报长度

理论上,I P数据报的最大长度是6 5 5 3 5字节,这是由I P首部(图3 - 1)1 6比特总长度字段所限制的。去除 2 0字节的I P首部和8个字节的U D P首部,U D P数据报中用户数据的最长长度为6 5 5 0 7字节。但是,大多数实现所提供的长度比这个最大值小。

我们将遇到两个限制因素。第一,应用程序可能会受到其程序接口的限制。 socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于 UDP socket,这个长度与应用程序可以读写的最大 U D P数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于 8 1 9 2字节的U D P数据报(使用这个默认值是因为 8 1 9 2是N F S读写用户数据数的默认值)。

第二个限制来自于T C P / I P的内核实现。可能存在一些实现特性(或差错),使I P数据报长度小于6 5 5 3 5字节。

作者使用s o c k程序对不同U D P数据报长度进行了试验。在SunOS 4.1.3下使用环回接口的最大I P数据报长度是3 2 7 6 7字节。比它大的值都会发生差错。但是从B S D / 3 8 6到SunOS 4.1.3的情况下,S u n所能接收到最大I P数据报长度为3 2 7 8 6字节(即3 2 7 5 8字节用户数据)。在Solaris 2.2下使用环回接口,最大可收发 I P数据报长度为6 5 5 3 5字节。从Solaris 2.2到AIX 3.2.2,发送的最大IP数据报长度可以是65535字节。很显然,这个限制与源端和目的端的实现有关。

我们在3 . 2节中提过,要求主机必须能够接收最短为 5 7 6字节的I P数据报。在许多U D P应用程序的设计中,其应用程序数据被限制成 5 1 2字节或更小,因此比这个限制值小。例如,我们在1 0 . 4节中看到,路径信息协议总是发送每份数据报小于 5 1 2字节的数据。我们还会在其他U D P应用程序如D N S(第1 4章)、T F T P(第1 5章)、B O O T P(第1 6章)以及S N M P(第2 5章)中遇到这个限制。

数据报截断 由于I P能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此,U D P编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?不幸的是,该问题的答案取决于编程接口和实现。

典型的B e r k e l e y版socket API对数据报进行截断,并丢弃任何多余的数据。应用程序何时能够知道,则与版本有关(4.3BSD Reno及其后的版本可以通知应用程序数据报被截断)。

S V R 4下的socket API(包括Solaris 2.x) 并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UDP数据报中多次进行读取操作。TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。

在讨论T C P时,我们发现它为应用程序提供连续的字节流,而没有任何信息边界。 T C P以应用程序读操作时所要求的长度来传送数据,因此,在这个接口下,不会发生数据丢失。

0 人点赞