深入浅出Android网络优化之网络筑基(后篇)

1)、ARP(Address Resolution Protocol)地址解析协议

「ARP 协议将网络层 IP 32位地址转换为数据链路层 MAC 48位地址」

ARP 缓存池表

「缓存了 IP 地址到硬件地址之间的映射关系。有缓存时直接从缓存中取出即可,没有缓存时则会和 MAC 地址表获取地址时使用的广播形式类似」,即

  • 1)、「E 检查 MAC 地址表,发现没有 C 的信息」
  • 2)、「E 将广播 A 的数据包到除 A 以外的端口」
  • 3)、「E 将收到来自 B、C 的回应,并将地址记录」

「ARP 缓存是 ARP 协议和 RARP 协议运行的关键。此外,ARP 缓存表中的记录并不是永久有效的,有一定的期限」

查看 ARP 缓存表

使用 arp -a 命令,如下所示:

quchao@quchaodeMacBook-Pro EMC-MBANK-ANDROID % arp -a
? (22.1.253.254) at 0:10:db:ff:10:0 on en0 ifscope [ethernet]
? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]

ARP 协议

「ARP 协议被直接封装在了数据链路层中的数据帧里面的」

既然 ARP 协议是直接被封装在数据链路层中的数据帧里面的,那么为什么它是属于网络层的内容?

主要是因为 「ARP 协议使用到了网络层的 IP 地址」

ARP 协议内容

2)、RARP(Reverse Address Resolutioni Protocol)逆地址解析协议

  • 1)、「将数据链路层 MAC 48位地址转换为网络层 IP 32位地址」
  • 2)、「除了类型 8035 标识为 RARP 协议,其它内容与 ARP 协议类似」

3)、小结

  • RARP 协议与 ARP 协议是 TCP/IP 协议栈里面的基础协议,它们的操作对程序员是透明的。
  • 理解它们有助于我们理解网络分层的细节。
  • 「它们是协调数据链路层和网络层配合工作的重要协议」

4、网络地址转换 NAT(Network Address Translationn) 技术

「不改变 IP 地址的网关,我们称为转发网关;改变 IP 地址的网关,我们称为 NAT 网关」

为什么要使用 NAT?

  • 1)、「IPv4 最多只有40+亿个 IP 地址」
  • 2)、「早期 IP 地址的不合理规划导致 IP 号浪费」

1)、内网地址

特点
  • 1)、内部机构使用。
  • 2)、避免与外网地址重复。
三类内网地址
  • 「A 类:10.0.0.0~10.255.255.255(支持千万数量级设备)」
  • 「B 类:172.16.0.0~172.31.255.255(支持百万数据级设备)」
  • 「C 类:192.168.0.0~192.168.255.255(支持万数量级设备)」

对于公司,它可以在外部使用全球唯一的外网 IP 地址,通常在内部使用一个 B 类内网地址即可。

同理,对于家庭可以在外部使用全球唯一的外网 IP 地址,通常在内部使用一个 C 类内网地址即可。

问题:内网的多个设备使用同一个外网 IP 请求外网服务,外部是怎么样才能知道是哪一个内网设备请求的呢?

「使用 NAT ,它用于多个主机通过一个公有 IP 访问互联网的私有网络,并减缓了 IP 地址的消耗,但是增加了网络通信的复杂度」

2)、外网地址

  • 全球范围使用。
  • 全球公网唯一。

3)、端口映射

例如如下两个 NAT 转换过程:发送数据时,A 设备内网地址和端口号 => 外网地址与端口号:192.168.2.11:6666 => 173.21.59.10:16666,B 设备内网地址和端口号 => 外网地址与端口号:192.168.2.10:7777 => 173.21.59.10:17777。

「由于同时转换了 Port ,即进行了 端口映射,NAT 也可称为 NA§T」

5、ICMP(Internet Control Message Protocol)协议

1)、ICMP 协议拆解

功能

ICMP 协议主要是用于 「辅助 IP 协议发送与接收数据的,它可以报告错误信息或异常情况」

ICMP 报文结构

「ICMP 协议被封装在 IP 数据报的数据之中,其也分为 报文首部与报文数据。如果需要使用 ICMP 协议,则需要在 IP 协议首部的8位协议中写入1,以表明 IP 数据所携带的具体数据是 ICMP 协议的」

