序言

对具有网络编程经验的开发人员来说,用哪种数据传输层协议来实现数据通信是一个很基本的问题,涉及到如何编写你的第一行代码。

自从 PC时代的 IM开始, IM开发人员就在为选择数据传输协议而争论(比如:为什么 QQ使用 UDP协议代替 TCP协议?这类问题,有时会出现在社区中)。在移动因特网时代,考虑到移动网络的不可靠性等特点,加上手机的节能策略、流量压缩等,使得这一问题的答案增加了更多的不确定性。

对有选择困难证的人来说,基于上述因素,加上 UDP和 TCP协议的本质区别,这样的选择的确是很纠结的。文章从作者的实践总结,提出自己的看法,如有异议请理性地回复,不找喷,仅供参考。

手机端即时通讯/IMQQ群:http://www.52im.net/portal.php?mod= topic& topicid=2)

2.引用文件

为何 QQ使用 UDP协议代替 TCP协议?

“UDP中一个软件包的最大大小可以是多少”

在 TCP协议基础上实现移动端即时通讯仍需心跳保活

NAT详解:基本原理,穿越技术(P2P漏洞),端口老化等。

电脑网络通讯协议图表(中文珍藏版)

“理论经典: TCP的3次握手和4次挥手过程的细节”

“微信影响网络的技术测试与分析”(论文全文)

手机端 IM开发者必读(1):简明易懂,了解移动网络的“弱”与“慢”

手机端 IM开发人员必读(二):史上最全移动弱网优化方法综述

在客户端视角下,探讨移动端 IM的信息传递与可靠度

“现代短连接移动端网络优化手段综述:请求速度,弱网适应,安全保障”

High Network Programming (I):单台服务器并发 TCP连接的数量。

High Network编程(2):最近10年,著名的C10K并发连接问题

HighWeb编程(3):下一个10年,是考虑C10M并发问题的时候了。

High Network编程(四):从C10K到C10M High Network的理论探索

不知名的网络编程(I): TCP协议中的疑难杂症解析(I)

不知名的网络编程(2): TCP协议中的疑难杂症解析(下)

不知名的网络编程(三):当 TCP连接关闭时,为什么会出现TIME_WAIT,CLOSE_WAIT

不知名的网络编程(四):对 TCP异常关闭的深入研究分析

不知名的网络编程(5): UDP的连接和负载平衡

不为人所知的网络编程(六):对 UDP协议的深入理解和使用

不知名的网络编程(7):如何使不可靠的 UDP变得可靠?

“网络编程懒汉导读”(一):网络通信协议的快速理解(上篇)

“网络编程懒汉导读”(二):网络通信协议的快速理解(下一篇)

“网络编程懒虫入门(3):快速了解 TCP协议足够了”

网上编程懒汉入门(4):对 TCP和 UDP之间区别的快速理解

网上编程懒虫入门(5):快速理解为什么说 UDP有时比 TCP更有优势

网上编程懒虫(6):史上最流行的集线器、交换机、路由器功能原理入门

Web编程懒惰入门(7):深入了解 HTTP协议,全面了解 HTTP协议

“Web编程懒虫入门(八):手把手教你如何编写基于 TCP的 Socket长连接”

脑残网络编程入门(1):学习 TCP的三握手和四挥手的动画教程

脑残网络编程入门(2):当我们在阅读和编写 Socket的时候,我们到底在阅读和编写什么?

3、UDP vs TCP

是 TCP还是 UDP?如何实现长连接?怎样实现心跳机制?怎样确定心跳间隔?当我们讨论类似于移动端 IM,消息推送这样的话题时,我们几乎肯定会提出这些问题。这儿试着正本清源。

四、因特网、移动因特网网络环境

必须先讨论因特网和移动因特网的网络环境特征,然后才能分析究竟应该使用 UDP还是 TCP。

因特网的网络基础建设,经过十多年的长期发展,已经比较稳定和成熟, PC终端,操作系统的能力也达到了很高的水平。

但是移动互联网,由于它涉及到无线电话网基站、2 G、3 G和4 G技术的不断发展,虽然它的稳定性、带宽、资源分配等各个方面都日趋完善,但在目前毕竟还是有很多问题存在。此外,由于移动因特网的“移动”特性,加上智能终端设备(智能手机、平板电脑)的发展较晚,目前的情况仍在不断演变之中,与因特网相比,移动因特网还是低速、不稳定、终端能力稍弱的。并且因为其“移动”的本质,很难在短时间内实现互联网的品质。

因此,在因特网的环境中,网络应用由于网络设施、操作系统的成熟,开发使用起来比较容易,资源也比较充足。而且手机网络还得“小题大做”。

智能终端电池续航能力,系统休眠

电池寿命一直是智能终端设备的技术瓶颈。如果持续使用,绝大多数智能设备电池都不能支持超过2小时。因此,在没有外部电源的情况下,智能终端设备必须经常长期处于休眠状态,这将对两种网络环境下的网络应用场景产生巨大影响。

6,IPv4资源, Port资源

这一主题经常被许多人忽视,但却具有重要意义。尽管人们普遍认识到 IP地址短缺所导致的 IP动态分配的必要性,但却忽视了 IP地址不足所造成的端口资源短缺问题。

因为 IP地址必须动态分配(不只是指互联网入口的 IP,也包括局域网内的 IP),所以路由器的工作原理是通过端口映射,将内部网络(包括 PC、手机、平板电脑、 Wifi、2 G、3 G、4 G) IP与端口映射到外部 IP (通常为公网 IP)以及对应端口上,并保持这种映射关系,以便正常地修改、转发消息信息,保证内部各 ip、端口与外部各 ip、端口之间的通信。

