写点什么

一线互联网移动架构师 360°全方面性能调优,Android 开发面试题目

发布于: 刚刚

1.网络分层

OSI 七层模型

OSI 七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。

2.TCP/IP 五层模型

TCP/IP 五层模型:应用层(Application)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。

3.三次握手与四次挥手

第一次握手:客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。


握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开 TCP 连接的请求,断开过程需要经过“四次握手”


第一次挥手:客户端发送报文告诉服务器没有数据要发送了第二次挥手:服务端收到,再发送给客户端告诉它我收到了第三次挥手:服务端向客户端发送报文,请求关闭连接第四次挥手:客户端收到关闭连接的请求,向服务端发送报文,服务端关闭连接

4.TCP 为什么三次握手不是两次握手,为什么两次握手不安全

为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤


如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认

5.为什么 TCP 是可靠的,UDP 早不可靠的?为什么 UDP 比 TCP 快?

TCP/IP 协议拥有三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。UDP 就没有了,udp 信息发出后,不验证是否到达对方,所以不可靠。

6.http 协议

http 协议是一个基于请求与响应模式的无连接,无状态,应用层的协议,支持 c/s 模式,简单快速,灵活简单快速:协议简单,通信速度快灵活:允许传输任意类型的数据对象,由 Content-Type 标记无连接:每次处理一个请求,处理完成后既断开无状态:对事务处理没有记忆能力


http 有两种报文:请求报文和响应报文请求报文由请求行,请求报头,和请求数据组成请求行:抓包第一行,包括请求方法,url 和 http 版本请求报头:指的就是题目中“里面的协议头部”请求数据:指 post 方式提交的表单数据响应报文由状态行,响应报头,响应正文组成状态行:状态码响应报头:同请求报头响应正文:服务器返回的资源数据


接下来是 http 头部,既请求报头和响应报头,统称消息报头,消息报头可以分为通用报头,请求报头,响应报头,实体报头等


通用报头和实体报头既可以出现在请求报头中,也可以出现在响应报头中,通用报头包含的字段如:Date Connection Cache-Control,实体报头中有 Content-Type Content-Length Content-Language Content-Encoding.请求报头中包含的字段有:Host,User-Agent,Accept-Encoding,Accept-Language,Connection 响应报头包含的字段:Location,Server

7.http 的 get 和 post 的区别

http 是应用层的协议,底层基于 TCP/IP 协议,所以本质上,get 和 post 请求都是 TCP 请求。所以二者的区别都是体现在应用层上(HTTP 的规定和浏览器/服务器的限制)


**1.**参数的传输方式:GET 参数通过 URL 传递,POST 放在 Request body 中。**2.**GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。**3.**对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。不过要注意,并不是所有浏览器都会在 POST 中发送两次包,比如火狐**4.**对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。**5.**GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。**6.**GET 请求只能进行 url 编码,而 POST 支持多种编码方式。**7.**GET 在浏览器回退时是无害的,而 POST 会再次提交请求。**8.**GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以。**9.**GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。

8.socket 和 http 的区别:

Http 协议:简单的对象访问协议,对应于应用层。Http 协议是基于 TCP 链接的。tcp 协议:对应于传输层 ip 协议:对应与网络层 TCP/IP 是传输层协议,主要解决数据如何在网络中传输;而 Http 是应用层协议,主要解决如何包装数据。


Socket 是对 TCP/IP 协议的封装,Socket 本身并不是协议,而是一个调用接口(API),通过 Socket,我们才能使用 TCP/IP 协议。Http 连接:http 连接就是所谓的短连接,及客户端向服务器发送一次请求,服务器端相应后连接即会断掉。**socket 连接:**socket 连接及时所谓的长连接,理论上客户端和服务端一旦建立连接,则不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机 down 了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该链接已释放网络资源。所以当一个 socket 连接中没有数据的传输,那么为了位置连续的连接需要发送心跳消息,具体心跳消息格式是开发者自己定义的。

9.TCP 与 UDP 区别总结:

