Android开发经验谈

Android性能优化: 网络优化(一、网络筑基篇)上

2020-12-18  本文已影响0人  下饭小当家

成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。

一、重识计算机网络

1、计算机网络是什么?

2、计算机网络的分类

1)、按作用范围

广域网(WAN)

几十 KM ~ 几千 KM,跨省、跨国。

城域网(MAN)

5 KM ~ 50 KM,城市间、城市内。

局域网(LAN)

1 KM 内,地区内、家庭间、公司内。

2)、按网络使用者

公用网络

所有可以通过付费方式就可以加入的网络。

专用网络

某些部队、组织或者某些人 为了满足特殊业务需求而建立起来的特殊的网络,例如军队、铁路、银行都有自己的专用网络。

二、网络历史演进

1、世界互联网发展历史演进

1)、单个网络

ARPANET,1969年美国国防部创建的一个网络,可以连接周围的计算机。

计算机直接通过交换机就可以进行信息交换。

2)、三级结构

现代互联网的雏形,也称为 互联网络,可以把美国所有的大学、研究所、实验室都连接起来。

从上至下,由 主干网、地区网、校园网 组成。

3)、多层次 ISP

ISP(Internet Service Provider):网络服务提供商,例如中国电信、中国移动、中国联通等。从上之下,由主干 ISP、地区 ISP 组成

主干 ISP

中国的主干 ISP 包括 中国电信、中国移动、中国联通,它们可以连接美国和其它国家的主干 ISP。

地区 ISP

例如移动网络,在北京叫 北京移动,在上海叫 上海移动,这些就属于地区 ISP。地区 ISP 可以连接公司、校园、家庭的网络

4)、了解现代国际互联网的主要线路

我们可以通过 infrapedia 网站了解国际互联网的主要线路。

上图刻画了 全球的所有主干网络的线路,可以看到,中国的主干网络出口基本都是位于广东、福建等沿海地区,它们通过各自的海底电缆与位处于世界各地的主干网络相互连接,最终形成了互联网

2、中国互联网发展历史

1)、1980 年

中国铁道部开始互联网实验。

2)、1989 年

建立并运行第一个公共网络。

3)、1994 年

接入国际互联网。

4)、至今

当今中国最大的五个公用的计算机网络

3、中国的互联网企业

三、重识网络层次结构

网络为什么要分层?

因为复杂的程序都要分层。这是一个架构设计的通用问题,不仅仅是网络协议的问题,只要涉及复杂的逻辑或软件需求需要经常变动的情况通常都会通过分层来解决

思考🤔:设计一个计算机网络需要解决哪些问题?

总之,计算机网络需要解决的问题是繁多而复杂的,所以我们需要 采用分层的设计分别去解决不同的问题,实现不同的功能

1、层级结构设计的基本原则

1)、相互独立

每一层仅仅实现一个相对独立的功能,并且需要确保层与层之间的耦合度是非常低的。

2)、灵活性

每一层的设计需要具备很好的灵活性、扩展性,以适应未来的网络变化。

3)、耦合度

各层之间是完全解耦的,层与层之间的变化互不影响。

2、OSI 七层模型

OSI 功能
应用层 为计算机用户提供接口和服务。
表示层 数据处理:编解码、加解密等等。
会话层 管理(建立、维护、重连)通信会话。
传输层 管理端到端的通信连接。
网络层 数据路由:决定数据在网络中的路径。
数据链路层 管理相邻节点之间的数据通信。
物理层 数据通信的光电物理特性。

1)、OSI 悲催的故事

2)、OSI 七层模型失败的原因

3、TCP/IP 四层模型

我们需要理解数据通信过程中不同设备之间协议的转换。从下图可以看到 路由器仅包括网络层与网络接口层

从协议的数量来看,TCP/IP 四层模型构成了中间窄,两端大的⏳沙漏形状。如下图所示:

四、初识现代网络拓扑

1、为什么要了解网络拓扑?

因为它 有助于我们在脑海里面形成一个形象的计算机网络

2、网络拓扑分类

1)、边缘部分

家庭

终端机器、路由器、网关、地区 ISP 组成。

企业

不同于家庭的网络拓扑,其 网关细分为内部网关与统一网关

2)、核心部分

地区 ISP、主干 ISP、路由器、海底电缆或跨地区电缆 组成。其中的 通信设备(一般是华为)主要是由移动、联通所铺设的

