全国直销电话:4006-854-568
IT-technology
以人为本,众志成城,以“用户至上”.“服务上乘”为原则,
追求产品和服务高质量,努力实现与客户之间真诚有效的沟通,
不断地圆梦、奔跑与腾飞。
新闻动态   NEWS
UDP 分片 与 丢包,UDP 真的比 TCP 高效吗?UDP 的应用场景-北京赛维博信科技发展有限公司
来源:本文摘自网络,如有侵权请联系删除 | 作者:svbx001 | 发布时间: 2022-12-26 | 1925 次浏览 | 分享到:

一、UDP 报文格式

每个 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2 字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。

UDP 报文格式如图所示。

UDP 报文中每个字段的含义如下:

  • 源端口:16bits,发送端的端口。

  • 目的端口:16bits,即接收端的端口

  • 长度:16bits,UDP 数据包总的大小:包头+数据,单位:字节。

  • 校验值:16bits,错误检查码,基于算法,计算此 UDP 数据包是否损坏

二、UDP 分片

1、UDP 有发送缓存区吗?

TCP 有 发送/接收 缓存区,那 UDP 有么?

1>、先说结论:

每个 UDP socket 都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区。

UDP:当套接口接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的 UDP 丢弃数据报。

且,如果在传输过程中,一次传输被分成多个分片,传输中有一个小分片丢失,那接收端最终会舍弃整个文件,导致传输失败,这就是 UDP 不可靠的原因。

2>、逐步分析:

linux手册中有设置 UDP 发送缓冲区相关属性,也明确提到了send buffer的概念:

那这是否意味着 UDP 是有发送缓冲区的吗?我们再看一下《UNIX Network Programming》书中所述,这本书的作者权威性我就不多说了吧,在国内高校此书都是当做教材使用的。书中有下面两幅图:

一张是 TCP 发送过程协议栈简化图,另一张是 UDP 的。UDP 中的 send buffer 是用虚线框圈起来的,具体的叙述我直接引用书中原文:

书中的描述很清楚了,UDP 是没有发送缓冲区的,因为 UDP 是不可靠的,他不必像 TCP 一样需要一个实质的发送buffer,而且真正 UDP 写成功返回其实是传递到了链路层的 output queue 中。

2、UDP 分片

1>、UDP 包最佳传输大小

数据链路层 最大传输单元是 1500 字节 (MTU) ,要想 IP 层不分包,那么 UDP 数据包的最大大小应该是1500字节 – IP头(20字节) – UDP头(8字节) = 1472字节。

但,理论上 UDP 报文最大长度是 65507 字节,那:实际上发送这么大的数据包效果最好吗?

 

服务热线

1391-024-6332