**1、**TCP 面向连接(如打电话要先拨号建立连接);UDP 是无连接的,即发送数据之前不需要建立连接**2、**TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP 尽最大努力交付,即不保 证可靠交付**3、**TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的 UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等)**4、**每一条 TCP 连接只能是点到点的;UDP 支持一对一,一对多,多对一和多对多的交互通信**5、**TCP 首部开销 20 字节;UDP 的首部开销小,只有 8 个字节**6、**TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道

10.https

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。HTTP 是应用层协议,位于 HTTP 协议之下是传输协议 TCP。TCP 负责传输,HTTP 则定义了数据如何进行包装,在 HTTP 跟 TCP 中间加多了一层加密层 TLS/SSL,SSL 是个加密套件,负责对 HTTP 的数据进行加密。TLS 是 SSL 的升级版。现在提到 HTTPS,加密套件基本指的是 TLS。


传输加密的流程:http 是应用层将数据直接给到 TCP 进行传输,https 是应用层将数据给到 TLS/SSL,将数据加密后,再给到 TCP 进行传输


HTTPS 是如何加密数据的:一般来说,加密分为对称加密、非对称加密


对称加密:对称加密的意思就是,加密数据用的密钥,跟解密数据用的密钥是一样的。对称加密的优点在于加密、解密效率通常比较高。缺点在于,数据发送方、数据接收方需要协商、共享同一把密钥,并确保密钥不泄露给其他人。传输过程中容易被截获。


网上一个很形象的例子:假如现在小客与小服要进行一次私密的对话,他们不希望这次对话内容被其他外人知道。可是,我们平时的数据传输过程中又是明文传输的,万一被某个黑客把他们的对话内容给窃取了,那就难受了。


为了解决这个问题,小服这家伙想到了一个方法来加密数据,让黑客看不到具体的内容。该方法是这样子的:在每次数据传输之前,小服会先传输小客一把密钥,然后小服在之后给小客发消息的过程中,会用这把密钥对这些消息进行加密。小客在收到这些消息后,会用之前小服给的那把密钥对这些消息进行解密,这样,小客就能得到密文里面真正的数据了。如果小客要给小服发消息,也同样用这把密钥来对消息进行加密,小服收到后也用这把密钥进行解密。 这样,就保证了数据传输的安全性。


非对称加密非对称加密的意思就是,加密数据用的密钥(公钥),跟解密数据用的密钥(私钥)是不一样的。


网上一个很形象的例子:小服还是挺聪明的,得意了一会之后,小服意识到了密钥会被截取这个问题。倔强的小服又想到了另外一种方法:用非对称加密的方法来加密数据。该方法是这样的:小服和小客都拥有两把钥匙,一把钥匙的公开的(全世界都知道也没关系),称之为公钥;而另一把钥匙是保密(也就是只有自己才知道),称之为私钥。


并且,用公钥加密的数据,只有对应的私钥才能解密;用私钥加密的数据,只有对应的公钥才能解密。所以在传输数据的过程中,小服在给小客传输数据的过程中,会用小客给他的公钥进行加密,然后小客收到后,再用自己的私钥进行解密。小客给小服发消息的时候,也一样会用小服给他的公钥进行加密,然后小服再用自己的私钥进行解密。 这样,数据就能安全着到达双方。是什么原因导致非对称加密这种方法的不安全性呢?它和对称加密方法的不安全性不同。非对称加密之所以不安全,是因为小客收到了公钥之后,无法确定这把公钥是否真的是小服。


解决的办法就是数字证书:小服再给小客发公钥的过程中,会把公钥以及小服的个人信息通过 Hash 算法生成消息摘要,为了防止摘要被人调换,小服还会用 CA 提供的私钥对消息摘要进行加密来形成数字签名,当小客拿到这份数字证书之后,就会用 CA 提供的公钥来对数字证书里面的数字签名进行解密得到消息摘要,然后对数字证书里面小服的公钥和个人信息进行 Hash 得到另一份消息摘要,然后把两份消息摘要进行对比,如果一样,则证明这些东西确实是小服的,否则就不是。

11.加密算法

11.1.对称加密算法

