用户数据协议 UDP


作者:Seiya

时间:2019年08月28日


前言


网络协议是每个前端工程师都必须要掌握的知识,我们将先来学习传输层中 UDP 协议。对于大部分工程师来说最常用的协议除了 TCP 协议,也就是这个了。





UDP 详解


用户数据报协议(英语:User Datagram Protocol,缩写为UDP),又称使用者资料包协定,是一个简单的面向数据报的传输层协议,正式规范为 RFC 768。

在 TCP/IP 模型中,UDP 为网络层以上和应用层以下提供了一个简单的接口。UDP 只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以 UDP 有时候也被认为是不可靠的数据报协议)。UDP 在 IP 数据报的头部仅仅加入了复用和数据校验(字段)。





UDP 的特点


面向无连接

首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。


具体来说就是:

  • 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了;

  • 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作;




传播方式

UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。




UDP 是面向报文的

发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文。




不可靠性

首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发。

并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。

再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包。

UDP 只会把想发的数据报文一股脑的丢给对方,并不在意数据有无安全完整到达。




高效

UDP 头部包含了以下几个数据:

  • 两个十六位的端口号,分别为源端口(可选字段)和目标端口

  • 整个数据报文的长度

  • 整个数据报文的检验和(IPv4 可选字段),该字段用于发现头部信息和数据中的错误


因此 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时是很高效的。





UDP 的优点


  • 无需建立连接(减少延迟)

  • 实现简单:无需维护连接状态

  • 头部开销小(最小值为8byte)

  • 没有拥塞控制:应用可以更好的控制发送时间和发送速率


基于 UDP 协议的有:

  • 域名系统(DNS)

  • 简单网络管理协议(SNMP)

  • 动态主机配置协议(DHCP)

  • 路由信息协议(RIP)

  • 自举协议(BOOTP)

  • 简单文件传输协议(TFTP)





UDP 的应用场景


直播

但是对于直播来说,用户肯定关注的是最新的画面,而不是因为网络条件差而丢失的老旧画面,所以 TCP 在这种情况下无用武之地,只会降低用户体验。




王者荣耀

对于这类实时性要求很高的游戏来说,UDP 是跑不了的。

对于王者荣耀来说,用户体量是相当大的,如果使用 TCP 连接的话,就可能会出现服务器不够用的情况,因为每台服务器可供支撑的 TCP 连接数量是有限制的。

再者,因为 TCP 会严格控制传输的正确性,如果因为用户网络条件不好就造成页面卡顿然后再传输旧的游戏画面是肯定不能接受的,毕竟对于这类实时性要求很高的游戏来说,最新的游戏画面才是最需要的,而不是老旧的画面,否则角色都不知道死多少次了。

最后更新时间: 2019-8-28 14:08:15