UDP:用户数据报协议
1. 引言
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。
UDP数据报封装成一份IP数据报的格式如图。
UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证他们能到达目的地。
应用程序必须关心IP数据报的长度。如果它超过忘了的MTU,那么就要对IP数据报进行分片,如果需要,源端到目的端之间的每个忘了都要进行分片,并不只是发送端主机连接第一个网络才这样。
2. UDP首部
如图:
(1)16位源端口号:端口号表示发送进程和接收进程,TCP和UDP用目的端口号来分用来自IP层的数据的过程。由于IP层已经把IP数据报分配给TCP或UDP(根据IP首部中协议字段值),因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号与UDP端口号是相互独立的。尽管相互独立,如果TCP和UDP同时提供某种知名服务,两个协议通常选择相同的端口号。这纯粹是为了使用方便,而不是协议本身要求。
(2)16位目的端口号
(3)16位UDP长度:UDP首部和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据报是可以的)。这个UDP长度是冗余的。因为UP数据报长度是IP数据报全程,因此UDP数据报长度是全长减去IP首部的长度。
(4)16位UDP检验和:UDP检验和覆盖UDP首部和UDP数据。IP首部的检验和,它只覆盖IP的首部--并不覆盖UP数据报中的任何数据。UDP和TCp在首部中都有覆盖他们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必须的。
3. UDP校验和
尽管UDP检验和的基本计算方法与IP首部检验和计算方法相类似(16bit字的二进制反码和),但是他们之间存在不同的地方。首先,UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个16bit字相加。
解决方法是必要时在最后增加填充字节0,折只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。
其次,UDP数据报和TCp端都包含一个12字节长的伪首部,它是为了计算校验和而设置的。伪首部包含IP收一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地。(例如,IP没有接受地址不是本主机的数据报,以及IP没有吧应传给另一高层的数据报传给UDP)
UDP数据报中的伪首部格式如图:
上图中,特地举了一个奇数长度的数据报例子,因此在计算检验和时需要加上填充字段。
如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄丢弃,不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做)。
UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。
不是所有的以太网数据帧都是IP数据报,至少以太网还要使用ARP协议。不是所有的IP数据报都是UDP或TCP数据,因为ICMP也用IP传送数据。