通讯协议的选择,TCP or UDP

来源:互联网 发布:优化发展环境整改措施 编辑:程序博客网 时间:2024/05/16 09:36
<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">


<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">在网络应用系统的实现中,一般来说,有两类协议可供选择, TCP或者UDP。关于这个话题,网上有大量的文章讨论,我在这里只是做一个比较简单的总结:</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">
<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left"><strong><em>a.</em></strong></span><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">&nbsp;从应用程序者角度来看,我们可以看到这样一些区别:</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">
<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">在整个TCP的会话过程中,总是与一个socket句柄相关联。在对于UDP,是没有这样一个固定的socket句柄。TCP的socket句柄,你可以把它作为一个普通的IO句柄一样看待,可以读入数据,或者写入数据,它的特质非常类似于一般的文件句柄。另外:当你在使用TCP是面向stream的,应用层与TCP的交互是与流的方式进行,这也意味着读入或者写入的数据是没有边界的,如果需要划分,那是应用层的责任。与TCP不同的是,UDP是一种面向数据报的传输协议,读入或者写入的数据本身是有边界的。这也就是我们从各种资料上看到的,TCP与UDP最为基本的区别:TCP提供一种面向连接的、可靠的字节流服务,而,UDP是一个简单的面向数据报的运输层协议。也是由于这样的本质性的区别,不同的协议选择,应用层需要不同的实现。如果你的应用需要独立于这样的协议特性,建议你有一个中间层,位于应用层与具体协议调用之间,实现应用层与协议层之间的松耦合关系。另外补充一点的是:由于TCP的连接是端到端的,在服务器的实现中,你会看到,如果使用的是TCP,TCP的连接数是与客户端的数目一致的,也就是说,假设一个服务器需要管理100个客户端,在服务器的实现里,就需要管理100个这样的连接,而如果使用UDP,是不存在这样的scalability问题。</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">
<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left"><strong><em>b.</em></strong></span><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">&nbsp;从协议本身方面比较:</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">
<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">毋庸置疑,在性能方面,UDP要高于TCP。但是这种性能的提高,是以牺牲某些服务为代价的,天下没有免费的午餐。众所周知,与UDP相比,TCP提供了很多服务特质,比如说它的可靠机制、流控制以及错误恢复功能等等,这都是UDP所没有的。UDP协议本身是不关心网络状态的转化,相比于TCP,它是一个轻量级的协议。关于TCP或者UDP性能方面的比较,可供参考的资料很多,这里就不作过多的描述。</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">
<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left"><strong><u>在我们的应用中,到底选择TCP还是UDP,可能需要考虑的因素有以下几个:</u></strong></span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">
<ol style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">
<li>你是否需要考虑数据传输的稳定性?(比如你的应用是在较差的网络环境中),如果是:选择TCP。</li><li>在你的系统中,是否需要考虑传输数据包的顺序性?如果是:选择TCP。(TCP协议本身保证了这样的顺序性,如果你的应用使用了UDP,而由应用层来保证数据包的顺序性,那将是个噩梦!)</li><li>你的应用是否需要广播,或者组播?如果是:选择UDP。(应用层可以用TCP模拟提供这样的功能,但那不是TCP协议本身提供的的服务。)</li><li>你的应用是否需要很好的传输性能?(如:音频和多媒体应用)如果是:选择UDP。<br>
</li></ol>
<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">以上只是我基于自己的经验,给出的对于使用TCP还是UDP的一些基本判定。</span>
   
</div>