Android端TCP长连接的性能优化教程分享

前言

大家应该都知道,在Android端实现TCP长连接场景其实不多,我们最熟悉的不过推送和HTTP协议的实现(OkHttp),本文讨论的是在实现推送长连接的情况下怎么来做性能优化,下文只是我的一点拙见,有不妥之处还望指出,下面话不多说了,来一起看看详细的介绍吧。

推送长连接

可以说大部分APP是离不开推送(push)这个功能的,不过平常我们都是接入第三方SDK(极光、个推等)居多,因为要做一个推送服务,不光客户端要编写相应的Socket通信代码,服务器端更是麻烦,要处理大规模的长连接服务,消息还得及时送达,一两台服务器可是吃不消。相对来说客户端编写Socket通信的代码会简单一些,但是也是要处理一些平台相关的问题,比如推送服务进程如何保活,APP进程如何跟推送服务进程通信,如何节省手机电量和手机弱网情况下如何提升通信质量等一系列的问题。这些问题以后有时间分析,下面来看看TCP长连接性能如何来优化

影响TCP性能的点

TCP/IP体系太复杂了,想完全掌握确实很困难,我们只分析影响TCP性能的几个因素,看看在Android客户端可不可以进行优化

TCP连接的三次握手时延

我们知道要建立TCP连接,需要经过三次握手,三次握手成功后连接建立成功

  • 客户端请求新的连接,需要发送一个设置了SYN标记的分组,向服务器说明这三个连接请求
  • 如何服务器接受了这个连接请求,会向客户端回送一个设置了SYN和ACK的分组,向客户端说明连接请求已经被接受了
  • 客户端收到这个表明连接请求被接受的分组后,要发送一条携带ACK标记的确认消息(可能会在这个消息中携带业务数据)表明连接已经建立成功了,可以开始发送数据了

那建立TCP连接的三次握手而产生的时延对我们会有影响吗,大部分情况下是没有的,只有当HTTP请求传输的数据量比较小,然后呢这样的HTTP请求又非常频繁,这样算下来,握手产生的时延占比就很高了,这种情况下就要通过重用已有的连接来减少连接的次数。而推送长连接本身就是在保持连接的稳定性,无需在这点上进行优化

延迟确认

由于因特网本身无法保证可靠的分组传输,TCP就自己实现确认机制来确保数据的可靠传输,成功接收TCP分组数据的接收者都需要向发送者回送一个小的确认分组,发送者在一定的时间内没有收到这个确认分组,就认为之前发送的数据没有成功,然后会重发数据

但是由于确认分组非常的小,TCP为了有效的利用网络,会把确认分组塞到同向传输数据中去,组合在一起发送传输,如果在一定的时间内没有同向传输数据咋办,岂不是一直会重发?TCP肯定不会允许这种情况发送的,TCP针对这种情况实现了一种延迟确认算法,在一定的窗口时间(一般是100~200毫秒),确认分组还没有被捎带的话,那么确认分组就会单独发送

根据自己之前编写TCP长连接的经验,一般会在应用层设计一个业务ACK包机制,当收到一个业务数据时,马上会回送一个业务层的ACK包,这个业务层的ACK包就是同向传输数据,确认分组马上会被捎带,不会触发延迟确认算法,但是如果我们收到的消息频率很高,那产生的ACK包就会非常的多,再假设业务层的ACK包并不需要那么的及时,我们是否可以组合业务层ACK包再发送呢?

TCP慢启动

TCP连接的性能还受到拥塞控制机制的影响,当TCP连接刚开始连接上时,并不能一下子就发送很多的分组,可能是一开始只能发送一个分组,然后收到确认分组后,就可以发送两个分组,然后就是四个分组,以此类推。这个就是TCP慢启动,发送数据的能力是慢慢提升的

由于我们编写的是长连接,这种机制对我们的影响并不大

Nagle算法

由于TCP并没有规定每个分组最小值,所以我们可以每次都传输一个字节的数据,但是TCP有固定的标记和首部(至少40个字节),如果TCP发送大量的包含少量数据的分组时,网络的真实利用率就很低,网络整体性能会严重的下降。