Data Encryption Standard(DES)DES 是一种典型的块加密方法:将固定长度的明文通过一系列复杂的操作变成同样长度的密文,块的长度为 64 位。同时,DES 使用的密钥来自定义变换过程,因此算法认为只有持有加密所用的密钥的用户才能解密密文。 DES 的密钥表面上是 64 位的,实际有效密钥长度为 56 位,其余 8 位可以用于奇偶校验。DES 现在已经不被视为一种安全的加密算法,主要原因是它使用的 56 位密钥过短。为了提供实用所需的安全性,可以使用 DES 的派生算法 3DES 来进行加密 (虽然 3DES 也存在理论上的攻击方法)。


Advanced Encryption Standard(AES)AES 在密码学中又称 Rijndael 加密法,用来替代原先的 DES,已经被多方分析且广泛使用。


DES 与 AES 的比较自 DES 算法公诸于世以来,学术界围绕它的安全性等方面进行了研究并展开了激烈的争论。在技术上,对 DES 的批评主要集中在以下几个方面


  • 作为分组密码,DES 的加密单位仅有 64 位二进制,这对于数据传输来说太小,因为每个分组仅含 8 个字符,而且其中某些位还要用于奇偶校验或其他通讯开销。

  • DES 的密钥的位数太短,只有 56 比特,而且各次迭代中使用的密钥是递推产生的,这种相关必然降低密码体制的安全性,在现有技术下用穷举法寻找密钥已趋于可行。

  • DES 不能对抗差分和线性密码分析。

  • DES 用户实际使用的密钥长度为 56bit,理论上最大加密强度为 256。DES 算法要提高加密强度(例如增加密钥长度),则系统开销呈指数增长。除采用提高硬件功能和增加并行处理功能外,从算法本身和软件技术方面都无法提高 DES 算法的加密强度。

11.2 非对称加密算法

RSA1977 年由 MIT 的 Ron Rivest、Adi Shamir 和 Leonard Adleman 一起提出,以他们三人姓氏开头字母命名,是一种获得广泛使用的非对称加密算法。对极大整数做因数分解的难度 (The Factoring Problem) 决定了 RSA 算法的可靠性。换言之,对一个极大整数做因数分解愈困难,RSA 算法就愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就肯定会极度下降。目前看来找到这样的算法的可能性非常小。


DES 与 RSA 的比较 RSA 算法的密钥很长,具有较好的安全性,但加密的计算量很大,加密速度较慢限制了其应用范围。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的 DES 对话密钥加密,然后使用 RSA 密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。


采用 DES 与 RSA 相结合的应用,使它们的优缺点正好互补,即 DES 加密速度快,适合加密较长的报文,可用其加密明文;RSA 加密速度慢,安全性好,应用于 DES 密钥的加密,可解决 DES 密钥分配的问题。


目前这种 RSA 和 DES 结合的方法已成为 EMAIL 保密通信标准。

12.Volley

1、Volley 的特点

Volley 是谷歌大会上推出的网络通信框架(2.3 之前使用 HttpClient,之后使用 HttpUrlConnection),它既可以访问网络获取数据,也可以加载图片,并且在性能方面进行了大幅度的调整,它的设计目的就是适合进行数据量不大但通信频繁的网络操作,而对于大数据量的操作,比如文件下载,表现很糟糕,因为 volley 处理 http 返回的默认实现是 BasicNetwork,它会把返回的流全部导入内存中,下载大文件会发生内存溢出

2、Volley 执行的过程:

默认情况下,Volley 中开启四个网络调度线程和一个缓存调度线程,首先请求会加入缓存队列,,缓存调度线程从缓存队列中取出线程,如果找到该请求的缓存就直接读取该缓存并解析,然后回调给主线程,如果没有找到缓存的响应,则将这个请求加入网络队列,然后网络调度线程会轮询取出网络队列中的请求,发起 http 请求,解析响应并将响应存入缓存,回调给主线程

3、Volley 为什么不适合下载上传大文件?为什么适合数据量小的频率高的请求?
  • volley 基于请求队列,Volley 的网络请求线程池默认大小为 4。意味着可以并发进行 4 个请求,大于 4 个,会排在队列中。并发量小所以适合数据量下频率高的请求

  • 因为 Volley 下载文件会将流存入内存中(是一个小于 4k 的缓存池),大文件会导致内存溢出,所以不能下载大文件,不能上传大文件的原因和 1 中差不多,设想你上传了四个大文件,同时占用了 volley 的四个线程,导致其他网络请求都阻塞在队列中,造成反应慢的现象

