好记性不如铅笔头

网络通讯

UDP-Lite简单介绍

本文转自【 https://zh.wikipedia.org/wiki/%E8%BD%BB%E9%87%8F%E7%94%A8%E6%88%B7%E6%95%B0%E6%8D%AE%E6%8A%A5%E5%8D%8F%E8%AE%AE

轻量用户数据报协议

UDP-Lite(Lightweight User Datagram Protocol[1](轻量用户数据报协议),或者简称:UDP Lite),是一种无连接通信的传输层协议,允许将有潜在损坏的数据负载发送给接收方,而不会被接收方直接丢弃,因为它允许一些应用层协议(例如一些视频编码传输的协议)在了解自己应用数据的损坏影响的情况,对数据完整度的控制决定。它定义于RFC 3828。[1]

协议介绍

UDP-Lite是基于用户数据报协议(UDP),但又不同于UDP,它允许对数据报的任意长度计算相应的校验和进行验证保护,通过UDP数据包头的“报文长度”字段来控制需要计算校验和的数据包长度,从而容许没被校验和覆盖的数据部分可能有损地传输。它被用于设计多媒体数据传输协议,例如VoIP或流视频协议,这些协议会认为接收有一定程度损坏的数据比没接收到数据要好,对于其他传输层协议,例如传输控制协议(TCP)、用户数据报协议,校验和会覆盖整个数据包的负载,一旦数据包即使有一个字节的损坏,接收方都会因为校验和验证失败而丢弃整个数据包,单个字节的错误会影响整个数据包的接收,但对于这些应用层协议来说,这些损坏是微不足道的。

对于大部分现在多媒体编解码处理程序,其处理的应用数据本身就内建了对数据错误的检测和回放时的错误纠正的机制。UDP-Lite很适合配合这些应用程序使用,因为这些应用本身能接受有损坏的应用数据,能容许少量的数据损坏被接收而非因为校验和错误导致整个数据被丢弃。应用层了解自己应用数据各部分的重要性,从而允许负载数据前部分受校验和保护,而非整个数据包强制受校验和保护。在Hammer等人的研究中,UDP-Lite与AMR编解码器结合使用,可在有损网络条件下提高语音质量。[2]

由于数据链路层也存在校验和机制用于丢弃数据有损坏的数据帧,所以UDP-Lite也需要了解其数据链路层,从而需要相应的驱动程序调整。

UDP-Lite的IP协议号为136,可以使用互联网号码分配局(IANA)分配给UDP的相同功能端口。为了和UDP保持兼容,UDP-Lite使用和UDP、TCP相同的校验和算法。[3]

使用

在Berkeley套接字中,使用UDP-Lite的话,需要在调用socket创建方法socket时增加第三个参数值IPPROTO_UDPLITE[8]:

int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDPLITE);

然后在设置socket参数方法setsockopt添加控制校验和需要覆盖长度的控制参数(计算长度值是从数据包头开始):

int val = 20; /* 8字节长的包头 + 12字节的负载长度 */
(void)setsockopt(fd, SOL_UDPLITE, UDPLITE_SEND_CSCOV, &val, sizeof val);
/* 如果实际负载长度小于12字节,则等同整个数据包都被校验和覆盖 */

默认情况下,接收方将丢弃所有校验和未完全覆盖的数据包,如同UDP那样,所以接收方也需要类似的接收设置:

int val = 20; /* 8字节长的包头 + 12字节的负载长度 */
(void)setsockopt(fd, SOL_UDPLITE, UDPLITE_RECV_CSCOV, &val, sizeof val);

这样至少保证负载长度为12字节长的部分数据被校验和保护,任何少于12字节长负载的数据包会被协议视为坏包而丢弃,而如果数据包的覆盖长度值至少为20字节长(包括数据包头),并且其校验和正确,则将其交付给应用层的应用程序。如果校验和不正确,数据包同样被丢弃。校验和覆盖值可以等于0或大于等于8字节时,也就是校验和的校验部分至少包括数据包头,以防止一些对所有流量都感兴趣的嗅探器。

Leave a Reply

1 × 3 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据