现代互联网的网络拓扑形成了一个 树状结构

3)、C/S 模式

由 客户端/服务端 模式组成,并可以相互进行通信。

4)、P2P 模式

不分为服务端和客户端,它们都是 对等地进行连接的,优势在于可以使 下载速度更快,如迅雷下载器中就应用了这种模式。

五、网络性能指标

1、速率

即 bps <==> bit/s
复制代码

网络数据传输的各种单位与之对应的常见设备

为什么电信拉的 100M 光纤,测试峰值速度只有 12M 每秒?

网络常用单位为(Mbps),因此这里的 100M 指的是 100Mbps。

100 M/S = 100 Mbps = 100 Mbit/s
100 Mbit/s = (100/8)MB/s = 12.5 MB/s
复制代码

2、时延

1)、发送时延

发送时延 = 数据长度(bit)/ 发送速率(bit/s)
复制代码

数据长度是由用户决定的,而发送速率是由计算机网卡所决定的。

2)、传输时延

传播时延 = 传输路径距离 / 传播速率(bit/s)
复制代码

传输路径距离是由用户决定的,而传播速率则受限于传输介质。

3)、排队时延

数据包在网络设备中等待被处理的时间,例如路由器需要一个一个处理完前面的数据包才能处理后面的。

4)、处理时延

数据包到达设备或者目的机器被处理所需的时间。

总时延 = 发送时延 + 排队时延 + 传播时延 + 处理时延
复制代码

3、往返时间 RTT(Route-Trip Time)

通常使用 ping 命令查看 RTT

1)、ping 查看当前城市中的 IP

quchao@quchaodeMacBook-Pro ~ % ping 119.29.148.149
PING 119.29.148.149 (119.29.148.149): 56 data bytes
64 bytes from 119.29.148.149: icmp_seq=0 ttl=116 time=13.210 ms
64 bytes from 119.29.148.149: icmp_seq=1 ttl=116 time=19.118 ms
64 bytes from 119.29.148.149: icmp_seq=2 ttl=116 time=34.384 ms
复制代码

2)、ping 美国的 IP

quchao@quchaodeMacBook-Pro ~ % ping 191.101.238.160
PING 191.101.238.160 (191.101.238.160): 56 data bytes
64 bytes from 191.101.238.160: icmp_seq=0 ttl=52 time=191.791 ms
64 bytes from 191.101.238.160: icmp_seq=1 ttl=52 time=180.278 ms
64 bytes from 191.101.238.160: icmp_seq=2 ttl=52 time=186.399 ms
复制代码

六、应用层

传输层与之下的层已经提供了完整的通信服务。而应用层是面向用户的一层。它主要是用来 定义应用间通信的规则,例如应用进程的报文类型(请求报文、应答报文)、报文的语法、格式、应用进程发送数据的时机、规则等等。

1、DNS(Domain Name System) 域名系统服务

域即对应的网络号,名即对应的主机名字。

1)、功能

通过把没有规则的点分十进制 IP 地址转换为可以理解的一些域名。

2)、域名

顶级域常见分类

二级域

例如:qq、aliyun、taobao、google、facebook 等等。

顶级域、二级域、三级域组成了一个树状结构。且在顶级域名服务器上面还有一个根域名服务器

3)、域名服务器

只要有一个外网的服务器就可以搭建一个域名的服务器。

2、DHCP(Dynamic Host Configuratin Protocol) 动态主机设置协议

1)、是什么?

网络管理员只需配置一段共享的 IP 地址,每一台新接入的机器都可以通过 DHCP 来这个共享的 IP 地址里面申请 IP 地址,就可以自动配置。等用完还回去其它机器也能使用。它的特点如下所示:

2)、功能

3)、DHCP 的过程

4)、向 DHCP 租用的 IP 地址是有租期的,IP 地址如何实现续租呢?

客户端会在租期过去50%的时候,直接向为其提供 IP 地址的 DHCP 服务器发送 DHCP request 消息报。客户端接收到服务器回应的 DHCP ACK 消息包后,会根据消息报中提供的新的租期以及其他已经更新的 TCP/IP 参数更新自己的配置。

3、HTTP(HyperText Tranfsfer Protocol) 超文本传输协议

1)、是什么?

2)、Web 服务器

