UDP:用户数据报协议|UDP检验和

UDP:用户数据报协议|UDP检验和

引言

UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP 数据报,并组装成一份待发送的 I P数据报。 这与面向流字符的协议不同,如 TCP,应用 程序产生的全体数据与真正发送的单个IP数 据报可能没有什么联系。 UDP数据报封装成一份 I P数据报的格式 如图所示。

UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达 目的地。

UDP首部

UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为 8字节(发送一 份0字节的U DP数据报是OK)。这个UDP长度是有冗余的。 IP数据报长度指的是数据报全长,因此UDP数据报长度是全长减去I P首部的长度(该值在首部长度字段中指定)。

UDP检验和

UDP检验和覆盖UDP首部和UDP数据。回想IP首部的检验和,它只覆盖IP的首部,并不覆盖IP数据报中的任何数据。UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP 的检验和是必需的。 尽管UDP检验和的基本计算方法与IP首部检验和计算方法相类似 (16 bit字的二进制反码和),但是它们之间存在不同的地方。首先,UDP数据报的长度可以为 奇数字节,但是检验和算法是把若干个 16 bit字相加。解决方法是必要时在最后增加填充字节 0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。 其次UDP数据报和TCP段都包含一个1 2字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地 (例如IP没有接受地址不是本主机的数据报,以及IP没有把应传给另一高层的数据报传给UDP)。UDP数据报中的伪首部格式如图所示。

在该图中,我们特地举了一个奇数长度的数据报例子,因而在计算检验和时需要加上填充字节。注意,U D P数据报的长度在检验和计算过程中出现两次。 如果检验和的计算结果为 0,则存入的值为全1(6 5 5 3 5),这在二进制反码计算中是等效 的。如果传送的检验和为0,说明发送端没有计算检验和。

如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄 地丢弃。不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做)。UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为 了发现UDP首部和数据在发送端到接收端之间发生的任何改动。 尽管UDP检验和是可选的,但是它们应该总是在用。在80年代,一些计算机产商在默认 条件下关闭UDP检验和的功能,以提高使用 UDP协议的NFS(Network File System)的速度。 在单个局域网中这可能是可以接受的,但是在数据报通过路由器时,通过对链路层数据帧进 行循环冗余检验(如以太网或令牌环数据帧)可以检测到大多数的差错,导致传输失败。不 管相信与否,路由器中也存在软件和硬件差错,以致于修改数据报中的数据。如果关闭端到端的UDP检验和功能,那么这些差错在 UDP数据报中就不能被检测出来。另外,一些数据链 路层协议(如SLIP)没有任何形式的数据链路检验和。

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

猜你喜欢

转载自www.cnblogs.com/Weber-security/p/12814294.html