Android开发经验谈Android开发

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

2020-05-13  本文已影响0人  Android高级架构

八、网络层

1、网络层主要功能

数据路由。

2、IP 协议

1)、IP 协议拆解

虚拟互联网络

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

IP 协议的作用

IP 地址

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

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

特点

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 数据所携带的具体数据是什么协议的」。(例如: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。

路由表

转发流程

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

3)、IP 地址的子网划分

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

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

分类的 IP 地址

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

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

展示图

特殊的网络号

特殊的主机号

表格图

「本地回环地址(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

分类地址的补充

它们都仅用作特殊用途。

划分子网

某公司拥有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 对应的子网号」。子网掩码的组成特点如下所示:

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

无分类编址 CIDR

「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 地址表获取地址时使用的广播形式类似」,即

「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)逆地址解析协议

3)、小结

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

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

为什么要使用 NAT?

1)、内网地址

特点

三类内网地址

对于公司,它可以在外部使用全球唯一的外网 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 查询报文,如下:

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

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

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 中间的这些设备或机器,通常的排查步骤如下所示:

此外,除了 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 包,就是网络差错包,类型是时间超时,这样就能知道一个路由器有多远。具体机制如下所示:

这样,源主机就接收到了所有的路径信息,就可以输出该数据报在网络中的路径了。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)

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

2)、路由协议

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

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

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

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

1、内部网关路由协议之 RIP(Routing Information Protocol) 协议

距离矢量(DV)算法
RIP 协议的特点
RIP 协议的过程
RIP 协议的优势

「实现简单,开销很小」

RIP 协议的弊端

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

2、内部网关路由协议之 OSPF 协议

链路状态(LS)协议

与 RIP 协议的不同:

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

Dijkstra 算法

特点:

过程:

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

核心是 Dijkstra 算法。

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

五种消息类型
RIP 协议 与 OSPF 协议的对比
RIP OSPF
从邻居看网络 整个网络的拓扑
在路由器之间累加距离 Dijkstra 算法计算最短路径
频繁、周期更新,收敛很慢 状态变化更新,收敛很快
路由间拷贝路由信息 路由间传递链路状态,自行计算路径
OSPF 的缺点

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

3)、外部网关路由协议之 BGP(Border Gateway protocol) 边际网关协议(很复杂、了解即可)

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

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

九、数据链路层

1、主要功能

1)、封装成帧

什么是数据帧?

数据帧结构

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

2)、透明传输

透明传输是什么?

透明传输的应用

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

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

3)、差错监测

为什么要进行差错监测?

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

差错监测的方式

1、奇偶校验码

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

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

2、CRC(循环冗余校验码)

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

「发送端增加校验码:」

「接收端验证校验码:」

「缺点」

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

1)、MTU

为什么要设计出 MTU?

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

2)、路径 MTU

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

3、以太网协议

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

特点

查看计算机的 MAC 地址

MAC 地址表

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

2)、协议内容

特点

数据格式

单位为 「字节」

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

数据传输过程

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

十、物理层

1、作用

什么是比特流?

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

2、常见的传输介质

1)、有线介质

1、双绞线

无屏蔽双绞线

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

双绞线

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

2、同轴电缆

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

3、光纤

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

2)、无线介质

3、信道基本概念

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

信道的分类

4、分用与复用

复用的分类

十一、总结

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

原文:jsonchao

上一篇 下一篇

猜你喜欢

热点阅读