分为硬件部分(计算机或云上的虚拟设备)和软件部分(Nginx、Apache)。

过程

3)、HTTP 请求方法

header 1 header 2
GET 获取指定的服务端资源。
POST 提交数据到服务端。
DELETE 删除指定的服务端资源。(很少用)
UPDATE 更新指定的服务端资源。
PUT 修改数据。
OPTIONS 列出可对资源实行的请求方法,用来跨域请求。
CONNECT 建立连接隧道,用于代理服务器
HEAD 获取资源的元信息
TRACE 追踪请求-响应的传输路径

GET 和 POST 的区别

4)、HTTP 指定资源

1)、在地址中指定

www.wanandroid.com/repo/100.ht…

repo/100.html 是指定的请求资源。

www.wanandroid.com/?sort=0&unl…

? 后面用来指定请求参数。

2)、在请求数据中指定

5)、HTTP 请求报文

HTTP 的请求报文与响应报文都满足如下结构:

起始行 + 头部 + 空行 + 实体

其中的 空行是用来区分开头部和实体的

HTTP 请求报文的格式如下所示:

例如:

POST https://www.wanandroid.com HTTP/1.1
Accept-Encoding:gzip
Accept-Language:zh-CN
...
{ 请求的 jsonString 内容}
复制代码

6)、HTTP 应答报文

7)、HTTP 应答状态码

header 1 header 2
100~199 协议处理的中间状态,还需要后续操作
200~299 成功
300~399 重定向
400~499 客户端错误
500~599 服务端错误

100~199

200~299

300~399

400~499

500~599

8)、HTTP 工作结构

Web 缓存

通常遵循 二八原则:一个网站的内容通常分为20%的热门内容,80%的冷门内容。因此可以优先缓存热门内容。

存储器层次结构

缓存(CPU 高速缓存)/主存(内存)/辅存(磁盘)

Web 代理

Web 代理的分类

CDN(Content Delivery Network)内容分发网络

CDN的基本原理是 广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应

爬虫

用于在互联网上采集信息, 例如百度、Google的本质就是一个爬虫,它们通过把整个网络的数据给取下来,并且做一个索引,然后把这些内容提供给大家,在进行搜索时就会匹配这些内容并返回。

不好的爬虫的缺点:

4、HTTPS(Secure) 安全的 HTTP 协议

https://<主机>:<443>/<路径>

HTTP 是明文传输的,但是我们需要在网络中传输 账号密码、个人信息、账号金额、交易信息、敏感信息,这会导致中间人非法截取信息,导致信息泄露。

1)、加密模型

2)、数字证书 签名校验

数字证书是可信任组织颁发给特定对象的认证。而可信任组织即客户端与服务端都认为安全的组织

数字证书格式

3)、SSL(Secure Sockets Layer)安全套接层

SSL 位于传输层与应用层之间,它是一个子层,作用主要有两点

HTTPS 的通信过程

SSL(Secure Sockets Layer) 安全套接层握手过程

1)、生成随机数 1、2、3 的过程
2)、双端根据随机数 1、2、3 与相同的算法生成对称秘钥进行加密通信

HTTPS 综合地运用了对称加密与非对称加密,在进行随机数校验的阶段是使用了非对称加密来进行通信的,然后等双方都确定了三个随机数之后,就可以使用相同的算法来生成对称秘钥进行加密通信了。HTTPS 的优势在于双端分别生成了秘钥,没有经过传输,减少了秘钥泄漏的可能性

5、Http2

它的特点如下所示:

6、cookie

HTTP 是一个无状态协议,因此 Cookie 的最大的作用就是存储 sessionId 用来唯一标识用户。并且,Cookie 本质上就是浏览器里面存储的一个很小的文本文件,内部以键值对的方式来存储

生存周期

通过 Expires 和 Max-Age 两个属性来设置:

作用域

我们可以使用 Domain 和 path 属性给 Cookie 绑定域名和路径。如果在发送请求之前,发现域名或者路径和这两个属性不匹配,那么就不会带上 Cookie。需要注意的是,路径中含有 / 表示域名下的任意路径都允许使用 Cookie。

安全

缺点

7、HTTP 传输中的常见问题

七、传输层

现在,当设备 A 与 设备 B 相互通信时,我们可以认为它们就是通过一个虚拟的互连网络进行连接的。在虚拟的互连网络里面已经解决了网络拓扑、数据路由的走向等问题。在传输层重点解决的是两个设备它们直接是如何进行通信的

