简介
  
  简略就是美。在网络协议的世界中,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协定。