简介
简略就是美。在网络协议的世界中,TCP 和 UDP 是建设在 IP 协定根底上的两个十分通用的协定。咱们当初常常应用的 HTTP 协定就是建设在 TCP 协定的根底上的。相当于 TCP 的稳定性来说,UDP 因为其数据传输的不可靠性,所以用在某些特定的场合,如直播、播送音讯、视频音频流解决等不太须要校验数据完整性的场合。
UDP 绝对 TCP 协定而言,其特点就是简洁,它删除了在 TCP 协定中为了保障音讯准确性的各种限制性特色。简洁带来的益处就是快!明天给大家解说一下,基于 UDP 的高速数据传输协定 UDT。
UDT 协定
UDP 因为其简略的个性,所以能够做到很多 TCP 做不到的事件,比方进行大数据量的疾速传输。这里并不是要将 TCP 和 UDP 分个好坏高下,毕竟各个协定的适应场景不同,他们之所以风行,就是因为能够在特定的场景施展出重要的作用。套用中国的一句谚语就是:不论白猫黑猫,能抓到老鼠的,就是好猫。
用好 UDP 协定,咱们就能够疾速的传递大量的数据,这个协定就是 UDT 协定。
话说,像这些根底协定都是老外创造的,而中国的互联网巨头都在抢着做平台、做流量的生意, 真的是无话可说 ….
UDT 我的项目开始于 2001 年,是由 Yunhong Gu 在芝加哥伊利诺伊大学国家数据挖掘核心 (NCDM) 读博士期间开发的,并在毕业之后继续的进行保护和降级改良。
UDP 的呈现是因为那时候,传输更快更便宜的光纤网络呈现了,代替了之前的铜缆线和双绞线,从而极大的晋升了信息传输的效率。这时候大家就发现之前应用 TCP 协定来进行大数据的传输会有很大的问题。从而基于 UDP 的 UDT 协定呈现了。
UDT 的第一个版本,也称为 SABUL(Simple Available Bandwidth Utility Library),UDT 通过反对批量数据传输,从而不便在公有网络中进行数据的传输。
要留神的是 UDT 的第一个版本 SABUL 应用 UDP 协定进行传输数据,同时应用独自的 TCP 协定连贯传输管制音讯。
UDT 的初始版本是在超高速网络(1 Gbit/s、10 Gbit/ s 等)上进行开发和测试的,2003 年 10 月,NCDM 实现了从美国芝加哥到荷兰阿姆斯特丹的均匀每秒 6.8G 比特的传输。在 30 分钟内的测试中,他们传输了大概 1.4TB 的数据。
从 2004 年公布的 2.0 版本开始,SABUL 改名为 UDT,UDT 的全称是 UDP-based Data Transfer Protocol,也就是基于 UDP 的数据传输协定。
为什么要改成 UDT 呢?因为在 UDT2.0 中,删除了 SABUL 中的 TCP 管制连贯,并应用 UDP 来解决数据和管制信息。另外,UDT2 还引入了一种新的拥塞控制算法,容许协定动静调整 UDT 和 TCP 流,实现 UDT 和 TCP 流的并发运行。
在 2006 年,UDT 协定降级到了 3 版本,该协定不仅是在公有网络中运行了,而是扩大到了商业互联网中。同时 UDT3 中的拥塞管制能够进行调整优化,能够在低带宽的环境中运行,并且容许用户轻松定义和装置本人的拥塞控制算法。另外,UDT3 还显着缩小了系统资源(CPU 和内存)的应用。
2007 年,UDT4 版本在高并发和防火墙穿透方面进行优化和性能的晋升。UDT4 容许多个 UDT 连贯绑定到同一个 UDP 端口,它还反对汇合连贯设置,以便 UDP hole punching。
什么是 UDP hole punching 呢?
UDP hole punching 通常被用在网络地址转换 (NAT) 中。用来保护穿梭 NAT 的用户 UDP 数据包流。它是一种应用网络地址转换器在专用网络中的 Internet 主机之间建设双向 UDP 连贯的办法。
什么是 NAT 呢?
大家都晓得 IPV4 地址是无限的,很快 IPV4 地址就快用完了,那怎么解决这个问题呢?
当然,一个永恒解决的方法是 IPV6,不过 IPV6 推出这么多年了,如同还没有真正的遍及。
不应用 IPV6 的话还有什么解决办法呢?
这个方法就是 NAT(Network Address Translators)。
NAT 的原理是将局域网的 IP 和端口和 NAT 设施的 IP 和端口做个映射。
NAT 外部保护着一张转换表。这样就能够通过一个 NAT 的 IP 地址和不同的端口来连贯泛滥的局域网服务器。
那么 NAT 有什么问题呢?
NAT 的问题在于,外部客户端不晓得本人外网 IP 地址,只晓得内网 IP 地址。
如果是在 UDP 协定中,因为 UDP 是无状态的,所以须要 NAT 来重写每个 UDP 分组中的源端口、地址,以及 IP 分组中的源 IP 地址。
如果客户端是在应用程序外部将本人的 IP 地址通知服务器,并想跟服务器建设连贯,那么必定是建设不了的。因为找不到客户端的公网 IP。
即便找到了公网 IP,任何达到 NAT 设施外网 IP 的分组还必须有一个指标端口,而且 NAT 转换表中也要有一个条目能够将其转换为外部主机的 IP 地址和端口号。否则就可能呈现下图的连贯失败的问题。
怎么解决呢?
第一种形式是应用 STUN 服务器。
STUN 服务器是 IP 地址已知的服务器,客户端要通信之前,先去 STUN 服务器下面查问一下本人的外网 IP 和端口,而后再应用这个外网 IP 和端口进行通信。
但有时 UDP 包会被防火墙或者其余的应用程序所阻挡。这个时候就能够应用中继器技术 Traversal Using Relays around NAT (TURN)。
单方都将数据发送到中继器 server,由中继器 server 来负责转发数据。留神,这里曾经不是 P2P 了。
最初,咱们有一个集大成者的协定叫做 ICE(Interactive Connectivity Establishment):
它实际上就是直连,STUN 和 TURN 的综合体,能直连的时候就直连,不能直连就用 STUN,不能用 STUN 就用 TURN。
在应用 STUN 和 ICE 的过程中,咱们会有一台网络主机用来建设端口映射和放弃其余 UDP 端口状态,然而 UDP 的状态通常在几十秒到几分钟的短时间后过期,为了保障 NAT 中 UDP 的状态和生命周期,于是有了 UDP hole punching 的技术。通过定时传输 keep-alive 数据包,对 NAT 中的 UDP 状态进行更新。
UDT 的毛病
因为 UDT 是基于 UDP 协定的,然而 UDP 协定因为其简洁的个性,所以并不具备安全性的特色。所以基于其上的 UDT 协定因为不足平安个性,所以在商业环境中利用会受到肯定的限度。
不过 UDT 的新版本曾经在开发中,大家能够期待一下。
总结
UDT 被宽泛用于高性能计算,比方光纤网络上的高速数据传输。咱们后续会在 netty 中通知大家怎么应用 UDT 协定。
本文已收录于 http://www.flydean.com/11-udt/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!