类型
1、差错报告报文

差错报告报文具体分为 「七种类型」,而 「大部分的报文类型是由类型的值和具体代码组成的」。具体如下图所示:

2、询问报文

询问报文具体分为 「两类」,它仅仅是由 「类型的值」 决定的。具体如下图所示:

常用的 ping 就是查询报文,是一种主动请求并且获得主动应答的 ICMP 查询报文,如下:

  • ICMP ECHO REQUESTZ「对 ping 的主动请求进行网络抓包」
  • ICMP ECHO REPLY「主动请求的回复」

所以,ping 发的包也是符合 ICMP 格式的,仅仅增加了一些自己的格式。如下所示:

  • 1)、「标识符:派出去两队侦察兵,一队是侦查战况的,一队是去查找水源的,要有个标识才能区分」
  • 2)、「序号:派出去的侦察兵,都要进行编号,便于知道前线的战况」
  • 3)、「发送请求时间值:存放在选项数据中,用来计算往返时间和路程的长短」

ping 命令执行时,源主机会构建一个 ICMP 请求数据包,其中有两个最重要的字段,如下:

  • 1)、「类型:对于请求数据包,此值为8」
  • 2)、「顺序号:区分连续 ping 时发出的多个请求数据包。每发出一个请求数据包,顺序号会自动加1」

2)、ICMP 报文的应用

Ping 应用

例如 ping www.wanandorid.com 网站,如下所示:

quchao@quchaodeMacBook-Pro cmmp-core-client-android % ping www.wanandroid.com
PING www.wanandroid.com (47.104.74.169): 56 data bytes
64 bytes from 47.104.74.169: icmp_seq=0 ttl=51 time=51.877 ms
64 bytes from 47.104.74.169: icmp_seq=1 ttl=51 time=52.416 ms
64 bytes from 47.104.74.169: icmp_seq=2 ttl=51 time=48.942 ms
64 bytes from 47.104.74.169: icmp_seq=3 ttl=51 time=45.816 ms
64 bytes from 47.104.74.169: icmp_seq=4 ttl=51 time=48.336 ms
64 bytes from 47.104.74.169: icmp_seq=5 ttl=51 time=42.358 ms
ç64 bytes from 47.104.74.169: icmp_seq=6 ttl=51 time=49.428 ms
64 bytes from 47.104.74.169: icmp_seq=7 ttl=51 time=41.963 ms

使用 Ping 命令对网络故障进行排查

遇到网络不通的问题时,除了直接 ping 目标 IP 地址,头脑中年还应该有一个清晰的网络拓扑图,并且需要清楚地知道一个包从源地址传到目标地址要经过哪些设备,然后逐个 ping 中间的这些设备或机器,通常的排查步骤如下所示:

  • 1)、「ping 回环地址 127.0.0.1,不通,说明计算机使用的协议栈有问题,需要重装系统或协议栈」
  • 2)、「Ping 网关地址(路由地址),内网 ping 192.168.0.1/ 192.168.1.1,通,说明本机到路由器的地址是通的。不通,则说明 WIFI、网线是有问题的」
  • 3)、「Ping 远端地址 ping www.wanandroid.com,不通,则说明家中到 ISP 的网络之间是有故障的。这个时候就要从电信、联通、移动等 ISP 来排查问题了」

此外,除了 ping 之外,我们还可以通过 tcpdump -i eth0 icmp「查看发出的包有没有到达某个点,以及回复的包到达了哪个点,以便更容易推断出错的位置」

ping 不同一定就代表网络不通吗?

不是,如果不在我们的控制范围内,很多中间设备都是禁止 ping 的,但是 ping 不通不代表网络不通。这个时候就要使用 Telnet,通过其他协议来测试网络是否畅通。

Traceoute 应用

「用于探测 IP 数据报在网络中走过的路径」

在 IP 数据报的首部中,有一个8位的生存时间 TTL,它表示了 IP 数据报文在网络中的寿命,每经过一个设备,TTL 减1,「当 TTL = 0时,网络设备必须丢弃该报文,并会发送 ICMP 终点不可达差错报文」

