关于UDP

Posted yuanch2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于UDP相关的知识,希望对你有一定的参考价值。

UDP介绍:
用户数据报协议,属于传输层的协议,无连接,不保证传输的可靠性。对于来自应用层的数据包,直接加上UDP报头然后传送给IP。UDP头部中有一个校验和字段,可用于差错的检测,但是UDP是不提供差错纠正的。此外IPV4不强制这个校验和字段必须使用,但IPV6是强制要求使用的。
UDP报头:

技术图片

 

 

 

其中,
①源端口号如果不需要可以置0;
②长度字段是UDP首部和UDP数据的总长度,这个字段是冗余的,因为IP中包含了数据报长度信息;
③校验和字段是端到端的,它覆盖了UDP头部、UDP数据、一个伪头部、填充字节,由初始的发送方计算得到,由最终的目的方计算然后校验。
UDP的优势:
①开销更小
TCP为了保证其可靠性,首部包含20字节,以及40字节的可选项,UDP首部只有8字节
②速度更快
UDP发送数据之前没有TCP的连接建立过程;
TCP提供了过多的保护,在及时性上做了很多的妥协,比如:控制微包(Nagle算法),延时ACK,流量控制,超时重传等,这些设计严重影响了Tcp的速度和及时性
UDP传输过程中存在的主要问题:
①丢失和乱序:因为UDP不提供ACK、序列号等机制,所以是没有办法知道是否有报文丢失以及接收方到达等报文顺序是否和发送方发送的报文数据一样;
②差错:对于差错问题则是可以通过校验和等检测到,但是不提供差错纠正;
③数据完整性,UDP协议头部虽然有16位的校验和,但是IPv4并不强制执行,也就是说UDP无法抱枕数据的完整性
UDP如何解决其传输过程中的问题:
想要保证数据的可靠投递和正确排序,必须由应用程序自己实现这些保护功能
简单思路,既然原生UDP有那么多痛点,那我能不能像应用层协议一样在UDP数据包头再加一段包头,从而定义为RUDP呢,答案是肯定的。首先思考RUDP需要解决哪些问题,然后根据问题加上必要的包头字段。
1. 数据完整性 –> 加上一个16或者32位的CRC验证字段
2. 乱序 –> 加上一个数据包序列号SEQ
3. 丢包 –> 需要确认和重传机制,就是和Tcp类似的Ack机制(若中间包丢失可以通过序列号累计而检测到,但是一开始的包就丢失是没有办法通过序列号检测到的)
在思考一下既然是自定义协议是不是需要一个协议号字段来过滤一些非法包,那么又可以加入一个新字段:
4. 协议字段 –> protol 字段,标识当前使用协议

————————————————

原文链接:https://blog.csdn.net/weixin_39138071/article/details/79630133

以上是关于关于UDP的主要内容,如果未能解决你的问题,请参考以下文章

关于SOCKS5中UDP请求的问题

关于TCP和UDP的一些问题记录

关于TCP和UDP的通俗理解

关于PHP利用udp协议实现定时任务脚本

关于UDP数据报引发“异步错误”的疑问

c#关于udp远程关闭一个连接问题