下载
第11章 UDP:用户数据报协议
11.1 引言
U D P 是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 U D P
数据报,并组装成一份待发送的 I P 数据报。
这与面向流字符的协议不同,如 T C P ,应用
程序产生的全体数据与真正发送的单个 I P 数
据报可能没有什么联系。
U D P数据报封装成一份 I P 数据报的格式
如图11 - 1所示。
RFC 768 [Postel 1980] 是U D P的正式规
范。
U D P 不提供可靠性:它把应用程序传给 I P 层的数据发送出去,但是并不保证它们能到达
目的地。由于缺乏可靠性,我们似乎觉得要避免使用 U D P而使用一种可靠协议如 T C P。我们
在第1 7 章讨论完T C P后将再回到这个话题,看看什么样的应用程序可以使用 U D P 。
应用程序必须关心 I P 数据报的长度。如果它超过网络的 M T U(2 . 8节),那么就要对 I P 数
据报进行分片。如果需要,源端到目的端之间的每个网络都要进行分片,并不只是发送端主
机连接第一个网络才这样做(我们在 2 . 9 节中已定义了路径 M T U 的概念)。在11 . 5 节中,我们
将讨论I P 分片机制。
11.2 UDP首部
U D P 首部的各字段如图11 - 2所示。
图11-2 UDP首部
端口号表示发送进程和接收进程。在图 1 - 8 中,我们画出了T C P 和U D P用目的端口号来分
用来自I P 层的数据的过程。由于 I P 层已经把I P数据报分配给T C P 或U D P (根据I P首部中协议字
段值),因此T C P端口号由T C P 来查看,而U D P端口号由U D P来查看。T C P 端口号与U D P 端口
号是相互独立的。
图11-1 UDP封装
IP数据报
UDP数据报
首部
UDP
首部
UDP数据
20字节
8字节
16位源端口号
16位目的端口号
16位UDP长度
16位UDP检验和
数据(如果有)
8字节
尽管相互独立,如果T C P 和U D P 同时提供某种知名服务,两个协议通常选择相同
的端口号。这纯粹是为了使用方便,而不是协议本身的要求。
U D P 长度字段指的是U D P首部和U D P数据的字节长度。该字段的最小值为 8字节(发送一
份0字节的 U D P 数据报是O K )。这个 U D P 长度是有冗余的。 I P 数据报长度指的是数据报全长
(图3 - 1 ),因此U D P 数据报长度是全长减去 I P 首部的长度(该值在首部长度字段中指定,如图
3 - 1所示)。
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所示。
图11-3 UDP检验和计算过程中使用的各个字段
在该图中,我们特地举了一个奇数长度的数据报例子,因而在计算检验和时需要加上填
充字节。注意,U D P数据报的长度在检验和计算过程中出现两次。
如果检验和的计算结果为 0,则存入的值为全 1(6 5 5 3 5),这在二进制反码计算中是等效
的。如果传送的检验和为0,说明发送端没有计算检验和。
108使用TCP/IP详解,卷1:协议
下载
32位源IP地址
32位目的IP地址
0 8位协议(17)
16位UDP长度
16位目的端口号
16位UDP检验和
UDP首部
UDP伪首部
16位源端口号
16位UDP长度
数据
填充字节(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 数据报给标准回显服务器。
图11-4 t c p d u m p 输出,观察其他主机是否打开UDP检验和选项
从这里可以看出,三个系统中有两个打开了 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 服务器上所发生的不同检验和差错的统计结果,
第11章 UDP:用户数据报协议使用109
下载
时间持续了 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 的检验和,因为这些都只是简单的检验和,不能检测出所有可能发生的差错。
11.4 一个简单的例子
用我们自己编写的s o c k程序生成一些可以通过t c p d u m p 观察的U D P 数据报:
bsdi % sock -v -u -i -n4 svr4 discard
connected on 140.252.13.35.1108 to 140.252.13.34.9
bsdi % sock -v -u -i -n4 -w0 svr4 discard
connected on 140.252.13.35.1110 to 140.252.13.34.9
第1次执行这个程序时,我们指定 v e r b o s e 模式(- v)来观察 e p h e m e r a l 端口号,指定U D P
(- u)而不是默认的 T C P ,并且指定源模式( - i )来发送数据,而不是读写标准的输入和输
出。- n 4选项指明输出4份数据报(默认条件下为 1 0 2 4),目的主机为s v r 4。在1 . 1 2节描述了丢
弃服务。每次写操作的输出长度取默认值 1 0 2 4。
第2次运行该程序时我们指定 - w 0 ,意思是写长度为 0的数据报。两个命令的 t c p d u m p 输
出结果如图11 - 6所示。
图11-6 向一个方向发送UDP数据报时的t c p d u m p 输出
输出显示有四份1 0 2 4 字节的数据报,接着有四份长度为 0的数据报。每份数据报间隔几毫
秒(输入第2个命令花了4 1 秒的时间)。
在发送第1份数据报之前,发送端和接收端之间没有任何通信(在第 1 7 章,我们将看到
T C P 在发送数据的第 1个字节之前必须与另一端建立连接)。另外,当收到数据时,接收端没
有任何确认。在这个例子中,发送端并不知道另一端是否已经收到这些数据报。
最后要指出的是,每次运行程序时,源端的 U D P 端口号都发生变化。第一次是 11 0 8 ,然
后是11 0。在1 . 9节我们已经提过,客户程序使用 e p h e m e r a l端口号一般在1 0 2 4 ~5 0 0 0 之间,正
110使用TCP/IP详解,卷1:协议
下载
图11-5 检测到不同检验和差错的分组统计结果
层 次
以太网
检验和差错数
近似总分组数
如我们现在看到的这样。
11.5 IP分片
正如我们在2 . 8节描述的那样,物理网络层一般要限制每次发送数据帧的最大长度。任何
时候I P层接收到一份要发送的 I P 数据报时,它要判断向本地哪个接口发送数据(选路),并查
询该接口获得其M T U 。I P 把M T U 与数据报长度进行比较,如果需要则进行分片。分片可以发
生在原始发送端主机上,也可以发生在中间路由器上。
把一份I P 数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装与其他网
络协议不同,它们要求在下一站就进行进行重新组装,而不是在最终的目的地)。重新组装由
目的端的 I P 层来完成,其目的是使分片和重新组装过程对运输层( T C P 和U D P )是透明的,
除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。
I P首部中包含的数据为分片和重新组装提供了足够的信息。
回忆I P首部(图3 - 1),下面这些字段用于分片过程。对于发送端发送的每份 I P数据报来说,
其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中(我们现在已经看到
这个字段的用途)。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每
个组成数据报的片都要把该比特置 1。片偏移字段指的是该片偏移原始数据报开始处的位置。
另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。
最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置 1,I P 将不对数据报
进行分片。相反把数据报丢弃并发送一个 I C M P 差错报文(“需要进行分片但设置了不分片比
特”,见图6 - 3)给起始端。在下一节我们将看到出现这个差错的例子。
当I P 数据报被分片后,每一片都成为一个分组,具有自己的 I P首部,并在选择路由时与
其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在 I P 首部中有足
够的信息让接收端能正确组装这些数据报片。
尽管I P分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重
传整个数据报。为什么会发生这种情况呢?因为 I P层本身没有超时重传的机制——由更高层来
负责超时和重传(T C P有超时和重传机制,但U D P没有。一些U D P应用程序本身也执行超时和
重传)。当来自T C P报文段的某一片丢失后,T C P在超时后会重发整个T C P报文段,该报文段对
应于一份I P数据报。没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的
是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这
个原因,经常要避免分片。文献[Kent and Mogul 1987]对避免分片进行了论述。
使用U D P 很容易导致I P 分片(在后面我们将看到, T C P试图避免分片,但对于应用程序来
说几乎不可能强迫 T C P 发送一个需要进行分片的长报文段)。我们可以用 s o c k 程序来增加数
据报的长度,直到分片发生。在一个以太网上,数据帧的最大长度是 1 5 0 0 字节(见图 2 - 1 ),
其中1 4 7 2字节留给数据,假定 I P 首部为2 0 字节, U D P 首部为8字节。我们分别以数据长度为
1471, 1472, 1473和1 4 7 4 字节运行s o c k程序。最后两次应该发生分片:
bsdi % sock -u -i -nl -w1471 svr4 discard
bsdi % sock -u -i -nl -w1472 svr4 discard
bsdi % sock -u -i -nl -w1473 svr4 discard
bsdi % sock -u -i -nl -w1474 svr4 discard
相应的t c p d u m p输出如图11 - 7所示。
第11章 UDP:用户数据报协议使用111
下载
评论0