而 Traceoute 则巧妙地应用了 ICMP 终点不可达差错报文与 TTL 机制,为了探测 IP 数据报文走过的路径,它会发送一个 UDP 数据包。将 TTL 设置为1,一旦遇到一个路由器,它就会牺牲了。接着返回一个 ICMP 包,就是网络差错包,类型是时间超时,这样就能知道一个路由器有多远。具体机制如下所示:

  • 1)、「首先,会封装一个 TTL 为1的数据报文,当到达第一个网络之后,TTL 会减为0,第一个网络会发现 TTL 减为0了,此时就会往源主机发送 ICMP 终点不可达的差错报文。这个时候源主机就会把第一个网络的 IP 地址记录下来」
  • 2)、「然后,会封装一个 TTL 为2的数据报文,当到达第二个网络之后,TTL 会减为0,第二个网络会发现 TTL 减为0了,此时就会往源主机发送 ICMP 终点不可达的差错报文。这个时候源主机就会把第二个网络的 IP 地址记录下来」
  • 3)、「后面按 TTL + 1,到达的网络次序 + 1的规律进行,直到到达目的主机,最后得到目的主机的 IP 地址」

这样,源主机就接收到了所有的路径信息,就可以输出该数据报在网络中的路径了。traceroute 命令的使用示例如下所示:

tracert github.com (Windows 为 tracert github.com)
quchao@quchaodeMacBook-Pro cmmp-core-client-android % traceroute github.com
traceroute to github.com (13.250.177.223), 64 hops max, 52 byte packets
1 22.4.93.254 (22.4.93.254) 11.676 ms 7.331 ms 9.620 ms
2 59.40.180.129 (59.40.180.129) 977.679 ms 440.943 ms 10.672 ms
3 49.186.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.186.49) 9.207 ms 12.436 ms 10.636 ms
4 125.176.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.176.125) 13.202 ms 10.292 ms 28.478 ms
5 183.56.65.6 (183.56.65.6) 11.763 ms 9.236 ms
183.56.65.18 (183.56.65.18) 11.392 ms
6 202.97.94.134 (202.97.94.134) 18.357 ms
202.97.94.150 (202.97.94.150) 18.175 ms
202.97.94.134 (202.97.94.134) 36.600 ms
7 202.97.94.98 (202.97.94.98) 245.161 ms
202.97.12.29 (202.97.12.29) 19.504 ms
202.97.12.41 (202.97.12.41) 22.256 ms

为什么查找一个 IP 地址时可能会看不到中间有些路由器的信息?

因为有的路由器根本不会返回这个 ICMP 包。

6、路由

1)、路由简介

路由表包括了 「目的 IP 地址与下一跳 IP 地址的映射关系」

自治系统(Autonomous System)
  • 一个自治系统 AS 是处于一个管理机构下的网络设备群。
  • AS 内部网络自行管理,并提供一个或多个出入口。

「从网络的分级层级来看,每一个主干 ISP 都可以认为是一个主干 AS,每一个地区 ISP 都可以认为是一个地区 AS,而每一个公司、校园、家庭都可以认为是一个小的 AS」

2)、路由协议

  • 自治系统内部路由的协议:内部网关协议(RIP、OSP)
  • 自治系统外部路由的协议:外部网关协议(BGP)

例如家庭 AS1 与公司 AS2 它们直接使用的网关协议示意图如下所示:

我们可以把网络拓扑图转换为图,其中

  • 「每一个顶点表示一个网络、路由器或计算机」
  • 「每一条边表示一条网络路径」

「路由算法的本质即图论的算法,但由于复杂的网络环境,所以路由算法比图论算法要更加复杂」

如何设计一个好的路由算法?

  • 1)、正确、完整:算法是正确与完整的。
  • 2)、计算简单:算法在计算上应该尽可能地简单。
  • 3)、适应变化:算法可以适应网络中的各种变化。
  • 4)、稳定、公平:算法是稳定与公布的。
1、内部网关路由协议之 RIP(Routing Information Protocol) 协议
距离矢量(DV)算法
  • 1)、「每一个节点使用两个向量 Di 和 Si」
  • 2)、「Di 描述的是当前节点到别的节点的距离」
  • 3)、「Si 描述的是当前节点到别的节点的下一节点」
  • 4)、「首先,每一个节点会与相邻的节点交换向量 Di 和 Si 的信息」
  • 5)、「每一个节点根据交换的信息更新自己的节点信息:首先运算,然后把当前计算的结果和距离矢量进行比较,如果距离更小的话,则更新自己的距离矢量」
