1. UDP介绍
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。
UDP数据报封装成一份 IP数据报的格式如图11 - 1所示。
![](https://img-my.csdn.net/uploads/201304/22/1366640052_7295.jpg)
RFC 768 [Postel 1980] 是UDP的正式规范。
UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用UDP而使用一种可靠协议如TCP。在讨论完TCP后将再回到这个话题,看看什么样的应用程序可以使用UDP。
2. UDP首部
UDP首部的各字段如图11 - 2所示。
![](https://img-my.csdn.net/uploads/201304/22/1366640056_8004.jpg)
端口号表示发送进程和接收进程。在图 1 - 8中,我们画出了TCP和UDP用目的端口号来分用来自IP层的数据的过程。
![](https://img-my.csdn.net/uploads/201304/22/1366640060_5102.jpg)
由于IP层已经把IP数据报分配给TCP或UDP(根据I P首部中协议字段值) ,因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号与UDP端口号是相互独立的。
尽管相互独立,如果TCP和UDP同时提供某种知名服务,两个协议通常选择相同的端口号。这纯粹是为了使用方便,而不是协议本身的要求。
UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为 8字节(发送一份0字节的UDP数据报是OK) 。这个UDP长度是有冗余的。 IP数据报长度指的是数据报全长(图3 - 1) ,因此UDP数据报长度是全长减去IP首部的长度(该值在首部长度字段中指定,如图3 - 1所示)
![](https://img-my.csdn.net/uploads/201304/22/1366640063_6791.jpg)
UDP检验和覆盖UDP首部和UDP数据。回想IP首部的检验和,它只覆盖IP的首部—并不覆盖IP数据报中的任何数据。
UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。
尽管UDP检验和的基本计算方法与我们在描述的IP首部检验和计算方法相类似(16 bit字的二进制反码和,
但是稍微有所不同,在根据字段类型判定为UDP或者TCP时加入了一些处理,看代码就晓得了) ,但是它们之间存在不同的地方。首先, UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个 16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送) 。
其次,UDP数据报和TCP段都包含一个1 2字节长的伪首部(
本TCP/IP协议栈有所不同,只加入了4字节源IP地址和4字节目的IP地址,即利用IP首部的尾巴,实现了空间上的复用,看代码就晓得了),它是为了计算检验和而设置的。伪首部包含IP首部一些字段。其目的是让 UDP两次检查数据是否已经正确到达目的地(例如,IP没有接受地址不是本主机的数据报,以及IP没有把应传给另一高层的数据报传给UDP) 。UDP数据报中的伪首部格式如图11 - 3所示。
![](https://img-my.csdn.net/uploads/201304/22/1366640068_4523.jpg)
在该图中,我们特地举了一个奇数长度的数据报例子,因而在计算检验和时需要加上
填充字节(0)。注意,UDP数据报的长度在检验和计算过程中出现两次。
如果检验和的计算结果为 0,则存入的值为全1(65535) ,这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。(
因为协议要求如此,故代码需要实现之。)如果发送端没有计算检验和而接收端检测到检验和有差错,那么 UDP数据报就要被悄悄地丢弃。不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做) 。
UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。
/*下面阐述UDP校验和的一些历史和必要性*/
尽管UDP检验和是可选的,但是它们应该总是在用。在 80年代,一些计算机产商在默认条件下关闭UDP检验和的功能,以提高使用UDP协议的NFS(Network File System)的速度。
在单个局域网中这可能是可以接受的,但是在数据报通过路由器时,通过对链路层数据帧进行循环冗余检验(如以太网或令牌环数据帧)可以检测到大多数的差错,导致传输失败。不管相信与否,路由器中也存在软件和硬件差错,以致于修改数据报中的数据。如果关闭端到端的UDP检验和功能,那么这些差错在UDP数据报中就不能被检测出来。另外,一些数据链路层协议(如SLIP)没有任何形式的数据链路检验和。
Host Requirements RFC声明,UDP检验和选项在默认条件下是打开的。它还声明,如果发送端已经计算了检验和,那么接收端必须检验接收到的检验和(如接收到检验和不为0) 。但是,许多系统没有遵守这一点,只是在出口检验和选项被打开时才验证接收到的检验和。
另外需要解释几个术语:
IP数据报是指IP层端到端的传输单元(在分片之前和重新组装之后) ,
分组