写点什么

【收藏】2021 年 Android 跳槽大厂必备宝典 (2),移动混合开发技术

用户头像
Android架构
关注
发布于: 刚刚

2、解决连接无法复用

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 使用更简单。技术较新,不是所有浏览器都提供了支持。

3、解决 head of line blocking

它的原因是队列的第一个数据包(队头)受阻而导致整列数据包受阻


使用 http pipelining,确保几乎在同一时间把 request 发向了服务器

4、Http 的 request 和 response 的协议组成

1、Request 组成

客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:


请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。



请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的版本。

Get 请求例子

GET /562f25980001b1b106000338.jpg HTTP/1.1Host img.mukewang.comUser-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36Accept image/webp,image/,/*;q=0.8Referer http://www.imooc.com/Accept-Encoding gzip, deflate, sdchAccept-Language zh-CN,zh;q=0.8 复制代码


第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的 HTTP 版本. GET 说明请求类型为 GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是 HTTP1.1 版本。 第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息 从第二行起为请求头部,HOST 将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等 第三部分:空行,请求头部后面的空行是必须的 即使第四部分的请求数据为空,也必须有空行。 第四部分:请求数据也叫主体,可以添加任意的其他数据。 这个例子的请求数据为空。

POST 请求例子

POST / HTTP1.1Host:www.wrox.comUser-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-urlencodedContent-Length:40Connection: Keep-Alive


name=Professional%20Ajax&publisher=Wiley 复制代码


第一部分:请求行,第一行明了是 post 请求,以及 http1.1 版本。


第二部分:请求头部,第二行至第六行。


第三部分:空行,第七行的空行。


第四部分:请求数据,第八行。

2、Response 组成

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个 HTTP 的响应消息。


HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。



第一部分:状态行,由 HTTP 协议版本号, 状态码, 状态消息 三部分组成。


第一行为状态行,(HTTP/1.1)表明 HTTP 版本为 1.1 版本,状态码为 200,状态消息为(ok)


第二部分:消息报头,用来说明客户端要使用的一些附加信息


第二行和第三行为消息报头, Date:生成响应的日期和时间;Content-Type:指定了 MIME 类型的 HTML(text/html),编码类型是 UTF-8


第三部分:空行,消息报头后面的空行是必须的


第四部分:响应正文,服务器返回给客户端的文本信息。


空行后面的 html 部分为响应正文。

5、谈谈对 http 缓存的了解。

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,客户端可以继续使用缓存。

6、Http 长连接。

Http1.0 是短连接,HTTP1.1 默认是长连接,也就是默认 Connection 的值就是 keep-alive。但是长连接实质是指的 TCP 连接,而不是 HTTP 连接。TCP 连接是一个双向的通道,它是可以保持一段时间不关闭的,因此 TCP 连接才有真正的长连接和短连接这一说。

Http1.1 为什么要用使用 tcp 长连接?

长连接是指的 TCP 连接,也就是说复用的是 TCP 连接。即长连接情况下,多个 HTTP 请求可以复用同一个 TCP 连接,这就节省了很多 TCP 连接建立和断开的消耗。


此外,长连接并不是永久连接的。如果一段时间内(具体的时间长短,是可以在 header 当中进行设置的,也就是所谓的超时时间),这个连接没有 HTTP 请求发出的话,那么这个长连接就会被断掉。


需要更深的理解请点击这里

7、Https 加密原理。

加密算法的类型基本上分为了两种:


  • 对称加密,加密用的密钥和解密用的密钥是同一个,比较有代表性的就是 AES 加密算法;

  • 非对称加密,加密用的密钥称为公钥,解密用的密钥称为私钥,经常使用到的 RSA 加密算法就是非对称加密的;


此外,还有 Hash 加密算法


HASH 算法:MD5, SHA1, SHA256


相比较对称加密而言,非对称加密安全性更高,但是加解密耗费的时间更长,速度慢。


想了解更多加密算法请点击这里


HTTPS = HTTP + SSL,HTTPS 的加密就是在 SSL 中完成的。


这就要从 CA 证书讲起了。CA 证书其实就是数字证书,是由 CA 机构颁发的。至于 CA 机构的权威性,那么是毋庸置疑的,所有人都是信任它的。CA 证书内一般会包含以下内容:


  • 证书的颁发机构、版本

  • 证书的使用者

  • 证书的公钥

  • 证书的有效时间

  • 证书的数字签名 Hash 值和签名 Hash 算法

  • ...

客户端如何校验 CA 证书?

CA 证书中的 Hash 值,其实是用证书的私钥进行加密后的值(证书的私钥不在 CA 证书中)。然后客户端得到证书后,利用证书中的公钥去解密该 Hash 值,得到 Hash-a ;然后再利用证书内的签名 Hash 算法去生成一个 Hash-b 。最后比较 Hash-a 和 Hash-b 这两个的值。如果相等,那么证明了该证书是对的,服务端是可以被信任的;如果不相等,那么就说明该证书是错误的,可能被篡改了,浏览器会给出相关提示,无法建立起 HTTPS 连接。除此之外,还会校验 CA 证书的有效时间和域名匹配等。

HTTPS 中的 SSL 握手建立过程

假设现在有客户端 A 和服务器 B :


  • 1、首先,客户端 A 访问服务器 B ,比如我们用浏览器打开一个网页 www.baidu.com ,这时,浏览器就是客户端 A ,百度的服务器就是服务器 B 了。这时候客户端 A 会生成一个随机数 1,把随机数 1 、自己支持的 SSL 版本号以及加密算法等这些信息告诉服务器 B 。

  • 2、服务器 B 知道这些信息后,然后确认一下双方的加密算法,然后服务端也生成一个随机数 B ,并将随机数 B 和 CA 颁发给自己的证书一同返回给客户端 A 。

  • 3、客户端 A 得到 CA 证书后,会去校验该 CA 证书的有效性,校验方法在上面已经说过了。校验通过后,客户端生成一个随机数 3 ,然后用证书中的公钥加密随机数 3 并传输给服务端 B 。

  • 4、服务端 B 得到加密后的随机数 3,然后利用私钥进行解密,得到真正的随机数 3。

  • 5、最后,客户端 A 和服务端 B 都有随机数 1、随机数 2、随机数 3,然后双方利用这三个随机数生成一个对话密钥。之后传输内容就是利用对话密钥来进行加解密了。这时就是利用了对称加密,一般用的都是 AES 算法。

  • 6、客户端 A 通知服务端 B ,指明后面的通讯用对话密钥来完成,同时通知服务器 B 客户端 A 的握手过程结束。

  • 7、服务端 B 通知客户端 A,指明后面的通讯用对话密钥来完成,同时通知客户端 A 服务器 B 的握手过程结束。

  • 8、SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户端 A 和服务器 B 开始使用相同的对话密钥进行数据通讯。


简化如下:


  • 1、客户端和服务端建立 SSL 握手,客户端通过 CA 证书来确认服务端的身份;

  • 2、互相传递三个随机数,之后通过这随机数来生成一个密钥;

  • 3、互相确认密钥,然后握手结束;

  • 4、数据通讯开始,都使用同一个对话密钥来加解密;


可以发现,在 HTTPS 加密原理的过程中把对称加密和非对称加密都利用了起来。即利用了非对称加密安全性高的特点,又利用了对称加密速度快,效率高的好处。


需要更深的理解请点击这里

8、HTTPS 如何防范中间人攻击?

什么是中间人攻击?

当数据传输发生在一个设备(PC/手机)和网络服务器之间时,攻击者使用其技能和工具将自己置于两个端点之间并截获数据;尽管交谈的两方认为他们是在与对方交谈,但是实际上他们是在与干坏事的人交流,这便是中间人攻击。

有几种攻击方式?

  • 1、嗅探:


嗅探或数据包嗅探是一种用于捕获流进和流出系统/网络的数据包的技术。网络中的数据包嗅探就好像电话中的监听。


  • 2、数据包注入:


在这种技术中,攻击者会将恶意数据包注入常规数据中。这样用户便不会注意到文件/恶意软件,因为它们是合法通讯流的一部分。


  • 3、会话劫持:


在你登录进你的银行账户和退出登录这一段期间便称为一个会话。这些会话通常都是黑客的攻击目标,因为它们包含潜在的重要信息。在大多数案例中,黑客会潜伏在会话中,并最终控制它。


  • 4、SSL 剥离:


在 SSL 剥离攻击中,攻击者使 SSL/TLS 连接剥落,随之协议便从安全的 HTTPS 变成了不安全的 HTTP。

HTTPS 如何防范中间人攻击:

请见 https 加密原理。

9、有哪些响应码,分别都代表什么意思?

1** 信息,服务器收到请求,需要请求者继续执行操作


2** 成功,操作被成功接收并处理


3** 重定向,需要进一步的操作以完成请求


4** 客户端错误,请求包含语法错误或无法完成请求


5** 服务器错误,服务器在处理请求的过程中发生了错误

二、TCP/UDP (???)

1、为什么 tcp 要经过三次握手,四次挥手?

重要标志位

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 时意味将没有数据再发来,但是还是可以继续发送数据。

2、TCP 可靠传输原理实现(滑动窗口)。

确认和重传:接收方收到报文后就会进行确认,发送方一段时间没有收到确认就会重传。


数据校验。


数据合理分片与排序,TCP 会对数据进行分片,接收方会缓存为按序到达的数据,重新排序后再提交给应用层。


流程控制:当接收方来不及接收发送的数据时,则会提示发送方降低发送的速度,防止包丢失。


拥塞控制:当网络发生拥塞时,减少数据的发送。


关于滑动窗口、流量控制、拥塞控制实现原理请点击这里

3、Tcp 和 Udp 的区别?

1、基于连接与无连接;


2、对系统资源的要求(TCP 较多,UDP 少);


3、UDP 程序结构较简单;


4、流模式与数据报模式 ;


5、TCP 保证数据正确性,UDP 可能丢包;


6、TCP 保证数据顺序,UDP 不保证。

4、如何设计在 UDP 上层保证 UDP 的可靠性传输?

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照 tcp 可靠性传输的方式。如不考虑拥塞处理,可靠 UDP 的简单设计如下:


  • 1、添加 seq/ack 机制,确保数据发送到对端

  • 2、添加发送和接收缓冲区,主要是用户超时重传。

  • 3、添加超时重传机制。


具体过程即是:送端发送数据时,生成一个随机 seq=x,然后每一片按照数据大小分配 seq。数据到达接收端后接收端放入缓存,并发送一个 ack=x 的包,表示对方已经收到了数据。发送端收到了 ack 包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。


目前有如下开源程序利用 udp 实现了可靠的数据传输。分别为 RUDP、RTP、UDT:


1、RUDP(Reliable User Datagram Protocol)


RUDP 提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等。


2、RTP(Real Time Protocol)


RTP 为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。


3、UDT(UDP-based Data Transfer Protocol)


UDT 的主要目的是支持高速广域网上的海量数据传输。


关于RUDP、RTP、UDT的更多介绍请查看此处

三、其它重要网络概念 (??)

1、socket 断线重连怎么实现,心跳机制又是怎样实现?

socket 概念

套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口。


为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与 TCP/IP 协议交互提供了套接字(Socket)接口。应 用层可以和传输层通过 Sock


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


et 接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

建立 socket 连接

建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另一个运行于服务器端,称为 ServerSocket 。


套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。


  • 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

  • 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端- - 套接字的地址和端口号,然后就向服务器端套接字提出连接请求。


连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发 给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

SOCKET 连接与 TCP 连接

创建 Socket 连接时,可以指定使用的传输层协议,Socket 可以支持不同的传输层协议(TCP 或 UDP),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接。

Socket 连接与 HTTP 连接

由于通常情况下 Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网 络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。


而 HTTP 连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。


很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是 Socket 连接,服务器就可以直接将数 据传送给客户端;若双方建立的是 HTTP 连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求, 不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。TCP(Transmission Control Protocol) 传输控制协议

socket 断线重连实现

正常连接断开客户端会给服务端发送一个 fin 包,服务端收到 fin 包后才会知道连接断开。 而断网断电时客户端无法发送 fin 包给服务端,所以服务端没办法检测到客户端已经短线。 为了缓解这个问题,服务端需要有个心跳逻辑,就是服务端检测到某个客户端多久没发送任何数据过来就认为客户端已经断开, 这需要客户端定时向服务端发送心跳数据维持连接。

心跳机制实现

长连接的实现:心跳机制,应用层协议大多都有 HeartBeat 机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线。并传输一些可能必要的数据。使用心跳包的典型协议是 IM,比如 QQ/MSN/飞信等协议


1、在 TCP 的机制里面,本身是存在有心跳包的机制的,也就是 TCP 的选项:SO_KEEPALIVE。 系统默认是设置的 2 小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。 而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。通过使用 TCP 的 KeepAlive 机制(修改那个 time 参数),可以让连接每隔一小段时间就产生一些 ack 包,以降低被踢掉的风险,当然,这样的代价是额外的网络和 CPU 负担。


2、应用层心跳机制实现。

2、Cookie 与 Session 的作用和原理。

  • Session 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中。

  • Cookie 是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现 Session 的一种方式。

Session:
用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
【收藏】2021年Android跳槽大厂必备宝典(2),移动混合开发技术