🔥 A awesome android expert interview questions and answers(continuous updating ...)css
从几十份顶级面试仓库和300多篇高质量面经中总结出一份全面成体系化的Android高级面试题集。
随着Android技术发展的成熟,Kotlin、大前端技术Flutter、RN、小程序等一会儿就进入了咱们的视野内,同时,Android自身的技术栈也正在不断扩展,好比在国外大热的Jetpack。所以,Android开发者们愈来愈焦虑,愈来愈迷茫,每一个人的时间和精力是有限的,咱们到底应该学什么才能有效地提升自身的竞争力呢?其实,首先咱们应该优先深刻学习工做中用到的技术,其次,关注这2年来Android最新的面试题所涉及的知识点,根据自身的实际状况有选择地进行针对性的学习和提高。只有这样,自身才不会被所谓的 互联网寒冬 吓倒。Awesome-Android-Interview搜集了国内一线及二线互联网公司最常出现的面试题,很是全面,但愿能让你们比较系统的反复学习,以快速提高本身。这篇文章笔者花费了很是大的精力和时间,但愿获得你们的支持。Android面试中常涉及的问题有以下几方面:html
2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(计算机基础篇)2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Java篇)前端
2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android基础篇)node
面试就犹如考试,就像高考冲刺前咱们所作的事,无非就是将每个知识点理解并记忆。要经过面试当然须要必定的技巧,但毫不是靠伪造与吹流弊,经过一段时间沉下心来闭关修炼,等到春暖花开时,即可以出山收割,步入大厂,薪资翻番,岂不美哉?git
注意:每类知识点对应面试题的出现频率按 ⭐ 的级数共分为三级,分别为 ⭐、 ⭐⭐、⭐⭐⭐,若是时间充分,建议至少将 ⭐⭐及以 上的知识点搞懂,若是时间比较紧急,则建议优先将 ⭐⭐⭐ 题目都弄懂。
为了更好地分类学习,建议跳转到本项目对应的 Github地址,欢迎Star、Fork、Watch~
最后,借用脉脉上的一副大厂职级薪资对应图,给你们的机车多加点油,祝开车顺利,一帆风顺~github
HTTPS是一种经过计算机网络进行安全通讯的传输协议。HTTPS经由HTTP进行通讯,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份 认证,保护交换数据的隐私与完整性。web
HTPPS和HTTP的概念:面试
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,所以加密的详细内容就须要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL代表它使用了HTTP,但HTTPS存在不一样于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通信方法,如今它被普遍用于万维网上安全敏感的通信,例如交易支付方面。
超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通讯的规则,经过因特网传送万维网文档的数据传送协议。
https协议须要到ca申请证书,通常免费证书不多,须要交费。http是超文本传输协议,信息是明文传输,https 则是具备安全性的ssl加密传输协议http和https使用的是彻底不一样的链接方式用的端口也不同,前者是80,后者是443。http的链接很简单,是无状态的HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全HTTPS解决的问题:1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证实服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任次主机2 . 防止通信过程当中的数据的泄密和被窜改
以下图所示,能够很明显的看出两个的区别:
注:TLS是SSL的升级替代版,具体发展历史能够参考传输层安全性协议。
HTTP与HTTPS在写法上的区别也是前缀的不一样,客户端处理的方式也不一样,具体说来:
若是URL的协议是HTTP,则客户端会打开一条到服务端端口80(默认)的链接,并向其发送老的HTTP请求。
若是URL的协议是HTTPS,则客户端会打开一条到服务端端口443(默认)的链接,而后与服务器握手,以二进制格式与服务器交换一些SSL的安全参数,附上加密的 HTTP请求。
因此你能够看到,HTTPS比HTTP多了一层与SSL的链接,这也就是客户端与服务端SSL握手的过程,整个过程主要完成如下工做:
交换协议版本号
选择一个两端都了解的密码
对两端的身份进行认证
生成临时的会话密钥,以便加密信道。
SSL握手是一个相对比较复杂的过程,更多关于SSL握手的过程细节能够参考TLS/SSL握手过程
SSL/TSL的常见开源实现是OpenSSL,OpenSSL是一个开放源代码的软件库包,应用程序能够使用这个包来进行安全通讯,避免窃听,同时确认另外一端链接者的身份。这个包普遍被应用在互联网的网页服务器上。 更多源于OpenSSL的技术细节能够参考OpenSSL。
HTTP1.0最先在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始普遍应用于如今的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为普遍的HTTP协议。 主要区别主要体如今:
在讲Http1.1和Http2.0的区别以前,还须要说下SPDY,它是HTTP1.x的优化方案:
2012年google如一声惊雷提出了SPDY的方案,优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性,具体以下:
SPDY位于HTTP之下,TCP和SSL之上,这样能够轻松兼容老版本的HTTP协议(将HTTP1.x的内容封装成一种新的frame格式),同时能够使用已有的SSL功能。
http/1.0协议头里能够设置Connection:Keep-Alive或者Connection:Close,选择是否容许在必定时间内复用链接(时间可由服务器控制)。可是这对App端的请求成效不大,由于App端的请求比较分散且时间跨度相对较大。
方案1.基于tcp的长链接 (主要)
移动端创建一条本身的长连接通道,通道的实现是基于tcp协议。基于tcp的socket编程技术难度相对复杂不少,并且须要本身定制协议。但信息的上报和推送变得更及时,请求量爆发的时间点还能减轻服务器压力(避免频繁建立和销毁链接)
方案2.http long-polling
客户端在初始状态发送一个polling请求到服务器,服务器并不会立刻返回业务数据,而是等待有新的业务数据产生的时候再返回,因此连接会一直被保持。一但结束当前链接,立刻又会发送一个新的polling请求,如此反复,保证一个链接被保持。
存在问题:
1)增长了服务器的压力
2)网络环境复杂场景下,须要考虑怎么重建健康的链接通道
3)polling的方式稳定性很差
4)polling的response可能被中间代理cache住
……
方案3.http streaming
和long-polling不一样的是,streaming方式经过再server response的头部增长“Transfer Encoding:chuncked”来告诉客户端后续还有新的数据到来
存在问题:
1)有些代理服务器会等待服务器的response结束以后才将结果推送给请求客户端。streaming不会结束response
2)业务数据没法按照请求分割
……
方案4.web socket
和传统的tcp socket类似,基于tcp协议,提供双向的数据通道。它的优点是提供了message的概念,比基于字节流的tcp socket使用更简单。技术较新,不是全部浏览器都提供了支持。
它的缘由是队列的第一个数据包(队头)受阻而致使整列数据包受阻
使用http pipelining,确保几乎在同一时间把request发向了服务器
客户端发送一个HTTP请求到服务器的请求消息包括如下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。
GET /562f25980001b1b106000338.jpg HTTP/1.1 Host img.mukewang.com User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 Accept image/webp,image/*,*/*;q=0.8 Referer http://www.imooc.com/ Accept-Encoding gzip, deflate, sdch Accept-Language zh-CN,zh;q=0.8
第一部分:请求行,用来讲明请求类型,要访问的资源以及所使用的HTTP版本.
GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
第二部分:请求头部,紧接着请求行(即第一行)以后的部分,用来讲明服务器要使用的附加信息
从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,而且在每一个请求中自动发送等等
第三部分:空行,请求头部后面的空行是必须的
即便第四部分的请求数据为空,也必须有空行。
第四部分:请求数据也叫主体,能够添加任意的其余数据。
这个例子的请求数据为空。
POST / HTTP1.1 Host:www.wrox.com User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) Content-Type:application/x-www-form-urlencoded Content-Length:40 Connection: Keep-Alive name=Professional%20Ajax&publisher=Wiley
第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。
通常状况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)代表HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来讲明客户端要使用的一些附加信息
第二行和第三行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。
HTTP的缓存机制也是依赖于请求和响应header里的参数类实现的,最终响应式从缓存中去,仍是从服务端从新拉取,HTTP的缓存机制的流程以下所示:
HTTP的缓存能够分为两种:
强制缓存:须要服务端参与判断是否继续使用缓存,当客户端第一次请求数据是,服务端返回了缓存的过时时间(Expires与Cache-Control),没有过时就能够继续使用缓存,不然则不适用,无需再向服务端询问。
对比缓存:须要服务端参与判断是否继续使用缓存,当客户端第一次请求数据时,服务端会将缓存标识(Last-Modified/If-Modified-Since与Etag/If-None-Match)与数据一块儿返回给客户端,客户端将二者都备份到缓存中 ,再次请求数据时,客户端将上次备份的缓存 标识发送给服务端,服务端根据缓存标识进行判断,若是返回304,则表示通知客户端能够继续使用缓存。
强制缓存优先于对比缓存。
上面提到强制缓存使用的的两个标识:
Expires:Expires的值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。到期时间是服务端生成的,客户端和服务端的时间可能有偏差。
Cache-Control:Expires有个时间校验的问题,全部HTTP1.1采用Cache-Control替代Expires。
Cache-Control的取值有如下几种:
private: 客户端能够缓存。
public: 客户端和代理服务器均可缓存。
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 须要使用对比缓存来验证缓存数据。
no-store: 全部内容都不会缓存,强制缓存,对比缓存都不会触发。
咱们再来看看对比缓存的两个标识:
Last-Modified/If-Modified-Since
Last-Modified 表示资源上次修改的时间。
当客户端发送第一次请求时,服务端返回资源上次修改的时间:
Last-Modified: Tue, 12 Jan 2016 09:31:27 GMT
客户端再次发送,会在header里携带If-Modified-Since。将上次服务端返回的资源时间上传给服务端。
If-Modified-Since: Tue, 12 Jan 2016 09:31:27 GMT
服务端接收到客户端发来的资源修改时间,与本身当前的资源修改时间进行对比,若是本身的资源修改时间大于客户端发来的资源修改时间,则说明资源作过修改, 则返回200表示须要从新请求资源,不然返回304表示资源没有被修改,能够继续使用缓存。
上面是一种时间戳标记资源是否修改的方法,还有一种资源标识码ETag的方式来标记是否修改,若是标识码发生改变,则说明资源已经被修改,ETag优先级高于Last-Modified。
Etag/If-None-Match
ETag是资源文件的一种标识码,当客户端发送第一次请求时,服务端会返回当前资源的标识码:
ETag: "5694c7ef-24dc"
客户端再次发送,会在header里携带上次服务端返回的资源标识码:
If-None-Match:"5694c7ef-24dc"
服务端接收到客户端发来的资源标识码,则会与本身当前的资源吗进行比较,若是不一样,则说明资源已经被修改,则返回200,若是相同则说明资源没有被修改,返回 304,客户端能够继续使用缓存。
Http1.0是短链接,HTTP1.1默认是长链接,也就是默认Connection的值就是keep-alive。可是长链接实质是指的TCP链接,而不是HTTP链接。TCP链接是一个双向的通道,它是能够保持一段时间不关闭的,所以TCP链接才有真正的长链接和短链接这一说。
长链接是指的TCP链接,也就是说复用的是TCP链接。即长链接状况下,多个HTTP请求能够复用同一个TCP链接,这就节省了不少TCP链接创建和断开的消耗。
此外,长链接并非永久链接的。若是一段时间内(具体的时间长短,是能够在header当中进行设置的,也就是所谓的超时时间),这个链接没有HTTP请求发出的话,那么这个长链接就会被断掉。
加密算法的类型基本上分为了两种:
此外,还有Hash加密算法
HASH算法:MD5, SHA1, SHA256
相比较对称加密而言,非对称加密安全性更高,可是加解密耗费的时间更长,速度慢。
HTTPS = HTTP + SSL,HTTPS 的加密就是在 SSL 中完成的。
这就要从 CA 证书讲起了。CA 证书其实就是数字证书,是由 CA 机构颁发的。至于 CA 机构的权威性,那么是毋庸置疑的,全部人都是信任它的。CA 证书内通常会包含如下内容:
CA 证书中的 Hash 值,实际上是用证书的私钥进行加密后的值(证书的私钥不在 CA 证书中)。而后客户端获得证书后,利用证书中的公钥去解密该 Hash 值,获得 Hash-a ;而后再利用证书内的签名 Hash 算法去生成一个 Hash-b 。最后比较 Hash-a 和 Hash-b 这两个的值。若是相等,那么证实了该证书是对的,服务端是能够被信任的;若是不相等,那么就说明该证书是错误的,可能被篡改了,浏览器会给出相关提示,没法创建起 HTTPS 链接。除此以外,还会校验 CA 证书的有效时间和域名匹配等。
#### HTTPS 中的 SSL 握手创建过程
假设如今有客户端 A 和服务器 B :
简化以下:
能够发现,在 HTTPS 加密原理的过程当中把对称加密和非对称加密都利用了起来。即利用了非对称加密安全性高的特色,又利用了对称加密速度快,效率高的好处。
当数据传输发生在一个设备(PC/手机)和网络服务器之间时,攻击者使用其技能和工具将本身置于两个端点之间并截获数据;尽管交谈的两方认为他们是在与对方交谈,可是实际上他们是在与干坏事的人交流,这即是中间人攻击。
嗅探或数据包嗅探是一种用于捕获流进和流出系统/网络的数据包的技术。网络中的数据包嗅探就好像电话中的监听。
在这种技术中,攻击者会将恶意数据包注入常规数据中。这样用户便不会注意到文件/恶意软件,由于它们是合法通信流的一部分。
在你登陆进你的银行帐户和退出登陆这一段期间便称为一个会话。这些会话一般都是黑客的攻击目标,由于它们包含潜在的重要信息。在大多数案例中,黑客会潜伏在会话中,并最终控制它。
在SSL剥离攻击中,攻击者使SSL/TLS链接剥落,随之协议便从安全的HTTPS变成了不安全的HTTP。
请见https加密原理。
1** 信息,服务器收到请求,须要请求者继续执行操做
2** 成功,操做被成功接收并处理
3** 重定向,须要进一步的操做以完成请求
4** 客户端错误,请求包含语法错误或没法完成请求
5** 服务器错误,服务器在处理请求的过程当中发生了错误
ACK : TCP协议规定,只有ACK=1时有效,也规定链接创建后全部发送的报文的ACK必须为1
SYN(SYNchronization) : 在链接创建时用来同步序号。当SYN=1而ACK=0时,代表这是一个链接请求报文。对方若赞成创建链接,则应在响应报文中使SYN=1和ACK=1. 所以, SYN置1就表示这是一个链接请求或链接接受报文。
FIN (finis)即完,终结的意思, 用来释放一个链接。当 FIN = 1 时,代表此报文段的发送方的数据已经发送完毕,并要求释放链接。
第一次握手:创建链接。客户端发送链接请求报文段,将SYN位置为1,Sequence Number为x;而后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,须要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,本身本身还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述全部信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK报文段。而后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕之后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
第一次分手:主机1(能够使客户端,也能够是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“赞成”你的关闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭链接,同时主机2进入LAST_ACK状态;
第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,而后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段之后,就关闭链接;此时,主机1等待2MSL后依然没有收到回复,则证实Server端已正常关闭,那好,主机1也能够关闭链接了。
“三次握手”的目的是“为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误”。主要目的防止server端一直等待,浪费资源。换句话说,便是为了保证服务端能收接受到客户端的信息并能作出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端可以接收到服务端的信息并能作出正确的应答而进行后两次(第二次和第三次)握手。
“四次挥手”缘由是由于tcp是全双工模式,接收到FIN时意味将没有数据再发来,可是仍是能够继续发送数据。
确认和重传:接收方收到报文后就会进行确认,发送方一段时间没有收到确认就会重传。
数据校验。
数据合理分片与排序,TCP会对数据进行分片,接收方会缓存为按序到达的数据,从新排序后再提交给应用层。
流程控制:当接收方来不及接收发送的数据时,则会提示发送方下降发送的速度,防止包丢失。
拥塞控制:当网络发生拥塞时,减小数据的发送。
一、基于链接与无链接;
二、对系统资源的要求(TCP较多,UDP少);
三、UDP程序结构较简单;
四、流模式与数据报模式 ;
五、TCP保证数据正确性,UDP可能丢包;
六、TCP保证数据顺序,UDP不保证。
传输层没法保证数据的可靠传输,只能经过应用层来实现了。实现的方式能够参照tcp可靠性传输的方式。如不考虑拥塞处理,可靠UDP的简单设计以下:
具体过程便是:送端发送数据时,生成一个随机seq=x,而后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否须要重传数据。
目前有以下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT:
一、RUDP(Reliable User Datagram Protocol)
RUDP 提供一组数据服务质量加强机制,如拥塞控制的改进、重发机制及淡化服务器算法等。
二、RTP(Real Time Protocol)
RTP为数据提供了具备实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。
三、UDT(UDP-based Data Transfer Protocol)
UDT的主要目的是支持高速广域网上的海量数据传输。
套接字(socket)是通讯的基石,是支持TCP/IP协议的网络通讯的基本操做单元。它是网络通讯过程当中端点的抽象表示,包含进行网络通讯必须的五种信息:链接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
为了区别不一样的应用程序进程和链接,许多计算机操做系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应 用层能够和传输层经过Socket接口,区分来自不一样应用程序进程或网络链接的通讯,实现数据传输的并发服务。
创建Socket链接至少须要一对套接字,其中一个运行于客户端,称为ClientSocket ,另外一个运行于服务器端,称为ServerSocket 。
套接字之间的链接过程分为三个步骤:服务器监听,客户端请求,链接确认。
链接确认:当服务器端套接字监听到或者说接收到客户端套接字的链接请求时,就响应客户端套接字的请求,创建一个新的线程,把服务器端套接字的描述发 给客户端,一旦客户端确认了此描述,双方就正式创建链接。而服务器端套接字继续处于监听状态,继续接收其余客户端套接字的链接请求。
建立Socket链接时,能够指定使用的传输层协议,Socket能够支持不一样的传输层协议(TCP或UDP),当使用TCP协议进行链接时,该Socket链接就是一个TCP链接。
因为一般状况下Socket链接就是TCP链接,所以Socket链接一旦创建,通讯双方便可开始相互发送数据内容,直到双方链接断开。但在实际网 络应用中,客户端到服务器之间的通讯每每须要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的链接而致使 Socket 链接断连,所以须要经过轮询告诉网络,该链接处于活跃状态。
而HTTP链接使用的是“请求—响应”的方式,不只在请求时须要先创建链接,并且须要客户端向服务器发出请求后,服务器端才能回复数据。
不少状况下,须要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方创建的是Socket链接,服务器就能够直接将数 据传送给客户端;若双方创建的是HTTP链接,则服务器须要等到客户端发送一次请求后才能将数据传回给客户端,所以,客户端定时向服务器端发送链接请求, 不只能够保持在线,同时也是在“询问”服务器是否有新的数据,若是有就将数据传给客户端。TCP(Transmission Control Protocol) 传输控制协议
正常链接断开客户端会给服务端发送一个fin包,服务端收到fin包后才会知道链接断开。
而断网断电时客户端没法发送fin包给服务端,因此服务端没办法检测到客户端已经短线。
为了缓解这个问题,服务端须要有个心跳逻辑,就是服务端检测到某个客户端多久没发送任何数据过来就认为客户端已经断开,
这须要客户端定时向服务端发送心跳数据维持链接。
长链接的实现:心跳机制,应用层协议大多都有HeartBeat机制,一般是客户端每隔一小段时间向服务器发送一个数据包,通知服务器本身仍然在线。并传输一些可能必要的数据。使用心跳包的典型协议是IM,好比QQ/MSN/飞信等协议
一、在TCP的机制里面,自己是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。
系统默认是设置的2小时的心跳频率。可是它检查不到机器断电、网线拔出、防火墙这些断线。
并且逻辑层处理断线可能也不是那么好处理。通常,若是只是用于保活仍是能够的。经过使用TCP的KeepAlive机制(修改那个time参数),可让链接每隔一小段时间就产生一些ack包,以下降被踢掉的风险,固然,这样的代价是额外的网络和CPU负担。
二、应用层心跳机制实现。
因为HTTP协议是无状态的协议,因此服务端须要记录用户的状态时,就须要用某种机制来识具体的用户,这个机制就是Session.典型的场景好比购物车,当你点击下单按钮时,因为HTTP协议无状态,因此并不知道是哪一个用户操做的,因此服务端要为特定的用户建立了特定的Session,用用于标识这个用户,而且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个惟一标识。在服务端保存Session的方法不少,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,通常会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的。
具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所通过的这段时间,也就是用户浏览这个网站所花费的时间。所以从上述的定义中咱们能够看到,Session其实是一个特定的时间概念。
当客户端访问服务器时,服务器根据需求设置Session,将会话信息保存在服务器上,同时将标示Session的SessionId传递给客户端浏览器,
浏览器将这个SessionId保存在内存中,咱们称之为无过时时间的Cookie。浏览器关闭后,这个Cookie就会被清掉,它不会存在于用户的Cookie临时文件。
之后浏览器每次请求都会额外加上这个参数值,服务器会根据这个SessionId,就能取得客户端的数据信息。
若是客户端浏览器意外关闭,服务器保存的Session数据不是当即释放,此时数据还会存在,只要咱们知道那个SessionId,就能够继续经过请求得到此Session的信息,由于此时后台的Session还存在,固然咱们能够设置一个Session超时时间,一旦超过规定时间没有客户端请求时,服务器就会清除对应SessionId的Session信息。
Cookie是由服务器端生成,发送给User-Agent(通常是web浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用Cookie)。Cookie名称和值能够由服务器端开发本身定义,对于JSP而言也能够直接写入Sessionid,这样服务器能够知道该用户是否合法用户以及是否须要从新登陆等。
版本:IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6。
首部长度:IP报头的长度。固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111,即10进制的15,表明IP报头的最大长度能够为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。
服务类型:Type Of Service。
总长度:IP报文的总长度。报头的长度和数据部分的长度之和。
标识:惟一的标识主机发送的每一分数据报。一般每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到全部数据分片的标识字段中,使得这些分片在达到最终目的地时能够依照标识字段的内容从新组成原先的数据。
标志:共3位。R、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。
片位移:本分片在原先数据报文中相对首位的偏移位。(须要再乘以8)
生存时间:IP报文所容许经过的路由器的最大数量。每通过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64。发送 ICMP 回显应答时常常把 TTL 设为最大值 255。
协议:指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪一个进程(不一样的协议有专门不一样的进程处理)。和端口号相似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.
首部校验和:计算IP头部的校验和,检查IP报头的完整性。
源IP地址:标识IP数据报的源端设备。
目的IP地址:标识IP数据报的目的地址。
最后就是可变部分和数据部分。
整体来讲分为如下几个过程:
一、DNS解析,此外还有DNSy优化(DNS缓存、DNS负载均衡)
二、TCP链接
三、发送HTTP请求
四、服务器处理请求并返回HTTP报文
五、浏览器解析渲染页面
六、链接结束
将信息快速并友好的展现给用户并可以与用户进行交互。
答案就是能不从网络中加载的资源就不从网络中加载,当咱们合理使用缓存,将资源放在浏览器端,这是最快的方式。若是资源必须从网络中加载,则要考虑缩短链接时间,即DNS优化部分;减小响应内容大小,即对内容进行压缩。另外一方面,若是加载的资源数比较少的话,也能够快速的响应用户。
进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
3) 另外,进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。
4) 线程在执行过程当中与进程仍是有区别的。每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分能够同时执行。但操做系统并无将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
Linux连接分两种,一种被称为硬连接(Hard Link),另外一种被称为符号连接(Symbolic Link)。默认状况下,ln命令产生硬连接。
硬链接指经过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件无论是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。通常这种链接就是硬链接。硬链接的做用是容许一个文件拥有多个有效路径名,这样用户就能够创建硬链接到重要文件,以防止“误删”的功能。其缘由如上所述,由于对应该目录的索引节点有一个以上的链接。只删除一个链接并不影响索引节点自己和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的条件是与之相关的全部硬链接文件均被删除。
另一种链接称之为符号链接(Symbolic Link),也叫软链接。软连接文件有相似于Windows的快捷方式。它其实是一个特殊的文件。在符号链接中,文件其实是一个文本文件,其中包含的有另外一文件的位置信息。
此题考查Android的权限管理在Android的安全架构中的做用。
Android 是一个权限分隔的操做系统,其中每一个应用都有其独特的系统标识(Linux 用户 ID 和组 ID)。系统各部分也分隔为不一样的标识。Linux 据此将不一样的应用以及应用与系统分隔开来。
其余更详细的安全功能经过“权限”机制提供,此机制会限制特定进程能够执行的具体操做,而且根据 URI 权限受权临时访问特定的数据段。
Android 安全架构的中心设计点是:在默认状况下任何应用都没有权限执行对其余应用、操做系统或用户有不利影响的任何操做。这包括读取或写入用户的私有数据(例如联系人或电子邮件)、读取或写入其余应用程序的文件、执行网络访问、使设备保持唤醒状态等。
因为每一个 Android 应用都是在进程沙盒中运行,所以应用必须显式共享资源和数据。它们的方法是声明须要哪些权限来获取基本沙盒未提供的额外功能。应用以静态方式声明它们须要的权限,而后 Android 系统提示用户赞成。
事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操做序列,这些操做要么都执行,要么都不执行,它是一个不可分割的工做单位。例如,银行转帐工做:从一个帐号扣款并使另外一个帐号增款,这两个操做要么都执行,要么都不执行。因此,应该把它们当作一个事务。事务是数据库维护数据一致性的单位,在每一个事务结束时,都能保持数据一致性。事务具备如下4个基本特征:
(1)原子性(Atomicity)
原子性是指事务包含的全部操做要么所有成功,要么所有失败回滚。
(2)一致性(Consistency)
一个事务执行以前和执行以后都必须处于一致性状态。
(3)隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,好比操做同一张表时,数据库为每个用户开启的事务,不能被其余事务的操做所干扰,多个并发事务之间要相互隔离。
(4)持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。
1)Serializable(串行化):可避免脏读、不可重复读、幻读的发生。
2)Repeatable read (可重复读):可避免脏读、不可重复读的发生。
3)Read committed (读已提交):可避免脏读的发生。
4)Read uncommitted (读未提交):最低级别,任何状况都没法保证。
1)第一范式1NF(域的原子性)
若是数据库表中的全部字段值都是不可分解的原子值,就说明该数据库表知足了第一范式
2)第二范式2NF(表中除主键外的字段都彻底依赖主键)
第二范式是在第一范式基础上创建的。第二范式有两个重点:(1)表中必须有主键;(2)其余非主属性必须彻底依赖主键,不能只依赖主键的一部分(主要针对联合主键而言)。
3)第三范式3NF(表中除主键外的字段都彻底直接依赖,不能是传递依赖)
不能是传递依赖,即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的状况。第二范式和第三范式区分的关键点:2NF:非主键列是否彻底依赖于主键,仍是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,仍是直接依赖于非主键列。
对于算法面试准备,无疑就是刷《剑指Offer》+ LeetCode 效果最佳。刷《剑指Offer》是为了创建全面的算法面试思惟,打下坚实的基础,刷LeetCode则是为了避免断强化与开阔咱们本身的算法思想。这两块 CS-Notes 中已经实现地很完美了,建议你们将《剑指Offer》刷完,而后再至少刷100道LeetCode题目以上。
若是这个库对您有很大帮助,您愿意支持这个项目的进一步开发和这个项目的持续维护。你能够扫描下面的二维码,让我喝一杯咖啡或啤酒。很是感谢您的捐赠。谢谢!
<div align="center">
<img src="https://user-gold-cdn.xitu.io/2020/3/1/170961575de964f2?w=1080&h=1457&f=jpeg&s=93345" width=20%><img src="https://user-gold-cdn.xitu.io/2020/3/1/1709615761d9b6c5?w=990&h=1540&f=jpeg&s=110691" width=20%>
</div>
欢迎关注个人微信:bcce5360
。因为微信群人数太多没法生成群邀二维码,因此麻烦你们想进微信群的朋友们,加我微信拉你进群(PS:微信群的学习氛围与各项福利将会超乎你的想象)。
2千人QQ群, Awesome-Android学习交流群,QQ群号:959936182, 欢迎你们加入~