UDP的特点、UDP的报文结构及差错检测
一、UDP的特点
可以回答为什么这么多应用选择UDP。
UDP是面向非连接的协议,传送数据不需要和服务器连接,只需要知道ip和监听端口,不需要链接没有目的的socket,只是将数据报投递出去,不管接收方是否成功接收到,是一种不可靠的传输。
1.无需连接建立
- 众所周知,TCP在数据传输前需要经过三次握手,UDP却不需要做任何的准备即可进行数据传输,因此UDP不会引入建立连接的时延。
- 这也是DNS运行在UDP而不是TCP上的主要原因。
- 而HTTP协议之所以使用TCP,是因为对于HTTP协议来说,可靠性是至关重要的。
2.无连接状态
- TCP需要维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数。(后面如果有时间,会详细说下TCP的拥塞控制方案,对该方案来说,这些状态信息都是必要的)
- 而UDP不需要维护连接状态,也不用跟踪这些参数
3.分组首部开销小
每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销
所以,如非必要,比如电子邮件,远程终端服务,web,以及文件传输,需要可靠地数据传输,会去采用TCP。其余的尤其是对实时性要求高的应用,比如实时视频会议,网络电话,一般都会选用UDP
关于何时、发送什么数据的应用层控制更加精细
只要应用将数据传递给UDP,UDP就会将此数据打包进UDP报文段并立刻将其传递给网络层。
而TCP则是有个拥塞控制机制,以确保数据能够安全传输,而不管可靠传输成功需要用多少时间。
所以有些实时应用,比如微信视频、语音都是更希望数据能够及时发送,为此可以容忍一部分数据丢失,比较适合用UDP
二、UDP的报文结构
应用层数据占用UDP报文段的数据字段。UDP首部只有4个字段,每个字段由2个字节组成,即UDP首部仅有8字节。
-
端口号:可以使目的主机将应用数据交给运行在目的端系统中端相应进程,执行分用功能。
-
长度:该字段指示了在UDP报文段中的字节数(首部+数据)
-
检验和:接收方使用检验和来检查在该报文段中是否出现了差错,即差错检测。
三、复用、分用
四、UDP差错检测
UDP检验和提供了差错检测功能。
检验和相当于用于确定当UDP报文段从源到达目的地移动时,其中的比特是否发生了改变(比如,由于链路中的噪声干扰或存储在路由器中时的引入问题)。
发送方的UDP对报文段中的所有16比特字对和进行反码
运算,求和时遇到的任何溢出都被回卷。得到的结果被放在UDP报文段中的检验和字段。
1.例子
假定有下面三个16比特的字:
这些16比特字的前两个之和是:
再将该和与第三个16比特字相加,得出:
发现溢出了,该和就要被回卷,即把首位的1加到最后一位去,得出:
然后对其进行反码运算,所谓反码运算,即是将所有的1换成0,0换成1
这就是得出的检验和。而在接收方,全部的4个16比特字(包括检验和)加在一起。如果分组中没有引入差错,显然在接收处该和将是1111111111111111。而如果这些比特之一是0,那我们就知道该分组中出现了差错。
UDP在端到端基础上在运输层提供差错检测,这就是在系统设计中被称颂的端到端原则
而UDP虽然提供差错检测,但它对差错恢复无能为力。这就需要用到可靠数据传输–TCP了,
当然如果不用TCP的话,那么在会话层将会对UDP的缺陷进行补充