所以呢TCP利用了Nagle算法,在发送了一个分组前,将大量TCP数据绑定在一起,提高网络的效率。Nagle算法鼓励发送全尺寸的分组,而且只有当所有的分组都被确认后,才能发送非全尺寸的分组,不然的话就缓存起来,直到积累足够发送一个全尺寸分组数据时才会将缓存的数据发送出去

那这个对我们编写TCP长连接时有什么影响呢,由于我们的心跳包和ACK包一般都很小,那么服务端就不能及时收到我们的心跳包和ACK包,会产生时延,可以通过下面的代码来禁用Nagle算法

Socket.setTcpNoDelay(true);

TIME_WAIT累积与端口耗尽

这个跟服务端相关,一般与客户端没什么关系,这里就不说了

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • Android中实现TCP和UDP传输实例
  • Android TCP 文件客户端与服务器DEMO介绍
  • Android实现TCP客户端接收数据的方法
  • Android编程实现TCP客户端的方法
  • Android编程实现TCP、UDP客户端通信功能示例
(0)

相关推荐

  • Android编程实现TCP、UDP客户端通信功能示例

    本文实例讲述了Android编程实现TCP.UDP客户端通信功能.分享给大家供大家参考,具体如下: 在进行Android开发的过程中,免不了,要开发TCP/UDP通讯的程序,下面这两段代码,分别介绍了TCP/UCP通过的一个实例: 代码一 TCP通讯: private void tcpdata() { try { Socket s = new Socket("192.168.0.25", 65500); // outgoing stream redirect to socket Out

  • Android中实现TCP和UDP传输实例

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified).在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能.应用层向TCP层发送用于网间传输的.用8位字节表示的数据流,然后TCP

  • Android编程实现TCP客户端的方法

    本文实例讲述了Android编程实现TCP客户端的方法.分享给大家供大家参考,具体如下: 因为项目上需要实现一个TCP Client 端:在网上找好多例子基本上都是阻塞方式完成: 我的实现例子:由Activity 及sever 来实现,在sever 创建一个线程来监听接受数据.收到数据,通过广播发送给Activity; 服务端我没有去实现,你可以下载TCP Socket 调试工具v2.2:创建个9005端口:客户端:访问的IP为10.0.2.2 AnetTest.java: /** * Copy

  • Android TCP 文件客户端与服务器DEMO介绍

    主要功能是: 1.TCP服务器提供文件下载服务,服务器支持多线程. 2.TCP Client从服务器上下载指定的文件,Client也支持多线程. 首先是服务器,服务器是在PC机上,JAVA运行环境,主要参考网上的代码,自己做了支持多线程处理,代码如下: 复制代码 代码如下: //file:DownloadServer.java import java.net.*;import java.io.*;class ServerOneDownload extends Thread {    privat

  • Android实现TCP客户端接收数据的方法

    本文实例讲述了Android实现TCP客户端接收数据的方法.分享给大家供大家参考,具体如下: 配合log4net使用,用来接收调试信息.因此,此客户端只管通过TCP接收字符串数据,然后显示在界面上. 接收TCP数据 try { Socket s = new Socket("192.168.1.5", 8240); InputStream inputStream = s.getInputStream(); DataInputStream input = new DataInputStre

  • Android端TCP长连接的性能优化教程分享

    前言 大家应该都知道,在Android端实现TCP长连接场景其实不多,我们最熟悉的不过推送和HTTP协议的实现(OkHttp),本文讨论的是在实现推送长连接的情况下怎么来做性能优化,下文只是我的一点拙见,有不妥之处还望指出,下面话不多说了,来一起看看详细的介绍吧. 推送长连接 可以说大部分APP是离不开推送(push)这个功能的,不过平常我们都是接入第三方SDK(极光.个推等)居多,因为要做一个推送服务,不光客户端要编写相应的Socket通信代码,服务器端更是麻烦,要处理大规模的长连接服务,消息

  • python用socket实现协议TCP长连接框架

    “ 使用python实现协议中常见的TCP长连接框架.” 分析多了协议就会发现,很多的应用,特别是游戏类和IM类应用,它们的协议会使用长连接的方式,来保持客户端与服务器的联系,这些长连接,通常是TCP承载的. 如果我们要模拟这个客户端的行为,根据不同应用服务器的实现情况,有些长连接不是必须的,但有些长连接,就必须去实现它.例如最近分析的某应用,虽然它主要使用HTTP协议进行交互,但它在TCP长连接中传输了一些必须的信息,如果不实现长连接,就会有很多信息无法处理. 在python中,很容易实现HT

  • MySQL性能优化技巧分享

    MySQL性能优化 在互联网公司MySQL的使用非常广泛,大家经常会有MySQL性能优化方面的需求.整理了一些在MySQL优化方面的实用技巧. Schema与数据类型优化 整数通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREMENT 完全"随机"的字符串(如:MD5().SHA1()或者UUID()等产生的字符串)会任意分布在很大的空间内,会导致INSERT以及一些SELECT语句变的很慢 如果希望查询执行得快速且并发性好,单个查询最好不要做太多的关联查询(互联网公

  • Vue 项目性能优化方案分享

    目录 前言 一.代码层面的优化 1.1.v-if 和 v-show 区分使用场景 1.2.computed 和 watch  区分使用场景 1.3.v-for遍历必须为item添加key,且避免同时使用v-if 1.4.长列表性能优化 1.5.事件的销毁 1.6.图片资源懒加载 1.7.路由懒加载 1.8.第三方插件的按需引入 1.9.优化无限列表性能 1.10.服务端渲染 SSR or 预渲染 二.Webpack 层面的优化 2.1.Webpack 对图片进行压缩 2.2.减少 ES6 转为

  • MySQL配置文件my.cnf中文详解附mysql性能优化方法分享

    下面先说我的服务器的硬件以及论坛情况,CPU: 2颗四核Intel Xeon 2.00GHz内存: 4GB DDR硬盘: SCSI 146GB论坛:在线会员 一般在 5000 人左右 – 最高记录是 13264.下面,我们根据以上硬件配置结合一份已经做过一次优化的my.cnf进行分析说明:有些参数可能还得根据论坛的变化情况以及程序员的程序进行再调整.[mysqld]port = 3306serverid = 1socket = /tmp/mysql.sockskip-locking # 避免My

  • Python 代码性能优化技巧分享

    如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个

  • Asp.net 网站性能优化二则分享

    随着后端优化空间越来越小,现在越来越多的网站更注重前端性能的优化,就是浏览器,http层面的优化,这里写两点最简单最有效的 asp.net网站优化技巧. 了解常见的网站性能优化技巧 首先我们要学一些优化网站性能和体验的理论和基础知识,雅虎已经帮我们总结好了,详见参考链接中的几篇文章,有好心人已经给翻译成中文了.这里面提到的一些技巧可操作性都很强,建议每一个网站开发人员都仔细学习并进行实践,可以说不了解这里面说的优化技巧,提升网站前端性能就无从谈起. 诊断网站性能 要想优化网站的前端性能,首先要查

  • Mysql性能优化方案分享

    网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化. mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句: mysql> show variables; 一.慢查询

  • SQLite 性能优化实例分享

    最早接触 iOS 开发了解到的第一个缓存数据库就是 SQLite,后面一直也以 SQLite 作为中坚力量使用,以前没有接触到比较大量数据的读写,所以在性能优化方面关注不多,这次对一个特定场景的较多数据批量读写做了一个性能优化,使性能提高了十倍. 大致应用场景是这样: 每次程序启动会从服务器拉取一些数据,对本地数据库两个表进行同步更新,不存在就写入,存在就更新其字段.数据少的时候几十条,多的上千条. 由于缓存的数据可能会存在异步同时读写,所以做了一个后台同步队列,所有的缓存数据库操作都在这个队列

  • iOS性能优化教程之页面加载速率详解

    前言 我认为在编码过程中时刻注意性能影响是有必要的,但凡事都有个度,不能为了性能耽误了开发进度.在时间紧急的情况下我们往往采用"quick and dirty"的方案来快速出成果,后面再迭代优化,即所谓的敏捷开发.与之相对应的是传统软件开发中的瀑布流开发流程. 卡顿产生的原因 在 iOS 系统中,图像内容展示到屏幕的过程需要 CPU 和 GPU 共同参与.CPU 负责计算显示内容,比如视图的创建.布局计算.图片解码.文本绘制等.随后 CPU 会将计算好的内容提交到 GPU 去,由 GP

随机推荐