1、传输层的主要功能

1)、进程与进程的通信

不同于在单个操作系统内使用的进程间通信(Unix 域套接字、共享内存),网络通信可以跨设备、跨网络进行通信。

2)、端口的概念

常见的协议端口有:

协议 端口
FTP 21
HTTP 80
HTTPS 443
DNS 53
TELNET 23

2、UDP(User Datagram Protocol)用户数据报协议

1)、功能

UDP 协议 不会对数据报进行任何的处理,即不合并,也不拆分数据

2)、特点

1)、无连接

通信时并不需要提前建立连接。

2)、不保证可靠的数据交付

想发就发,无法保证数据在网络传输过程中是否丢失。

3)、面向报文传输

不对数据做任何处理,而是直接将应用层数据塞进报文里面。

4)、没有拥塞控制

不管网络是否拥塞,它都会把数据给交付出去。

5)、首部开销很小

首部仅仅占用8个字节。

3)、报文结构

4)、基于 UDP 定制化的 5 个例子🌰

1、来自网页或者 App 的访问

目前,HTTP 往往采取多个数据通道共享一个连接的策略,这样做本来是为了加快传输速度,但是 TCP 严格的顺序策略使得哪怕共享通道,前一个包不来,后一个包即使与前一个包没关系,也要等着,这样就会使时延加大。

而 QUIC(Quick UDP Internet Connection,快速 UDP 互联网连接)协议是 Google 提出的一种基于 UDP 改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验。

QUIC 会在应用层上自己快速建立连接、减少重传时延、自适应拥塞控制,是应用层定制化的代表。

2、流媒体协议

直播通常都使用 RTMP(Real Time Messaging Protocol,实时消息传输协议),基于 TCP。但对于直播来说实时性比较重要,宁可丢包,也不要卡顿。

对于视频播放来说,有的包可以丢,有的包不能,因为在视频的连续帧李,有的帧重要,有的不重要,如果一定要丢包,隔几个丢一个,其实看视频的人不会感知,但是如果是连续丢帧,就能感知到了,因此在网络不好的情况下,应用一般会选择性地丢帧。

当网络不好的时候,TCP 会主动降低发送速度,这对本来当时就卡的视频来讲无疑是雪上加霜。TCP 应该让应用层马上重传,而不是主动让步。因此,很多直播应用都基于 UDP 实现了自己的视频传输协议。

3、实时游戏

维护 TCP 连接需要在内核维护一些数据结构,但是一台机器能够支撑的 TCP 连接数目是有限的。由于 UDP 是没有连接的,所以在异步 I/O 机制引入之前,UDP 常常是应对海量客户端连接的策略。

在游戏对实时要求比较严格的情况下,可以采用自定义的可靠 UDP 来传输数据包,通过使用自定义重传策略,能够包丢包产生的延迟降到最低,尽量减少网络问题对游戏造成的影响。

4、物联网

Google 旗下的 Nest 建立了 Thread Group,推出了物联网通信协议 Thread,该协议就是基于 UDP 的。

5、移动通信领域

在 4G 网络里,通过移动通信传输数据面对的协议 GTP-U 就是基于 UDP 的。关于移动网络的相关知识我们将在下一篇进行讲解。

3、TCP(Transmission Control Protocol) 传输控制协议初识

1、TCP 报文详解

1)、特点

TCP 的缺点在于 传输效率慢,因为它需要建立连接、发送确认包等等

2)、报文首部字段

序号
确认号
数据偏移
TCP 标记

占6位,每位都有不同的含义。

标记 含义
URG(Urgent) 紧急位,URG = 1,表示紧急数据。
ACK(Acknowledgement 确认位,ACK = 1,确认号才生效。
PSH(Push) 推送位,PSH = 1,表示需要尽快地把数据交付给应用层。
RST(Reset) 重置位,RST = 1,重新建立连接。
SYN(Synchronization) 同步位,SYN = 1表示连接请求报文。
FIN(Finish) 终止位,FIN = 1表示释放连接。
窗口
校验和

与 UDP 类似,用来检测 TCP 的数据在传输过程中是否出错。

紧急指针
TCP 选项

4、可靠传输的基本原理

1)、停止等待协议