但单一 IP地址的端口资源有限,且理论上限为65535。这对一般的宽带路由器来说已经足够了。可是!由于网络服务规模较大,网络骨干网接入点多,如果 IP资源不足,每个 IP数万个端口的资源将迅速枯竭,影响正常通信。

7.端口映射的老化时间

由于这个原因,所有的路由器都为每一个端口映射关系设置老化时间,如果老化时间倒数到0,这个端口映射关系就会失效,并释放给其他连接使用。在端口已用完的情况下,将无法再创建内部到外部的网络连接。

老化的端口地图,比许多人想象的要短很多。普通家用宽带路由器,老化时间一般为2-3分钟;有线宽带运营商接入部分,老化时间可不超过2分钟。无线电话网的运营商接入部分(如 GPRS连接)使用时间甚至不超过一分钟!

这就是说,任何一种网络通信(无论是 TCP还是 UDP),如果在几分钟内没有网络消息传输,它所占的 IP地址端口就会被路由器回收。此时这一次的通讯肯定会中断, TCP和 UDP,神马都是浮云。

更为严酷的事实是,可以认为因特网是由无数路由器连接而成的,经常需要通过 n个路由器进行网络通信,每个路由器都有自己的端口映射。当一个路由器重新连接它的端口时,整个通信就中断了。

因此,许多人对 TCP的 KeepAlive参数不能保证长连接感到困惑。KeepAlive的 TCP缺省使用时间为2小时(而且这个参数还是 TCP的可选实现,不是必然实现),在路由器端口映射老化时间的影响下,必然无法使用它。事实上,这个参数只存在于一个 LAN中,并且取决于特定的操作系统。

TCP长连接的实用性在移动因特网环境下大打折扣,这是因为路由器端口映射的存在,加上智能终端经常长时间处于休眠状态。

另外,移动端 IM、推系统还必须实现所谓的心跳包机制,以避免将老化的端口映射关系循环为0,从而避免连接中断。

8.端部承载能力

无论是 UDP还是 TCP,最终都是由应用服务器端的设备来提供服务。但是, TCP协议由于提供了安全可靠的流服务,对计算机和网络资源的消耗远大于 UDP协议。为了更好地配置主流服务器,需要配置大量内存(从几十 G到几百 G),并且可以同时支持数以百万计的 TCP连接,包括高速磁盘和网卡。但是这里需要更专业的服务器设置,需要调整的系统参数很多,加上服务程序的配合。此外, TCP连接的建立、维护和释放,都需要耗费大量的计算、网络资源。

端点联机服务,若是比较简单的服务,不一定使用 TCP的许多高级功能,但承受 TCP的昂贵成本,也不一定值得。假如能够使用 UDP提供服务,单服务器的承载能力,是可以达到 TCP服务的几十倍,甚至上百倍的增长。同时, DNS这一数量庞大的服务器也提供了 UDP接口。

此外,上百万台 TCP连接的网络服务,其编程困难,程序复杂,调试困难,服务器运行费用,网络费用等都远高于 UDP。

而且 UDP编程,与数百万终端通信的难度和成本都大大降低。UDP通常是一种更合适的方式,如果所提供的网络服务不是基于流的服务,并且允许某些特定的故障概率(比如P2P)。

9.应用高级网络通信要求

然而,移动端即时通讯系统中的推送系统一方面提供终端在线服务,另一方面也需要考虑内容信息的完整性和安全性。总之,丢失了信息,或被人窃听了通信,是很难接受的。无论是网络层的可靠性控制,还是应用层的安全支持(如 HTTPS), TCP都为应用提供了不可替代的强大功能和便利。

十、结论

综观上面的论述,实际上答案也是呼之欲出的。

目前,移动端的 IM、推送系统,既面临着移动互联网的不确定性,又面临着智能终端频繁的系统休眠、网络切换,还需要考虑服务端的承载成本,对在线服务来说, UDP比 TCP更适合。但由于数据完整性、安全性的要求, TCP的可靠性和安全性也不能完全放弃。

因此,个人认为,更合适的方法应该是:两个通信协议都使用,各有侧重。使用 UDP来保持大量终端的联机控制,通过 TCP来实现应用和业务。这种和 FTP服务控制与数据分离,采用不同的连接方式,这是异曲同工的。

实际上,这也是 IM巨头 QQ采取的策略。以前, QQ主要还是用 TCP协议为主,后来改为使用 UDP协议来保持在线状态, TCP协议则是用上载和下载数据。UDP是 QQ的默认运行方式,运行效果很好。认为这一点也被微信复制了。

简易考据:登陆 PC版 QQ,关闭多余的 QQ窗口,只留下主窗口,并将其减至最少。过了几分钟,查看系统的网络连接,会发现 QQ进程没有保留任何 TCP连接,但是有 UDP网络活动。此时发送聊天信息,或打开其他窗口和功能, QQ进程将被发现, TCP连接将被启用。


----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯开发涉及到的技术领域十分广泛,主要涉及以下几个领域:

即时通讯私有化部署是什么?

哇谷科技JM沟通即时通讯内核升级新版哇谷2.0即将上线

2.0哇谷即时通讯系统正式上线适合大型项目运营超稳定性

哇谷IM动态增加官网显示热门动态

JM沟通app即时通讯聊天系统功能介绍