RIP 协议的特点
  • 1)、「RIP 协议是使用 DV 算法的一种路由协议」
  • 2)、「把网络条数(hop)作为 DV 算法的距离」
  • 3)、「RIP 协议每隔30s交换一次路由信息」
  • 4)、「RIP 协议认为跳数 > 15 的路由则为不可达路由」
RIP 协议的过程
  • 1、「路由器初始化路由信息(两个向量 Di 和 Si)」

  • 2、「对相邻路由器 X 发过来的信息,对信息的内容进行修改」

  • 1)、「检索本地路由,将信息中新的路由插入到路由表里面」

  • 2)、「检索本地路由,对于下一跳为 X 的,更新为修改后的信息」

  • 3)、「检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新路由表」

  • 3、「如果3分钟没有收到相邻的路由信息,则把相邻路由设置为不可达(16跳)」

RIP 协议的优势

「实现简单,开销很小」

RIP 协议的弊端

假设有一个 A-B-C 的链路,假如 A 路由节点出现问题无法使用,那么 B、C 就会互相询问,知道它们各自的跳数一直累加到超过 15 跳。

  • 1)、「随便相信相邻节点」
  • 2)、「自己不思考,视野局限,导致故障信息传递慢」
  • 3)、「限制了网络的规模,只能在较小的网络中使用,因为它把跳数大于15的认为不可达」
2、内部网关路由协议之 OSPF 协议
链路状态(LS)协议

与 RIP 协议的不同:

  • 1)、「向所有的路由器发送消息」
  • 2)、「消息描述该路由器与相邻路由器的链路状态」
  • 3)、「只有链路状态发送变化时,才发送更新消息」

因此,可以看到 「LS 协议解决了 RIP 协议 随便相信隔壁路由、视野不够的问题」

Dijkstra 算法

特点:

  • 1)、「Dijistra 算法是著名的图算法,它解决的是计算最短路径的问题」
  • 2)、「解决有权图从一个节点到其它节点的最短路径问题」
  • 3)、「以起始点为中心,向外层层扩展」

过程:

  • 1、「初始化两个集合(S,U)(S 为只有初始顶点点 A 的集合,U 为其它顶点集合)」

  • 2、「如果 U 不为空,对 U 集合顶点进行距离的排序,并取出距离 A 最近的一个顶点 D」

  • 1)、「将顶点 D 纳入 S 集合」

  • 2)、「更新通过顶点 D 到达 U 集合所有点的距离(如果距离更小则更新,否则不更新)」

  • 3)、「重复2步骤」

  • 3、「直到 U 集合为空,算法完成」

OSPF(Open Shortest Path First) 开放最短路径优先协议的过程

核心是 Dijkstra 算法。

  • 1)、「向所有的路由器发送消息,因此每一个路由器都可以获得网络中的所有信息,并因此得到完整的网络拓扑(链路状态数据库)。而且,每一个路由器都可以使用 Dijikstra 算法找到自己到达某一个顶点的最短路径」
  • 2)、「消息描述该路由器与相邻路由器的链路状态(即距离、时延、带宽),因此 OSPF 协议比 RIP 协议更加客观与先进」
  • 3)、「只有链路状态发生变化时,才发送更新信息,这使得路由器减少了数据的交换,能够更快地收敛」

然后,我们再来回顾一下 「完整过程」

  • 首先,「路由器接入网络」
  • 然后,「路由器向邻居发出问候信息,以此来确认可达性」
  • 确认后,「就会与邻居交流链路状态数据库,并将链路状态数据库都同步为最新的」
  • 最后,「路由器会广播和更新未知路由」
五种消息类型
  • 1)、「问候消息(Hello):测试自身与相邻路由器的可达性」
  • 2)「、链路状态数据库描述信息:用于向隔壁路由器发送自己的链路状态的一些简单的描述信息」
  • 3)、「链路状态请求信息:用于向隔壁路由器请求链路状态数据」
  • 4)、「链路状态更新信息:使用最频繁也是最重要的信息」
  • 5)、「链路状态确认信息:用于对链路更新的一个确认」
