共计 2462 个字符,预计需要花费 7 分钟才能阅读完成。
对于有过网络编程教训的开发者来说,应用何种数据传输层协定来实现数据的通信,是个十分根底的问题,它波及到你的第一行代码该如何编写。
从 PC 时代的 IM 开始,IM 开发者就在为数据传输协定的选型争论不休,隔一段时间就能在社区里看到)。到了挪动互联网时代,鉴于挪动网络的不可靠性等特点,再加上手机的省电策略、流量压缩等,为这个问题的答复增了更多的不确定因素。
对于有抉择艰难证的人来说,基于以上因素,加上 UDP 和 TCP 协定的实质差别,这样的抉择的确很纠结。
UDP vs TCP
TCP 还是 UDP?长连贯如何实现?如何实现心跳机制?心跳的距离如何确定?这些问题都是探讨挪动端 IM、音讯推送等相似话题时,简直肯定被问到的问题。这里尝试正本清源一下。
互联网、挪动互联网网络环境
在剖析到底应该应用 UDP 还是 TCP 之前,有必要先讨论一下互联网与挪动互联网的网络环境特点。
互联网的网络根底建设,通过十几年长期的倒退,曾经较为稳固和成熟,PC 终端、操作系统的能力也达到了较高的程度。
而挪动互联网,因为波及到无线电话网络基站、2G、3G 和 4G 技术的一直倒退,其稳定性、带宽、资源分配等各方面虽日趋完善,但以后究竟还有不少问题的存在。另外,因为挪动互联网其“挪动”的实质,加上智能终端设备(智能手机、平板电脑)的倒退较晚,目前还在一直演变的状况,与互联网相比,挪动互联网还是低速、不稳固、终端能力稍弱的状况。而且因为其“挪动”实质,短时间内很难达到互联网的品质。
所以,在互联网的环境外面,网络应用程序因为网络设施、操作系统的成熟,开发应用起来比拟容易,资源也较为短缺。而挪动互联网还是要“宽宏大量”。
智能终端电池续航能力,零碎休眠
智能终端设备的电池续航能力始终是技术瓶颈。在间断应用的状况下,绝大部分智能设施电池无奈反对两个小时以上。所以在没有内部电源的状况,智能终端设备必须频繁、长时间休眠,这将极大地影响两种网络环境下的网络应用场景。
IPv4 资源、端口资源
这个话题往往被很多人疏忽,但它有着至关重要的影响。尽管大部分人都很分明 IP 地址的紧缺导致的动静 IP 调配的必然,却疏忽了因为 IP 地址有余引起的端口资源有余。
因为须要动态分配 IP 地址(这里不仅仅指互联网入口的 IP,还包含局域网外部的 IP),路由器的工作原理都是通过端口映射,把外部网络(包含 PC、手机、平板、Wifi、2G、3G、4G)IP 与端口映射成内部 IP(通常是公网 IP)和对应的端口,并维持这个映射关系,能力失常地批改、转发报文信息,保障外部各个 ip、端口与内部的各个 ip、端口的通信。
然而,单个 IP 地址的端口资源是无限的,实践下限是 65535 个端口。对于一般宽带路由器来说,这个曾经很短缺了。然而!对于大型的网络服务、网络骨干接入点等来说,如果 IP 资源有余,每个 IP 几万个端口的资源很快会耗尽,从而影响失常通信。
端口映射老化工夫
正因为如此,所有的路由器都会为每个端口映射关系设置老化工夫,如果老化工夫倒数到 0,则端口映射关系生效,该端口被开释给其余连贯应用。如果端口全副耗尽,则无奈再新建外部与内部的网络连接。
端口映射老化工夫,比很多人设想中的要短很多。个别的家用宽带路由器,老化工夫个别是两三分钟;在有线宽带运营商接入局部,老化工夫可能少于两分钟。在无线电话网络运营商接入局部(例如 GPRS 连贯),老化工夫甚至不超过一分钟!
也就是说,任何一个网络通讯(不论是 TCP 或 UDP),如果几分钟之内没有网络报文传输,其占用的 IP 地址端口将被路由器回收。这个时候该次通信必将终止,不论 TCP 还是 UDP,神马都是浮云。
更残暴的事实是,互联网可认为是由无数个路由器连贯而成的,一个网络通信往往须要通过 n 个路由器,每个路由器都会为一次通信建设本人的端口映射。只有其中一个路由器回收其端口,则整个通信中断。即时通讯聊天软件 app 开发能够征询蔚可云。
这也是很多人纳闷为什么 TCP 的 KeepAlive 参数无奈保障长连贯的起因。TCP 的 KeepAlive 默认是两个小时(而且该参数还是 TCP 的可选实现,不是必然实现),在路由器端口映射老化工夫的影响下,必然无奈施展其作用。实际上,该参数在繁多的局域网内才可能被应用上,还要依赖具体的操作系统。
因为路由器端口映射的存在,加上智能终端频繁、长时间的休眠,TCP 长连贯的实用性在挪动互联网状况下极大地打了折扣。
也因为如此,挪动端 IM、推送零碎必须实现所谓的心跳包机制,以放弃端口映射关系的老化工夫不会缩小到 0 而被回收,从而防止连贯中断。
服务端承载能力
不论是 UDP 还是 TCP,最终都是应用服务端的设施去提供服务的。而 TCP 因为提供了安全可靠的流服务,其对计算机、网络资源的耗费是远远大于 UDP 协定的。对于配置较好的支流服务器,装备大量的内存(数十 G 至上百 G 内存),与高速的磁盘、网卡,是能同时反对数百万个 TCP 连贯的。不过这里须要较业余的服务器设置,须要调整不少零碎参数,再加上服务程序的配合。另外,TCP 连贯的建设、维持与开释,都是须要较低廉的计算、网络资源的。
终端在线服务,若是一个较为简单的服务,未必应用上 TCP 泛滥的高级性能,但接受 TCP 的低廉老本,未必值得。如果能用 UDP 来提供服务,单服务器的承载能力,是能够去到 TCP 服务的数十倍,甚至上百倍的增长。这也是为什么 DNS 这种并发数微小的服务器提供 UDP 接口的起因。
另外,上百万 TCP 连贯的网络服务,其编程的难度、程序复杂度、调试难度、服务器运维老本、网络老本等都远远高于 UDP。
而 UDP 编程,与上百万个终端通信的难度与老本则低很多。如果提供的网络服务不是基于流的服务,也容许肯定的失败机率(例如 P2P),则 UDP 往往是更适宜的形式。
高级利用网络通讯要求
不过,挪动端 IM 零碎、推送零碎一方面提供终端在线服务,另外一方面也须要思考内容信息的完整性和安全性。毕竟信息的失落,或者通信的被窃听,都是难以承受的。而 TCP 不论在网络层的可靠性管制,还是在应用层的平安反对(例如 HTTPS),都为利用提供无奈代替的弱小性能和便当。