当发送方发送一个消息时,接收方接收到了并将确认信息发给发送方,这个过程中 发送方需要停止等待接收方的确认信息

超时重传

当消息发送出去后,发送方并没有在超时时间内接收到接收方的确认消息或者超时了之后消息才收到,此时会向发送方重新发送该消息。超时重传通常都会处理三种异常情况,如下所示:

超时定时器(超时重传定时器)

特点

既然单个发送和确认效率低,那么我们可以批量发送和确认吗?

2)、连续 ARQ(Automatic Repeat Request) 自动重传请求协议

ARQ 是对停止等待协议的改进,可以 大幅提升信道利用率 的一个协议。

滑动窗口

累积确认

只要我收到第5个消息的确认了,就表示第 1 ~ 5 个消息接收方都收到了。

5、TCP 协议的可靠传输

TCP 的可靠传输基于连续 ARQ 协议。

选择重传

6、TCP 协议的流量控制

流量控制指的是 让发送方发送速率不要太快。TCP 使用了滑动窗口来实现流量控制

1)、滑动窗口

如何解决这种死锁局面呢?

2)、坚持定时器

坚持定时器是使用滑动窗口进行流量控制的时候设置的。

7、TCP 协议的拥塞控制

问题

流量控制与拥塞控制的区别

不同于流量控制考虑的是点对点的通信量的控制,拥塞控制考虑的是整个网络,是一个全局性的考虑

如何判断是否发生了拥塞?

简单地认为报文超时就发生了拥塞

TCP 的拥塞控制

1)、慢启动算法
2)、拥塞避免算法

TCP 的拥塞控制在前期使用了 慢启动 算法对窗口大小进行指数增长,直到超过慢启动阈值(ssthresh)则不再增长,后续则启动拥塞避免算法对窗口进行线性增长

8、TCP 链接的建立 - 三次握手

为什么发送方要发出第三个确认报文呢?

9、TCP 链接的释放 - 四次挥手

1)、等待计时器

2)、为什么需要等待 2MSL?

10、TCP 与UDP 的区别

11、套接字(Socket)

我们可以使用端口(Port)来标记不同的网络进程,而端口使用了16比特位表示(0~65535)。

1)、Socket 概念

2)、Socket 编程

服务端编程

其代码如下所示:

import socket

def server():
    # 1、创建 Socket
    s = socket.socket()
    host = "127.0.0.1"
    port = 5678

    # 2、绑定 Socket
    s.bind(host, port)

    # 3、监听
    s.listen()

    # 4、发送数据
    while True:
        c, addr = s.accept()
        print("connect addr", addr)
        c.send(b'Socket Study.')
        c.close()
复制代码

客户端编程

其代码如下所示:

import socket

def client(i):
    # 1、创建 Socket
    s = socket.socket()

    # 2、连接 Socket
    s.connect(('127.0.0.1', 5678))

    # 3、接收消息
    print("Received message:%s, client Id:%d" % (s.recv(1024), i))
    s.close()

if __name__ == '__main__':
    for i in range(10):
        client(i)
复制代码

单机通信更推荐使用域 Socket,相比网络通信数据需要在整个协议栈走一轮,域 Socket 它的处理流程更加简单,系统消耗更加小。此外,如果对 Socket IO 实现机制有兴趣的同学可以 点击此处.

12、TCP 协议细节之 TCP 协议的四个定时器

当服务端每次收到对方的数据则重置这个定时器,如果定时器超时,则会发送弹出报文段,以此探测客户端是否在线,如果没有收到响应的话,那么则认为客户端已经断开连接了,因此服务端也会终止这个链接。现如今,很多的分布式系统都会使用保活定时器来检测其它节点是否在线还是已经故障,或者其它节点也会每隔一段时间向主节点上报心跳信息以证明在线。

13、TCP 在三次握手的时候,IP 层和 MAC(Medium Access Control) 层在做什么呢?

其实 TCP 每发送一个消息,都会带着 IP 层和 MAC 层。因为 TCP 每发送一个消息,IP 层和 MAC 层的所有机制都要运行一遍。

需要注意的是,只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。所以,对 TCP 来说,无论是三次握手还是重试,只要想包网络包发送出去,就要有 IP 层和 MAC 层,不然是发不出去的

作者:jsonchao
链接:https://juejin.cn/post/6844904155107049486
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇下一篇

猜你喜欢

热点阅读