RIP 协议 与 OSPF 协议的对比
RIPOSPF
从邻居看网络整个网络的拓扑
在路由器之间累加距离Dijkstra 算法计算最短路径
频繁、周期更新,收敛很慢状态变化更新,收敛很快
路由间拷贝路由信息路由间传递链路状态,自行计算路径
OSPF 的缺点

虽然 OSPF 协议解决了 RIP 协议的问题,对整个网络有了一定的全局观,但是 「OSPF 协议本身较为复杂,实现开销较大」

3)、外部网关路由协议之 BGP(Border Gateway protocol) 边际网关协议(很复杂、了解即可)
  • BGP 协议是运行在 AS(自治系统)之间的一种协议。
  • BGP 协议是因为计算机网络中人为因素的复杂性而提出的,在实际的网络环境中,数据的传输还受整治、安全等因素的影响。

为什么要在 AS 之间使用 BGP 协议呢?

  • 1)、「互联网的规模很大,这使得在 AS 之间选择路由非常困难,如果我们在 AS 之间选择链路状态协议,每个路由器都需要存储很多链路状态的数据,并且如果使用 Dijikstra 算法,运行会很慢,因此需要使用 BGP 协议」
  • 2)、「AS 内部使用不同的路由协议,例如在一个 AS 中使用了 RIP 协议,而另一个 AS 中则使用了 OSPF 协议。对于使用不同的协议的路由器,在它们之间是无法通信的,因此它们之间便需要借助 BGP 协议来进行协调」
  • 3)、「AS 之间需要考虑除网络特性之外的一些因素,例如 政治、安全」

「由于各个 AS (国家、地区)之间政策、安全等原因,BGP 仅能够找到一个到底目的地的比较好的路由。而 AS 之间是通过 BGP 发言人来进行路由信息的交换的」

九、数据链路层

1、主要功能

1)、封装成帧

什么是数据帧?

  • 「帧是数据链路层数据的基本单位」
  • 「发送端在网络层的一段数据前后添加特定标记形成帧」
  • 「接收端根据前后特定标记识别出帧」
数据帧结构
  • 「网络层将 IP 数据报 传送到 数据链路层时,在数据链路层会给 IP 数据报 的前后添加 帧首部与帧尾部」
  • 「帧首部与尾部都是特定的控制字符,即一些特定的比特流,例如帧首部的 SOH:00000001,帧尾部的EOT:00000100」

如果数据里面刚好有这些比特流怎么办?

2)、透明传输

透明传输是什么?

  • 1)、「计算机领域中非常重要的一个术语。例如对于数据链路层来说,物理层所做的工作就是透明的,物理层只需向外暴露接口即可」
  • 2)、「一种实际存在的事物但是看起来像不存在一样」
  • 3)、「即使控制字符在帧数据中,但是要当做不存在一样去处理」
透明传输的应用

如果数据里面刚好有这些控制字符该怎么办?

在该控制字符前面加上一个 ESC 转义字符,如果数据中也包含有 ESC 转义字符时,则可以在前面再加一个 ESC 转义字符。而数据链路层的转义字符可以类比与编程语言中的转义字符。

3)、差错监测

为什么要进行差错监测?

「因此物理层只管传输比特流,无法控制是否出错。所以数据链路层需要负责 差错监测 的工作」

差错监测的方式
1、奇偶校验码

「在比特流的后面加上 奇偶校验码(1/0).例如:00110100 => 所有位数和为3,是基数,在该比特流后面加1。(偶数加0)」

它的局限性在于 「当比特流中出错两位时,无法检测出错误」

2、CRC(循环冗余校验码)
  • 1)、「一种根据传输或保存的数据而产生固定位数校验码的方式」
  • 2)、「检测数据传输或保存后可能出现的错误」
  • 3)、「生成的数字计算出来并且附加到数据后面」

CRC 使用了 「模 2 除法」,即:「当最高位为0时,则认为余数不够除,取商为0」

「发送端增加校验码:」

  • 1)、「选定一个用于校验的多项式 G(x)(例如:CRC-7、CRC-8 就代表 G(x) 中最高位为8),并在数据尾部添加 r 个0」
  • 2)、「将添加 r 个0后的数据,使用模 2 除法除以多项式的位串」
  • 3)、「将得到的余数填充在原数据 r 个0的位置得到可校验的位串」

