协议之上实现.doc
上传人:sy****28 上传时间:2024-09-13 格式:DOC 页数:6 大小:89KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

协议之上实现.doc

协议之上实现.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

TDP(TCP?over?UDPlibrary):基于UDP协议之上实现通用、可靠、高效的TCP协议黄洪波(huanghongbo@gmail.com)http://blog.csdn.net/huanghongbo/一、介绍随着互联网应用广泛推广,出现了越来越多的网络应用,其中基于p2p思想的各种网络技术的产品也越来越多的出现在我们的视野当中。从最早闻名的Napster到现在的Bittorrent、eMule、skype等产品,P2P这种网络应用模式已经从各个方面深入人心。这些产品在各自的网络实现技术上,都以各自的方法解决着同样面临的一个问题,如何让他们的软件产品在各异的网络拓扑结构中顺利的进行P2P通信。众所周知,在当???的网络拓扑结构中,普遍存在使用NAT设备来进行网络地址转换,而让应用程序能跨越这些NAT设备进行全双工的通信,就成为非常重要的一个问题。对于实现跨越NAT通信可以采取很多种办法(对于能够直接连接、反向连接的情况不在此列):首先是通过服务器进行转发,这是比较粗暴的方法,而且在用户量大的时候,转发服务器需要付出相当大的代价;第二,可以使用NAT穿透技术。而大家知道关于NAT穿透中,UDP穿透的成功率比起TCP穿透要高出许多,这一点这里将不做多述,可以参考BryanFord的文章《Peer-to-PeerCommunicationAcrossNetworkAddressTranslators》(http://www.brynosaurus.com/pub/net/p2pnat/)。因此在UDP协议上构建一些大型的网络应用程序可能会成为很多人的需求。当然也可能基于更多的原因,会有很多人希望能在UDP协议上进行大型应用程序的构建。然而UDP协议本身存在着不通信不可靠的缺点,于是对于基于UDP进行可靠通信的需求就浮现出来了。目前在网络上有许多人正做着这一工作,UDT、RakNet、eNet等都是构建在UDP之后网络可靠通信开发库。然后这些库开发时都针对了一些特殊应用来进行设计的,不具备通眯?。比如RakNet是为游戏应用而设计,对于实时性等游戏相关的网络需求有很好的支持,对于大???量数据传输却有点力所不及。而UDT基于一种基于带宽速率控制的拥塞控制算法进行设计(http://udt.sourceforge.net/doc/draft-gg-udt-01.txt),主要用在小数量的bulk源共享富裕带宽的情况下,最典型的例子就是建立在光纤广域网上的网格计算,而在ISP提供带宽有限的情况下运行却显得消耗资源并性能不足。甚至可能被防火墙,或ISP服务商判断为恶意带宽使用攻击。这些都使用得他们不能被广泛地用于各种网络应用程序。另外大家也陆续发现目前的UDT实现版本存在的一些问题。比如UDT做服务端接收连接时,总是新开一个端口与客户端进行连接,这样会带来几个问题:1)较多客户端连接上来时,服务端新打开的众多端口中可能有的端口会被防火墙拦截而导致通信失败,2)如果客户端处于SymmetricNAT和Port-RestrictedConeNAT后面时,将导致服务器端与客户端连接无法成功建立,3)由于udp端口数最大值有限,所以UDT服务器端可接收的连接数也因些受限。再有就是不仅仅是UDT库,基本上所有的UDP-based可靠通信库,都未提供穿越proxy代理的功能(socks5);再有就是对UDP打洞技术有的支持得不完善或并不支持。基于这些原因,使得我需要开发一个基于UDP协议之上实现一个可靠、高效、通用的通信库,来满足我目前所开发的项目的需要。TCP协议算法已经是经过多方面及多年的验证,是最具通用性,且可靠高效的。虽然UDT等各种库指出TCP在这样或那样的网络环境下存在不足,但众多实现当中他仍然是最通用、可靠、高效的。相信有许多人跟我一样,需要这么一个开发库,所以我打算在开发过程中,陆续公开相关的文档及这个开发库。二、设计目标TDP主要的目标就是在UDP层之上实现TCP的协议算法,使得应用程序能够在UDP层之上获得通用、可靠、高效的通信能力。TDP网络开发库所实现的算法,都来自久经考验的TCP协议算法,网上有着非常多的参考资料。在实现当中,参考最多的是RichardStevens的《TCP/IP详解》。TDP提供的用于开发的应用程序接口与SocketAPI非常相像,姑且称之为TDPSocketAPI,基本上的函数名与参数等都与SocketAPI相一致,但是TDPSocketAPI的API接口都位于命名空间TDP当中。只要使用过SocketAPI进行开发过的朋友,将都会使用TDP库进行开发。下图为TDP及TDPSocketAPI所处在的协议栈应用中的位置,以及与TCP协议栈应用的对比。三、协议说明1.协议格式TDP的实现的算法