美文网首页Android开发经验谈Android开发
究极深入Android网络优化——网络筑基(二)

究极深入Android网络优化——网络筑基(二)

作者: Android高级架构 | 来源:发表于2020-05-13 15:35 被阅读0次

八、网络层

1、网络层主要功能

数据路由。

2、IP 协议

1)、IP 协议拆解

虚拟互联网络

  • 1)、实际的计算机网络是错综复杂的。
  • 2)、物理设备通过使用 IP 协议,屏蔽了物理网络之间的差异。
  • 3)、当网络中的主机使用 IP 协议连接时,则无需关注网络细节。

计算机 A 与 B 之间的数据通信可以认为是通过一个虚拟的互连网络进行传输的。

IP 协议的作用

  • 1)、IP 协议 「使得复杂的实际网络变为一个虚拟互连的网络」
  • 2)、IP 协议 「使得网络层可以屏蔽底层细节而专注网络层的数据转发」
  • 3)、IP 协议 「解决了在虚拟网络中数据报传输路径的问题」

IP 地址

「每一个唯一的网络设备都有一个唯一的 IP 地址。不同于 MAC 地址是不可改变的,IP 地址会根据当前设备所连接的网络环境的变化而发生变化」

例如一个 IP 地址:192.168.11.11 => 11000000.10101000.00001011.00001011

特点

  • IP 地址长度为 32位,常分为4个8位。
  • IP 地址常使用点分十进制来表示,即 0255.0255.0255.0255。
  • IP 地址最多有 2 ^ 32 = 4294961296 => 42 亿。

IP 数据报 = IP 首部 + IP 数据报的数据,「IP 数据报的报文格式」 如下所示:

版本

占4位,指的是 IP 协议的版本,通信双方的版本必须一致,当前主流版本是4,即 IPv4,也有 IPv6。

首部位长度

占4位,最大数值为15,表示的是 IP 首部长度,单位是 32位字(4个字节)。所以 IP 首部的 「最大长度为 15 * 4 = 60字节」

服务类型(TOS)

表示当前的数据包是高优先级的,还是低优先级的。数据包是按照 TOS 被分配到3个波段(band0、band1、band2)里面的。

总长度

占16位,最大数值为65535,表示的是 IP 数据报的总长度(IP 首部 + IP 数据)。

需要注意的是,「数据在数据链路层中的传输受最大传输单元 MTU 的限制,而 MTU 一般为为 1500 个字节,如果 IP 数据报的长度高于 MTU 的话,数据链路层将会把 IP 数据报进行 分片,即拆分成多个数据帧进行传输」

标识

协议内部自身使用,不需要关注。

标志

占3位,目前只有两位是有意义的,「标识是否进行分片」

片偏移

占 13 位,「如果发生了分片,这里将会记录当前的数据帧保存的是第几个偏移的 IP 数据」

TTL

  • 「占8位,表明 IP 数据报文在网络中的寿命,每经过一个设备,TTL 减1,当 TTL = 0时,网络设备必须丢弃该报文」
  • 「当 IP 报文在网络中找不到终点的时候,避免 IP 数据在网络中无限进行传输,消耗带宽」

协议

占8位,「表明 IP 数据所携带的具体数据是什么协议的」。(例如:TCP、UPD 等等)

协议
ICMP 1
IGMP 2
IP 4
TCP 6
UDP 17
OSPF 89

首部校验和

「占16位,校验 IP 首部是否有错,接收方在接收了 IP 数据报文之后会进行头部的校验,如果出错会进行丢弃」

源 IP 地址

发送 IP 数据报文的 IP 地址。

目的 IP 地址

数据报到达的 IP 的地址。

2)、IP 协议的转发流程

逐跳(hop-by-hop)

数据是从目的设备传输到下一个网络1,又从下一个网络1传输到路由器,又从路由器跳到下一个网络2,所以是一跳一跳,即 hop-by-hop。

路由表

  • 1)、「不同于 MAC 地址表是由一组一组的 MAC 地址与硬件接口组成的,路由表是由一组一组的 目的 IP 地址与 下一跳的 IP 地址组成的」
  • 2)、「计算机或者路由器都拥有路由表」

转发流程

  • 1)、A 发出目的地为 C 的 IP 数据报,查询路由表发现下一跳为 E。
  • 2)、A 将 IP 数据报交给数据链路层,并告知目的 MAC 地址是 E。
  • 3)、数据链路层填充源 MAC 地址 A 和目的 MAC 地址 E。
  • 4)、数据链路层通过物理层将数据发送给 E。
  • 5)、E 的数据链路层接收到数据帧,把帧数据交给网络层。
  • 6)、E 查询路由表,发现下一跳为 F。
  • 7)、E 把数据报交给数据链路层,并告知目的 MAC 地址为 F。
  • 8)、E 的数据链路层封装数据帧并发送。
  • 9)、F 的数据链路层接收到数据帧,把帧数据交给网络层。
  • 10)、F 查询路由表,发现下一跳为 C。
  • 11)、F 把数据报交给数据链路层,并告知目的 MAC 地址为 C。
  • 12)、F 的数据链路层封装数据帧并发送。