13.OKHttp

1、OKHttp 的特点
  • 相较于 Volley,它的最大并发量为 64

  • 使用连接池技术,支持 5 个并发的 socket 连接默认 keepAlive 时间为 5 分钟,解决 TCP 握手和挥手的效率问题,减少握手次数

  • 支持 Gzip 压缩,且操作对用户透明,可以通过 header 设置,在发起请求的时候自动加入 header,Accept-Encoding: gzip,而我们的服务器返回的时候 header 中有 Content-Encoding: gzip

  • 利用响应缓存来避免重复的网络请求

  • 很方便的添加拦截器,通常情况下,拦截器用来添加,移除,转换请求和响应的头部信息,比如添加公参等

  • 请求失败,自动重连,发生异常时重连,看源码调用 recover 方法重连了一次

  • 支持 SPDY 协议(SPDY 是 Google 开发的基于 TCP 的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY 并不是一种用于替代 HTTP 的协议,而是对 HTTP 协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及 HTTP 报头压缩。谷歌表示,引入 SPDY 协议后,在实验室测试中页面加载速度比原先快 64%)

  • 使用 Okio 来简化数据的访问与存储,提高性能

2、 OkHttp 的缺点
  • 消息回来需要切到主线程,主线程要自己去写。

  • 调用比较复杂,需要自己进行封装。

  • 缓存失效:网络请求时一般都会获取手机的一些硬件或网络信息,比如使用的网络环境。同时为了信息传输的安全性,可能还会对请求进行加密。在这些情况下 OkHttp 的缓存系统就会失效了,导致用户在无网络情况下不能访问缓存。

3、 OkHttp 框架中都用到了哪些设计模式
  • 最明显的 Builder 设计模式,如构建对象 OkHttpClient,还有单利模式

  • 工厂方法模式,如源码中的接口 Call

  • 观察者模式如 EventListener,监听请求和响应

  • 策略模式

  • 责任链模式,如拦截器

14.Retrofit

Retrofit 底层是基于 OkHttp 实现的,与其他网络框架不同的是,它更多使用运行时注解的方式提供功能

1、原理

通过 java 接口以及注解来描述网络请求,并用动态代理的方式生成网络请求的 request,然后通过 client 调用相应的网络框架(默认 okhttp)去发起网络请求,并将返回的 response 通过 converterFactorty 转换成相应的数据 model,最后通过 calladapter 转换成其他数据方式(如 rxjava Observable)

2、Retrofit 流程

**(1)**通过解析 网络请求接口的注解 配置 网络请求参数**(2)**通过 动态代理 生成 网络请求对象**(3)**通过 网络请求适配器 将 网络请求对象 进行平台适配**(4)**通过 网络请求执行器 发送网络请求**(5)**通过 数据转换器 解析服务器返回的数据**(6)**通过 回调执行器 切换线程(子线程 ->>主线程)**(7)**用户在主线程处理返回结果

3、 Retrofit 优点
  • 可以配置不同 HTTP client 来实现网络请求,如 okhttp、httpclient 等;

  • 请求的方法参数注解都可以定制;

  • 支持同步、异步和 RxJava;

  • 超级解耦;

  • 可以配置不同的反序列化工具来解析数据,如 json、xml 等

  • 框架使用了很多设计模式

如何做好面试突击,规划学习方向?

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。


网上学习 Android 的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。


学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。


我搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android 架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节



在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。



网上学习 Android 的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。


**本文已被[CODING 开源项目:《Android 学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](


)



收录**


最后自我介绍一下,小编 13 年上海交大毕业,曾经在小公司待过,也去过华为、OPPO 等大厂,18 年进入阿里一直到现在。

深知大多数初中级 Android 工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此也是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

用户头像

还未添加个人签名 2021.10.19 加入

还未添加个人简介

评论

发布
暂无评论
一线互联网移动架构师360°全方面性能调优,Android开发面试题目