来源:http://www.xgdown.com/
发现很多情况下,MSN传输文件比QQ要慢,倒不是说msn没有快的时候,但是大部分的时候是真的比QQ慢,连我这种神经比较大条的人都注意到了,Google了一下,早就有人做了解答,基本上就是说msn传输文件是使用TCP,而QQ使用UDP,剩下的事情就是论证TCP传输文件没有UDP快。大概的就是下面的几个观点:
1. TCP是可靠的,需要验证数据是否到达和是否正确,而UDP是不可靠的,少做了很多事情,所以MSN的文件传输比QQ慢。
我看了当时就想笑,也用了QQ不少时日了,从来也没有发现传输文件有问题的,用UDP作协议也很久了,不做应用层验证重传的代码,我还真不敢写。这个理由,失败。
2. TCP建立连接需要3次握手,而UDP不需要,所以TCP慢。
3次握手这个事实倒是千真万确,还好我没有那么容易被忽悠,两个人谈话之前要握握手的确要稍微费上几秒钟,但是这个关谈话的语速啥事情?假如网络的ping值达到300ms,各位看官喜欢网络游戏的,估计都不会玩了,否则垂死的boss会高兴的发现你忽然变成了木偶可以随便殴打不还手,最后你只能骂骂电信网通然后复活几分钟后又是一条好汉。但是对于TCP,这样的ping值,3次握手一般都不需要1秒钟,把这个定为文件慢慢传的罪魁祸首,似乎太不靠谱了,这个理由还是失败。
3. TCP一旦建立链接,路由就确定了,而UDP是不确定的路由方式,谁速度快走谁的线路。
这样说就说明没有作者好好理解TCP/IP协议了,TCP的链路只是一个逻辑的,又没有建立物理链路,下面跑的还是IP包,这个包走这条路,那个包完全可能走另外的路,这点TCP和UDP没有两样。理由继续失败。
4. msn服务器在国外?
有些道理,但是我听一个美国的朋友说他也喜欢用QQ传文件的。
那到底是怎么回事呢?是因为微软没有做好?(题外话,个人的确觉得MSN相比QQ的飞速进步而显得动作迟缓)QQ的Fans开始摩拳擦掌,一些不那么喜欢M$的估计就要开始丢板砖了。不管立场如何,事实还是要探寻一下,本着不求甚解,薄积薄发,浅入浅出的精神,我认为有几个可能原因:
1. 两个传文件客户端都在NAT后面的时候 (你不知道NAT啥意思?比如多个人通过路由器共享一个猫上网,那么你们一般就是在NAT后面了),从技术实现上讲,TCP在这种情况下穿越NAT比UDP麻烦得多。UDP只要开始几个穿越NAT的协商包需要服务器转一下,后面的文件数据可以两个客户端之间直接传输搞定,但是一般TCP就只能全程由服务器中转了,你说哪一个会比较快? 为什么TCP需要服务器中转?先看看NAT吧,听说有高人可以用raw sock搞定,反正我没有中间服务器搞不定。
2. 但是即使上面的条件不成立,msn还是一般比QQ慢的。问题还是在出在前面提到的验证数据可靠性上面,TCP是可靠的,UDP是不可靠的,但是用UDP做传输文件这档子事情,肯定要在应用层写一个验证的协议,否则传过来的文件缺胳膊少腿,会被用户骂死的。说是协议,其实也不难,打个比方吧:
long long ago,贾宝玉在北京,林黛玉在长沙,怎么互诉衷肠呢,派家丁送信!路途遥远,怎么知道信收到没有?打电话问?那时候发明了这个就不用送信了,只能看家丁是否带了回信来了。假如发现一个家丁一个月还没有回,那就多半迷路堵车遭遇山贼或者开小差到扬州花差快活去了,再派一个人送吧! TCP就是这么做的,UDP在应用层协议一般也需要这么做,但是实现上有时候往往有区别。
北京到长沙之间的路,并不是只有一个人跑的,常常很拥堵,假如发现家丁好久没有回了,TCP版的贾宝玉再派人送信是要的,但是他会比较识大体,他会少写信,降低发送速度,原来一天一封,现在可能一周一封了。他想,大家假如都这样,路就不会那么拥挤了。这做法很有道理,假如塞车了大家都想见缝插针,只能越来越塞,最后大家都动不了,还不如彼此容让慢慢排队。而UDP版本的贾宝玉假如也这么集体主义,那么他就叫做TCP友好流,就假如它只管自己拼命挤,就是非TCP友好的。
所有的TCP协议假如发现拥塞,都会马上降低自己的发送速度。假如基于UDP的协议不这么做的话,原来拥塞的IP包加上重发的包,网路只会越来越拥塞,最后所有的坚持集体主义的TCP流都会做出牺牲,把带宽让给一些非TCP友好的UDP流。所以除非网络状况非常好,否则TCP是拼不过非TCP友好的协议的。
我怀疑(仅仅是怀疑而已,我也没有条件和时间验证),QQ的文件传输机制是不那么TCP友好的,它抢带宽更加"我能",这样虽然对于整个网络负荷不是什么好事,但是对于单个用户,就见仁见智了,就好像大家看待多线程下载或者p2p一样。
分享到:
相关推荐
本资源是使用 java,分别用 TCP 和 UDP 传输文件的源代码。读者朋友可以下载下来,参考着满足自己的需求。 另有博客《Java 使用 TCP 和 UDP 传输文件》可以参考,地址是:...
在计算机网络中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种最常用的传输层协议,它们各自有着不同的特点和应用场景。本篇将详细阐述TCP和UDP协议的工作原理、特性以及它们在数据...
总的来说,"基于TCP/UDP的文件传输"项目涉及了网络通信的基础理论,包括TCP和UDP的工作原理,以及如何在UDP上实现可靠性的挑战和解决方案。这个项目对于理解网络协议、提高网络编程技能,尤其是对网络传输效率和可靠...
在数据传输过程中,TCP提供顺序传输和错误检测,通过确认、重传机制保证数据的完整性。此外,TCP还通过拥塞控制策略来防止网络拥塞。在C#编程中,可以使用System.Net.Sockets命名空间的TcpClient和TcpListener类进行...
学习TCP和UDP传输源码,有助于深入理解网络通信的基本原理,包括网络层的IP协议、数据包的封装和解封装过程,以及传输层的协议特性。同时,通过实际编写和运行代码,可以提升解决问题和调试网络程序的能力。对于网络...
总的来说,TCPUDP数据传输工具为网络专业人员提供了一个实用的平台,让他们能够深入理解TCP和UDP的工作原理,以及在实际应用中的表现,从而优化网络通信的效率和稳定性。通过实验和比较,用户可以更好地选择适合自己...
UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,它是Internet协议套件的...在实际应用中,对于需要高度可靠性的文件传输,TCP通常仍是首选,而UDP更适合那些对速度和实时性有更高要求的特定场景。
总的来说,TCP和UDP仿QQ聊天程序源码的学习,不仅可以帮助我们深入理解这两种传输协议的工作原理,还能提升我们的网络编程能力,特别是对于并发连接和文件传输的处理。通过实际操作和代码阅读,我们可以更好地掌握...
从文件列表看,"www.pudn.com.txt"可能是一个文档,包含了关于TCP和UDP传输测试的更多说明或代码示例。而"UDP协议测试"和"TCP传输测试"可能是包含源代码的文件,用于实现上述功能。 在源代码中,我们可能会看到以下...
相比之下,UDP协议是一种无连接的协议,不保证数据的顺序和可靠性,但它的简单结构使其具有更快的传输速度和更低的系统开销。UDP适用于实时性要求高的应用场景,如在线视频、语音通话等,因为即使偶尔丢失一两个...
TCP/IP协议是互联网通信的基础,其中TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。TCP提供了一种可靠的数据传输服务,它通过序列化、确认、重传等机制确保了数据的准确无误地到达目的地。而...
实验不仅要求学生实现基本的字符串和文件传输功能,还鼓励学生进行创新性的扩展,如增加目录传输能力,允许客户端请求查看服务器上的目录结构,再选择具体文件进行下载。这样的设计更加贴近实际应用,增加了系统的...
1.封装了Tcp/Udp传输字串、文件、对象的细节,处理了Tcp粘包问题 2.测试代码设计原始Socket、TcpListener、TcpClient、UdpClient的使用 3.测试代码包括一个可以发送文本消息和发送文件的聊天室 4.设计网络通信、多...
首先,让我们深入理解UDP文件传输的基本原理。在UDP中,数据被封装成数据报,并发送到指定的IP地址和端口号。由于UDP不保证数据包的顺序、完整性和重复,因此在实现文件传输时,需要自定义一套机制来确保数据的正确...
在IT领域,网络编程是构建分布式系统和网络应用的基础,其中TCP和UDP是两种主要的传输层协议。本文将深入探讨这两个协议以及如何使用C语言进行socket编程。 首先,TCP(Transmission Control Protocol)是一种面向...
为了解决UDP在文件传输中的可靠性问题,可以采用一些策略,例如实现自己的拥塞控制和重传机制,或者使用基于UDP的可靠传输协议如QUIC(Quick UDP Internet Connections),这是一种由Google设计的实验性协议,结合了...
总的来说,TCP和UDP Socket调试工具V2.2是一款实用的开发辅助软件,它简化了网络编程中复杂的数据传输和连接管理,帮助开发者快速定位问题,优化网络应用的性能。无论你是初学者还是经验丰富的程序员,都能从中受益...
在计算机网络领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议,它们各自有着不同的特性和应用场景。本篇文章将深入探讨这两种协议的工作原理、特性以及它们在实际应用中的差异。 TCP...
它保证了数据的顺序传输和错误检测,通过序列号、确认应答、重传机制等确保数据无丢失、无重复。在TCPTest中,`TCPServer`和`TCPClient`分别代表服务器端和客户端的实现,用于模拟TCP数据流传输。它们可以用来测试在...
总的来说,TCP和UDP协议在客户端的应用主要涉及到网络连接的建立、数据的传输和错误处理。在Java编程中,Socket类和DatagramSocket类是实现这两类协议的关键。理解它们的工作机制和用法,可以帮助开发者构建高效、...