MAC 地址与 IP 地址最大的区别

  • 1)、「数据帧每一跳的 MAC 地址都在变化,而IP 数据报每一跳的 IP 地址始终不变」
  • 2)、「IP 地址具有远程定位功能,而 MAC 地址更像是身份证号,它的唯一性是为了组网时可以不用担心不同的网卡在一个网络里会产生冲突,从硬件角度保证不同的网卡有不同的标识」
  • 3)、「相比于 IP 地址,MAC 地址的通信范围比较小,局限在一个子网里。例如:从 192.168.0.1/24 访问 192.168.0.9/24 是可以用 MAC 地址的」

3)、IP 地址的子网划分

为什么要对 IP 地址进行划分?

因为规划和分配 IP 地址非常麻烦。

分类的 IP 地址

组成形式:网络号 + 主机号

通常有如下三种类型的 IP 地址:

  • 「A 类:首位为0,网络号为 8 位,主机号为24位」
  • 「B 类:首位为10,网络号为 16 位,主机号为16位」
  • 「C 类:首位为110,网络号为 24 位,主机号为8位」

展示图

特殊的网络号

  • 「A 类地址网络段全0(00000000)表示特殊网络」
  • 「A 类地址网络段后7位全1(01111111:127)表示回环地址」
  • 「B 类地址网络段(10000000.00000000:128.0)是不可使用的」
  • 「C 类地址网络段(192.0.0)是不可使用的」

特殊的主机号

  • 「主机号全0表示当前网络段,不可分配为特定主机。例如:1.0.0.0」
  • 「主机号为全1表示广播地址,向当前网络段所有主机发消息。例如:0.1.11.111」

表格图

「本地回环地址(Loopback Address):127.0.0.1,不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会废弃的接口。在 Windwos 操作系统中也有相似的定义,所以一般在安装网卡前就可以 ping 通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否是正常的」。代码如下所示:

quchao@quchaodeMacBook-Pro EMC-MBANK-ANDROID % ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.068 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.081 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.081 ms

分类地址的补充

  • D 类地址:1110.....
  • E 类地址:1111.....

它们都仅用作特殊用途。

划分子网

某公司拥有256名员工,每人配备一个计算机,请问该公司应该申请哪种网络段?

分配 B 类地址,但是一个 B 类地址所能容纳的主机数量为 2^16-2,这会造成极大的浪费。为了解决这个问题,需要划分子网。

例如:将 193.10.10.0 这个 IP 划分为 193.10.10.0 ~ 193.10.10.127 与 193.10.10.128 ~ 193.10.10. 255。

子网这么多,如何判断某个 IP 的网络号?

子网掩码

「快速地判断某一个 IP 属于哪一个子网号,通过 IP & 子网掩码 = 该 IP 对应的子网号」。子网掩码的组成特点如下所示:

  • 1)、「与 IP 地址一样,都是32位」
  • 2)、「由连续的1和连续的0组成」
  • 3)、「某一个子网的子网掩码具备网络号位数个连续的1」

例如 A、B、C 类的子网掩码地址:A类:255.0.0.0,B类:255.255.0.0,C类:255.255.255.0

无分类编址 CIDR

  • 1)、「CIDR 中没有 A、B、C 类网络号 和 子网划分的概念」
  • 2)、「CIDR 将 网络前缀 相同的 IP 地址称为一个 CIDR 地址块」
  • 3)、「网络前缀是任意位数的」
  • 4)、「相比原来子网划分更加灵活」

「CIDR 使用了斜线记法,例如:193.10.10.129/25 表示网络号为 25 位,主机号为 7位」。一般家里都是使用 /24 的 CIDR,此时整个网络里面的第一个地址为 192.168.0.1,往往就是私网的出口地址。例如:家里面的电脑连接 WIFI,WIFI 路由器的地址就是 192.168.0.1,而 192.168.0.255 就是广播地址。

loopback 是什么?

「即环回接口,通常会被分配到 127.0.0.1 这个地址,它用于本机内部通信,经过内核处理后直接返回,不会再任何网络中出现」

某公司总共有 200 名员工,需要拆分成两个部分,每个部分使用一个小型网络,如何使用 CIDR 进行划分?

可以使用一个 /24 作为一个中型网络(在 CIDR 中被称为超网),旗下有两个 /25 作为一个小型网络(在 CIDR 中被称为子网)。

3、ARP 协议与 RARP 协议

在 IP 数据的转发过程中,A 将 IP 数据报交给数据链路层,并告知其目的 MAC 地址是 E。这里 A 是如何知道目的 MAC 地址是 E 的呢?

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(P)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 协议的对比
RIP OSPF
从邻居看网络 整个网络的拓扑
在路由器之间累加距离 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、分用与复用

复用的分类

  • 1)、频分复用
  • 2)、时分复用
  • 3)、波分复用
  • 4)、码分复用

十一、总结

计算机网络是一个需要我们持续深入探索的一门基础学科,在本篇中我们全面了解了计算机网络的核心基础知识,这为我们之后探讨移动网络优化相关的问题打下了一定的网络基础。网络优化之旅才刚刚开始~

原文:jsonchao

相关文章

网友评论

    本文标题:究极深入Android网络优化——网络筑基(二)

    本文链接:https://www.haomeiwen.com/subject/pbwnnhtx.html