运输层及 UDP 协议
2019-09-07
告知你不为人知的UDP-疑难杂症和使用
UDP
概述
用户数据报协议 UDP
只在数据报服务上增加了复用和分用的功能以及差错检测的功能;UDP
的传输效率比 TCP
高。
UDP
的主要特点是:
-
UDP
是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。 -
UDP
使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)。 -
UDP
是面向报文的。发送方的UDP
对应用程序交下来的报文,在添加首部后就向写交付IP
层。UDP
对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说,应用层交给UDP
多长的报文,UDP
就照样发送,即一次发送一个报文。如下图所示。在接收方的UDP
,对IP
层交上来的UDP
用户数据报,在去除首部后就原封不动地交付上层的应用进程。也就是说,UDP
一次交付一个完整的报文。因此,应用进程必须选择合适大小的报文。若报文太长,UDP
把它交给IP
层后,IP
层在传送时可能要进行分片,这回降低IP
层的效率。反之,若报文太短,UDP
把它交给IP
层后,会使IP
数据报的首部的相对长度太大,这也降低了IP
层的效率。
-
UDP
没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。如IP
电话、实时视频会议等要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的时延。UDP
正好符合这种要求。 -
UDP
支持一对一、一对多、多对一和多对多的交互通信。 -
UDP
的首部开销小,只有 8 个字节,比TCP
的 20 个字节的首部要短。
虽然某些实时应用需要使用没有拥塞控制的 UDP
,但当很多的源主机同时都向网络发送高速率的实时视频流时,网络就有可能发生拥塞,结果大家都无法正常接收。因此,不使用拥塞控制功能的 UDP
有可能会引起网络产生严重的拥塞问题。
还有一些使用 UDP
的实时应用,需要对 UDP
的不可靠的传输进行适当的改进,以减少数据的丢失。在这种情况下,应用进程本身可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采用前向纠错 或 重传已丢失的报文。
UDP
的首部格式
当运输层从 IP
层收到 UDP
数据报时,就根据首部中的目的端口,把 UDP
数据报通过相应的端口,上交最后的终点——应用进程。
请注意,虽然在UDP
之间的通信要用到其端口号,但由于 UDP
的通信是无连接的,因此不需要使用套接字(TCP 之间的通信必须要在两个套接字之前建立连接)。
在计算检验和时,要在 UDP
用户数据报之前增加 12 个字节的伪首部。伪首部并不是 UDP
用户数据报真正的首部。只是在计算检验和时,临时添加在 UDP
用户数据报前面,得到一个临时的 UDP
用户数据报。检验和就是按照这个临时的 UDP
用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。UDP
的检验和是把首部和数据部分一起都检验。
二进制反码求和运算:从低位到高位逐列进行计算。0 和 0 相加是 0,0 和 1 相加是 1, 1 和 1 相加是 0 但要产生一个进位 1,加到下一列。若最高位相加后产生进位,则最后得到的结果要加 1(即最高位产生的进位加到最后一位)。如下图所示: