UDP协议
一.概要
TCP协议具有严谨的结构,拥塞控制,滑动窗口,超时重传等机制,在复杂多变的网络环境下TCP是能确保数据的安全可靠,实现端到端的传送,但传送速度以及通讯质量在某种情况下会出现不适用的情况,比如远程视频,会议等,在网络拥塞或丢包的环境,视频将会在收到数据包后才继续播放,极有可能会出现断断续续的观影体验。
这时UDP被利用了起来,UDP是一种用户数据包协议,不依靠链接,相比TCP更简洁,头部只有8个字节,而且功能上支持一对一,一对多,多对多的交互通讯,拥有较好的实时性,适用于对高速传输和实时性有较高的通信或广播通信。
但它没有TCP那么严谨,拥有超时重传等可靠机制,只是在IP数据包的服务上添加了一些功能,多路复用和多路分解以及检查数据完整的功能,其实TCP也是基于UDP进行封装改造的。
二.UDP
-
结构
UDP结构很简单,有两个字段,首部字段和数据字段,首部字段很简单,只有8个字节,由四个字节组成,每个字段占用2个字节。
- 16位源端口号是发送方设定的发送端口。
- 16位目的端口号指向数据需要由那个端口接收处理。
- 16位UDP长度,UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部),最大是65535(排除0)字节,数据部分是65528(减去口部)字节
- 检测UDP数据报在传输中是否有错,有错则丢弃,如果不想校验,可以令该字段为0.
-
主要特点
- UDP不需要建立连接。
- UDP开销低,首部只有8个字节,最小携带数据也是8个字节。
- UDP支持一对一,一对多,多对多的交互通讯。
- UDP会尽最大努力交付,不可靠交付,发送出去的数据就不管了。
- UDP是面向报文的,发送方的UDP应用程序发送的报文,在运输层时被UDP协议加上首部后就交给IP层了。
- UDP对应用层发下来的报文,既不合并,也不拆分,而是保留报文的边界,应用层发送多少个数据,UDP都会加上首部来区分边界。
- UDP没有拥塞等机制,不会因为网络拥塞就降低发送速率了,对于实时应用很适用。
-
UDP的校验和
在UDP计算校验和时,会在UDP数据包上添加12个字节的伪首部,其中的信息是从数据报所在IP分组头的分组头中提取,伪首部只用来计算校验和,并不是真正的UDP首部。伪首部既不向下传送也不向上递交,而仅仅是为了校验数据的完整,例如校验UDP数据包,IP地址的完整性。
- 当数据从应用层发送下来的时候,已经知道了要发送的目的IP,以及源IP地址(IP协议需要指定),UDP会在数据加上UDP头部后,在加上一个虚拟的伪首部用来计算。
- 加上伪首部后,把UDP整个数据包看成是由许多16位的子串连接起来,不足为16位的,添加0补充,通过相加得到结果后,如果相加的过程中产生超过16位的17位,需要把17位回卷到第一位相加。
- 按二进制的反码计算求和,对求和结果进行反码(按位取反),得到最终的校验和,填入UDP头部的校验和中。
- 当UDP数据报达到接收端时,由UDP从IP层获取IP信息,组装起一个伪首部,,通过按二进制反码计算出来的和,与UDP数据包的校验和相加,得到的结果等于全1的,则认为这个数据包是完整的,如果不是,这个包是有错误的,丢去,并上传错误给应用层(有需要)。
三.知识补充
- UDP校验和是用来干嘛的?
当UDP把加上首部后交给IP层(网络层)处理,IP层会进行IP分片(以太网帧),把过大的数据切成多条符合MTU传送标准大小,当UDP数据报文被切分多个数据发送出去后,其中有一片数据由于某种原因在网络受影响了,在接收端IP层重组后,上交到运输层,使用检验和校验数据出错,认为这个包丢失了。注意 (MTU默认是1500字节,去掉协议头(IP协议头20个字节,UDP协议头8个字节,TCP协议头20个字节)的话,大概UDP为1472字节,TCP为1460) - 能不能让UDP也具备安全可靠的传送机制?
UDP协议具有高效的实时性,但在安全可靠方面上是有缺陷的,在网络拥塞的情况下,也不会有选择的去调整发送大小,极有可能产生丢包,但是它的扩展性很强,可以通过在应用层添加自定义的检验,或重传机制,避免数据的丢失,具体如何让数据更加安全可靠,得看自定义的安全机制强不强大。 - UDP如何一对多,多对一?
1.一方面,UDP可以使用多播,或者广播的机制对数据进行传送,但会有些地方不适用,例如广播只能允许在本地,这是必然的,不然你广播整个网络,网络不得瘫痪,所以为了防止这类问题,加了许多规则。
2.另一方面UDP还可以使用多路复用以及多路分解,不同于TCP,它的套接字可以识别多个从不同设备不同的套接字传送过来数据包(只要目的地址以及端口一致) - 关于UDP的为什么会丢包?
可以参考下IP协议的分片和重组,但IP层的分片生存周期到了,或者丢失了,整个数据不完整会被丢失了,只有完整的数据IP层才上传到运输层。