场景题/智力题

来自网络上到处收集

在弱网环境下,如何确保一个请求发送成功/如何提高http连接成功率?

弱网环境会存在的问题:

丢包、错包、乱包。
高延迟:响应数据回来时间长,甚至大于客户端等待时间
带宽小:每次通信的内容少,数据包越大受影响越大
网络断续:网络经常断开又连接,类似于经常出入电梯

弱网下优化处理:
参考:弱网环境下的网络性能调优 - 红嘴鲤鱼 - 博客园

1、采用TCP协议、实现长连接
2、采用长连接池,节省握手时间
3、采用ProtocolBuffer,减少冗余数据(相比xml)
4、弃用DNS,直接使用IP,减少了请求DNS服务查询IP的时间,避免被DNS劫持
5、加入重试机制,提供成功率
6、使用Http 2.0,压缩头部、长连接更加彻底、支持推送、支持(Multiplexing:支持一个TCP连接上同时实现多个请求和响应。)
7、超时时间设置可以适当延长(限制放宽一点)

参考:在弱网环境下HTTPS比起HTTP来是否会让移动应用的体验显著变差? - 知乎

可以将https切换为http:
在这里插入图片描述

参考:弱网环境下如何优化网络请求_free_android的博客-CSDN博客
1、 前后端采用gzip方式请求和响应

前端在请求header添加:“content-encoding” 为 “gzip”

后端也要开启gzip,才能生效

相比不采用gzip的请求方式,能节省流量,可以快速响应

android:OKHttp请求框架默认支持gzip,不需要额外配置。

参考:弱网搭建及模拟工具,弱网或无网状态下 App的优化,弱网优化,网络优化(DNS/HttpDNS)_ShareUs的专栏-CSDN博客

1、断线重连。这可能是最重的一个特性,因为在无线网络中有太多的原因导致数据连接中断了。这里可以使用CDN。(CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN 的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避免单点失效带来的不良影响。)
2、由于创建连接是一个非常昂贵的操作,所以应尽量减少数据连接的创建次数,且在一次请求中应尽量以批量的方式执行任务。如果多次发送小数据包,应该尽量保证在2秒以内发送出去。在短时间内访问不同服务器时,尽可能地复用无线连接
3、优化DNS查询。应尽量减少DNS查询、避免域名劫持、DNS污染,同时把用户调度到“最优接入点”。
4、减小数据包大小和优化包量。通过压缩、精简包头、消息合并等方式,来减小数据包大小和包量
5、控制数据包大小不超过1500,避免分片。包括逻辑链路控制(Logic Link Control)分片、GGSN分片,以及IP分片。其中,当数据包大小超出GGSN所允许的最大大小时,GGSN的处理方式有以下三种:分片、丢弃和拒绝。
6、优化TCP socket参数,包括:是否关闭快速回收、初始RTO、初始拥塞窗口、socket缓存大小、Delay-ACK、Selective-ACK、TCP_CORK、拥塞算法(westwood/TLP/cubic)等。做这件事情的意义在于:由于2G/3G/4G/WIFI/公司内网等接入网络的QoS差异很大,所以不同网络下为了取得较好的服务质量,上述参数的取值差异可能会很大。
7、优化ACK包。在弱网络的情况下,TCP协议中的ACK包是非常昂贵的,延时甚至能够达到秒级别,而TCP协议的拥塞控制、快速重传、快速恢复等特性都非常依赖接收端反馈的ACK包。可想而知,如果发送端接收到的ACK包延时太长,会严重影响TCP协议的效率。但是如果发送ACK太多又会占用宝贵过多的无线资源。在移动网络下通信,“在可靠的连接上,如何在减少ACK包的情况下,降低数据包的延时”是研究的热点。基本的思想:平衡冗余包和ACK包个数,达到降低延时,提高吞吐量的目的。

app如何精准校时(客户端的时间如何与服务端的时间进行较准?)

客户端与服务器端时间校准_Jason Wang-CSDN博客

1、服务器端永远使用UTC时间,包括参数和返回值,不要使用Date格式,而是使用UTC时间1970年1月1日的差值,即long类型的长整数。
2、APP端将服务器返回的long型时间转换为GMT8时区的时间,额外加上8小时,这样就保证了无论使用者在哪个时区,他们看到的时间都是同一个时间,也就是GMT8的时间。
3、APP本地时间会不准,少则差几分钟,多则十几分钟,要解决这个问题,我们可以使用HTTP Response头的Date属性,每次调用服务器接口时就取出HTTP Response头的Date值,转换为GMT时间,再减去本地取出的时间,得到一个差值d,我们将这个差值d保存下来。每次获取本地时间的时候,额外加上这个差值d,就得到了服务器的GMT8时间,就保证了任何人看见的时间都是一样的。

或者:如何计算游戏客户端与服务器之间的时间延迟?_huangquanxi的专栏-CSDN博客
计算客户端与服务器之间的时间延迟:

1)客户端A先记录自己的本地时间TA1,然后给服务器发B发送一个报文。

2)服务器B收到报文之后,记录自己的本地时间TB,然后把TB放入报文里发送给客户端A。

3)客户端A收到信息之后,记录下收到报文的时间TA2.

由于报文往返的时间是相等的,所以客户端发送给服务器的时间延迟P = (TA2 - TA1)/ 2。一般,P只计算一次是不够精确的。我们可以让客户端A定时的给服务器B发送测量信息,然后计算P的平均值。

如果我们想要知道客户端和服务器的本地时间差,可以怎么获取呢?

也是可以通过公式计算出来的

我们可以先假设A和B的本地时钟是一样的(当然这个假设明显不成立),那么

TB = TA1 + P ,把上面的P套入公式,整理后可以得TB = (TA1 + TB2) / 2

可是实际上A和B之间是有时间差X的,于是 TB + X = (TA1 + TB2)/ 2

整理后可得X = (TA1 + TB2)/ 2 - TB

一个app在启动的时候有很多模块要加载,一个模型就要使用一个线程,怎样限制线程的最大使用数量?

设置一个信号量作为最大线程并发数,通过PV操作来同步和限制每个时刻的线程并发数。

两根不均匀的香,1小时烧完,怎么得到15分钟

1、同时点上其中一根香的两头,另一根只点一头;

2、当点两头那根香燃完时,时间过去半小时,另一根香剩下的可以燃半小时,再点上它的另一头(开始计时);

3、当这根香燃完时,时间为15分钟。

门外3个开关,门内三盏灯,门外看不到门内的状况,只能进去一次,怎么确定所以开关对应哪个灯?

假如有K1、K2、K3三个开关,先打开K1、K2等一段时间后, 关掉K2。
然后进门,这时有一个亮着的灯就是K1控制,再有手去摸下不亮的两个灯,有发热的就是K2控制,不热的就是K3控制。

甲乙轮流抛硬币,正面胜,先抛的人优势多大?

甲乙轮流抛硬币,正面胜,先抛的人优势多大? - 知乎
在这里插入图片描述
如果是三个人呢?

在这里插入图片描述

n个点随机分布在圆上,问分布这些点都分布在同一半圆的概率。

用直径划半圆。

这个问题等价于“在一个圆环上随机取 [公式] 个点,它们在同一个半圆弧的概率是多少”。

在这里插入图片描述

寻找大数组中位数问题

数组很大的话,有两种方法:

  • 快速排序的partition思路
  • 分块,桶排序

猜你喜欢

转载自blog.csdn.net/qq_32523711/article/details/108992958