写点什么

【收藏】2021 年 Android 跳槽大厂必备宝典,阿里大牛整理

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

2、Http1.1 和 Http1.0 及 2.0 的区别?

HTTP1.0 和 HTTP1.1 的一些区别

HTTP1.0 最早在网页中使用是在 1996 年,那个时候只是使用一些较为简单的网页上和网络请求上,而 HTTP1.1 则在 1999 年才开始广泛应用于现在的各大浏览器网络请求中,同时 HTTP1.1 也是当前使用最为广泛的 HTTP 协议。 主要区别主要体现在:


  • 1、缓存处理,在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。

  • 2、带宽优化及网络连接的使用,HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

  • 3、错误通知的管理,在 HTTP1.1 中新增了 24 个错误状态响应码,如 409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

  • 4、Host 头处理,在 HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个 IP 地址。HTTP1.1 的请求消息和响应消息都应支持 Host 头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request)。

  • 5、长连接,HTTP 1.1 支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟,在 HTTP1.1 中默认开启 Connection: keep-alive,一定程度上弥补了 HTTP1.0 每次请求都要创建连接的缺点。

SPDY

在讲 Http1.1 和 Http2.0 的区别之前,还需要说下 SPDY,它是 HTTP1.x 的优化方案:


2012 年 google 如一声惊雷提出了 SPDY 的方案,优化了 HTTP1.X 的请求延迟,解决了 HTTP1.X 的安全性,具体如下:


  • 1、降低延迟,针对 HTTP 高延迟的问题,SPDY 优雅的采取了多路复用(multiplexing)。多路复用通过多个请求 stream 共享一个 tcp 连接的方式,解决了 HOL blocking 的问题,降低了延迟同时提高了带宽的利用率。

  • 2、请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY 允许给每个 request 设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的 html 内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。

  • 3、header 压缩。前面提到 HTTP1.x 的 header 很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。

  • 4、基于 HTTPS 的加密协议传输,大大提高了传输数据的可靠性。

  • 5、服务端推送(server push),采用了 SPDY 的网页,例如我的网页有一个 sytle.css 的请求,在客户端收到 sytle.css 数据的同时,服务端会将 sytle.js 的文件推送给客户端,当客户端再次尝试获取 sytle.js 时就可以直接从缓存中获取到,不用再发请求了。SPDY 构成图:



SPDY 位于 HTTP 之下,TCP 和 SSL 之上,这样可以轻松兼容老版本的 HTTP 协议(将 HTTP1.x 的内容封装成一种新的 frame 格式),同时可以使用已有的 SSL 功能。

HTTP2.0 和 HTTP1.X 相比的新特性

  • 新的二进制格式(Binary Format),HTTP1.x 的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认 0 和 1 的组合。基于这种考虑 HTTP2.0 的协议解析决定采用二进制格式,实现方便且健壮。

  • 多路复用(MultiPlexing),即连接共享,即每一个 request 都是是用作连接共享机制的。一个 request 对应一个 id,这样一个连接上可以有多个 request,每个连接的 request 可以随机的混杂在一起,接收方可以根据 request 的 id 将 request 再归属到各自不同的服务端请求里面。

  • header 压缩,如上文中所言,对前面提到过 HTTP1.x 的 header 带有大量信息,而且每次都要重复发送,HTTP2.0 使用 encoder 来减少需要传输的 header 大小,通讯双方各自 cache 一份 header fields 表,既避免了重复 header 的传输,又减小了需要传输的大小。

  • 服务端推送(server push),同 SPDY 一样,HTTP2.0 也具有 server push 功能。


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

3、Https 请求慢的解决办法

1、不通过 DNS 解析,直接访问 IP

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 报文段)中,一并发


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


送给客户端,此时服务器进入 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 的主要目的是支持高速广域网上的海量数据传输。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
【收藏】2021年Android跳槽大厂必备宝典,阿里大牛整理