「接收端验证校验码:」

  • 「接收数据除以 G(x) 的位串,如果余数为0,则校验成功」

「缺点」

  • 1)、「位串的阶数 r 越大,CRC 的错误检测能力越强。(阶数为1时,退化为奇偶校验码)」
  • 2)、「数据链路层只进行数据的检测,不进行纠正,如果检测出错误数据会把该数据丢弃」

2、最大传输单元 MTU(Maximum Transmission Unit)

1)、MTU

为什么要设计出 MTU?

数据帧过大或过小都会影响传输的效率。例如会增加数据传输时的总时延。以太网 MTU 一般为 1500 字节。

2)、路径 MTU

由传输链路中所有 MTU 中的最小 MTU 决定。

3、以太网协议

1)、MAC 地址(物理地址、硬件地址)

特点
  • 每一个设备都拥有唯一的 MAC 地址。
  • MAC 地址共 48 位,使用十六进制表示。例如:30-B4-9E-ED-85-DA 。
查看计算机的 MAC 地址
  • MAC:ifconfig
  • Windows:ipconfig /all
MAC 地址表

「存有 MAC 地址和硬件接口的映射关系。其中每一个 MAC 地址都有与之对应的硬件接口」

2)、协议内容

特点
  • 一种使用广为使用的局域网技术。
  • 一种应用于数据链路层的协议。
  • 借助其可以完成相邻设备间的数据帧传输。
数据格式

单位为 「字节」

其中的帧数据具体是什么数据?

  • 「如果是网络层的 IP 数据,则 类型为 0800,帧数据 = IP 数据报」
  • 「如果是 ARP 请求/应答,则 类型为 0806,帧数据 = ARP 请求/应答(28字节) + PAD(18字节)」
  • 「如果是 RARP 请求/应答,则 类型为 8035,帧数据 = RARP 请求/应答(28字节) + PAD(18字节)」
数据传输过程
  • 1)、「设备 A 通过网卡发出数据帧」
  • 2)、「数据帧到达路由器,路由器取出前6字节,即目的设备 B 的 MAC 地址」
  • 3)、「路由器匹配 MAC 地址表,找到目的设备 B 的网络接口」
  • 4)、「路由器往该网络接口发送数据帧」

如果 MAC 地址并不知道 B 的硬件接口,路由器如何处理?

  • 1)、E 检查 MAC 地址表,发现没有 C 的信息。
  • 2)、E 将广播 A 的数据包到除 A 以外的端口。
  • 3)、E 将收到来自 B、C 的回应,并将地址记录。

十、物理层

1、作用

  • 1)、「连接不同的物理设备」
  • 2)、「传输比特流」

什么是比特流?

「由高低电频表示的数据流,1 => 高电频,0 => 低电频」,例如由比特流 100110101010 转化成的数字信号如下图所示:

2、常见的传输介质

1)、有线介质

1、双绞线
无屏蔽双绞线

从外至内由 「聚氯乙烯套层、绝缘层、铜线」 组成。

双绞线

不同于 无屏蔽双绞线,其在第二层 「加了屏蔽层」

2、同轴电缆

从外至内由 「绝缘保护套层、外导体屏蔽层、绝缘层、内导体」 组成。

3、光纤

光纤由 「包层(低折射率的媒体)、纤芯(高折射率的媒体)」 组成。

2)、无线介质

  • 1)、红外线
  • 2)、无线(例如 4G、WIFI)
  • 3)、激光

3、信道基本概念

  • 信道是往一个方向传送信息的媒体。
  • 一条通信电路包含一个接受信道和一个发送信道。

如何处理发送与接受出现冲突的情况?

信道的分类

  • 1)、「单工信道:只能往一个方向通信,没有反方向反馈的信息。例如 有线电视、无线电收音机等等」
  • 2)、「半双工信道:双方都可以发送和接受信息。不能双方同时发送,也不能同时接受」
  • 3)、「全双工信道:双方都可以同时发送和接收信息。例如网线、网络等等」

4、分用与复用

复用的分类

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

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

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。

我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。

Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。

如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。

(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

c=“https://i-blog.csdnimg.cn/blog_migrate/612795ce3451b29fd947b50e590fdd7d.jpeg” />

总结

现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。

我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。

Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。

如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。

(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)

[外链图片转存中…(img-dP6KcYMn-1712015679938)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值