网络协议之:基于UDP的高速数据传输协议UDT
简介
简单就是美。在网络协议的世界中,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/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
网络协议之:基于UDP的高速数据传输协议UDT的更多相关文章
- python 之 网络编程(基于UDP协议的套接字通信)
8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...
- 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket
目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...
- TCP/IP网络编程之基于UDP的服务端/客户端
理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...
- Java网络编程二--基于UDP的编程
DatagramSocket对象为基于UDP协议的Socket 构造器提供可以选择性绑定到指定端口和ip 创建完对象后调用:receive(DatagramPacket p) send(Dategra ...
- Python中的端口协议之基于UDP协议的通信传输
UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) 3.利用socketserver模块实现udp传输协议的并 ...
- Linux网络编程:基于UDP的程序开发回顾篇
基于无连接的UDP程序设计 同样,在开发基于UDP的应用程序时,其主要流程如下: 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多.对比面向连接的TCP程序,服务端少了 ...
- 【Java网络编程】基于 UDP 的聊天通信
使用 udp 协议,写一个基于命令行的聊天软件:客户端跟服务端分别在命令行启动之后,客户端和服务器端可以互相发送数据. 代码实现如下: 一.创建线程 sendThread 和 receiveThrea ...
- 常用传输层协议(tcp/ip+udp)与常用应用层协议简述(http)
一.计算机网络体系结构 二.TCP与UDP差异 1.TCP是面向连接的可靠传输,UDP是面向无连接的不可靠传输 面向连接表现在3次握手,4次挥手:可靠传输表现在未进行4次挥手时的差错重传,超时重传: ...
- 网络协议-网络分层、TCP/UDP、TCP三次握手和四次挥手
网络的五层划分是什么? 应用层,常见协议:HTTP.FTP 传输层,常见协议:TCP.UDP 网络层,常见协议:IP 链路层 物理层 TCP 和 UDP 的区别是什么 TCP/UDP 都属于传输层的协 ...
随机推荐
- c++学习笔记6(结构化程序设计的不足)
结构化程序设计 c语言使用结构化程序设计: 程序=数据结构+算法 程序有全局变量以及众多相互调用的函数组成 算法以函数的形式实现,用于对数据结构进行操作 结构化程序设计不足 软件业的目标是更快,更正确 ...
- Django笔记&教程 6-4 forms进阶操作,重写forms方法
Django 自学笔记兼学习教程第6章第4节--forms进阶操作,重写forms方法 点击查看教程总目录 1 - 重写clean方法 在本章第三节中,我们举了个注册学生账号的例子,里面我们使用模型来 ...
- ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项
前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...
- Spring Cloud Gateway修改请求和响应body的内容
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Win10更新Win11步骤及体验感
Win11发布也有一段时间了,最近工作闲下来才想起来更新一下试试,更新过程还算顺利,需要改一下电脑的主板设置之后就可以下载官方提供的更新包,记录一下安装过程中遇到的问题以便查看. Win11更新 使用 ...
- 【Microsoft Azure 的1024种玩法】八. 基于Azure云端轻松打造一款好用的私有云笔记
[简介] Leanote一款开源云笔记软件,它使用Go的Web框架revel和MongoDB开发完成的,其是目前为止发现的最有bigger的云笔记,它支持markdown输入,代码高亮,多人协作,笔记 ...
- SpringBoot引入第三方jar的Bean的三种方式
在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便. 因此本篇博文也不再介绍Spring中通过xml来声明bean的使用方式. 一.注解 ...
- CF1288
A 考虑\(x + 1 = \sqrt{d}\)时在有理域上有最优界. 那我在整数域上附近取三个点取min就行了. // code by fhq_treap #include<bits/stdc ...
- [APIO2020]有趣的旅途
注意到第一个点是可以钦定的. 那么我们考虑在重心的子树里反复横跳. 每次选择不同子树里的深度最大的点. 在同一颗子树里可能会在lca处出现问题. 那么我们选择重心,要考虑到会不会出现一颗子树不够选的操 ...
- [linux] rm -rf删除软链接无权限?
一个很简单的命令,使用频率非常高,但一没注意就会失策. 我将别人盘下的list目录软连接到自己盘中,想要删除时: rm -rf list/ #输入时自然地用tab键补全 结果: 试了多次也删除不了,最 ...