数据路由。
计算机 A 与 B 之间的数据通信可以认为是通过一个虚拟的互连网络进行传输的。
「每一个唯一的网络设备都有一个唯一的 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 被分配到3个波段(band0、band1、band2)里面的。
占16位,最大数值为65535,表示的是 IP 数据报的总长度(IP 首部 + IP 数据)。
需要注意的是,「数据在数据链路层中的传输受最大传输单元 MTU 的限制,而 MTU 一般为为 1500 个字节,如果 IP 数据报的长度高于 MTU 的话,数据链路层将会把 IP 数据报进行 分片,即拆分成多个数据帧进行传输」。
协议内部自身使用,不需要关注。
占3位,目前只有两位是有意义的,「标识是否进行分片」。
占 13 位,「如果发生了分片,这里将会记录当前的数据帧保存的是第几个偏移的 IP 数据」。
占8位,「表明 IP 数据所携带的具体数据是什么协议的」。(例如:TCP、UPD 等等)
协议值ICMP1IGMP2IP4TCP6UDP17OSPF89「占16位,校验 IP 首部是否有错,接收方在接收了 IP 数据报文之后会进行头部的校验,如果出错会进行丢弃」。
发送 IP 数据报文的 IP 地址。
数据报到达的 IP 的地址。
数据是从目的设备传输到下一个网络1,又从下一个网络1传输到路由器,又从路由器跳到下一个网络2,所以是一跳一跳,即 hop-by-hop。
因为规划和分配 IP 地址非常麻烦。
组成形式:网络号 + 主机号
通常有如下三种类型的 IP 地址:
「A 类:首位为0,网络号为 8 位,主机号为24位」。「B 类:首位为10,网络号为 16 位,主机号为16位」。「C 类:首位为110,网络号为 24 位,主机号为8位」。「本地回环地址(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 对应的子网号」。子网掩码的组成特点如下所示:
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 使用了斜线记法,例如: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 中被称为子网)。
在 IP 数据的转发过程中,A 将 IP 数据报交给数据链路层,并告知其目的 MAC 地址是 E。这里 A 是如何知道目的 MAC 地址是 E 的呢?
❞「ARP 协议将网络层 IP 32位地址转换为数据链路层 MAC 48位地址」。
「缓存了 IP 地址到硬件地址之间的映射关系。有缓存时直接从缓存中取出即可,没有缓存时则会和 MAC 地址表获取地址时使用的广播形式类似」,即
1)、「E 检查 MAC 地址表,发现没有 C 的信息」。2)、「E 将广播 A 的数据包到除 A 以外的端口」。3)、「E 将收到来自 B、C 的回应,并将地址记录」。「ARP 缓存是 ARP 协议和 RARP 协议运行的关键。此外,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 协议使用到了网络层的 IP 地址」。
「不改变 IP 地址的网关,我们称为转发网关;改变 IP 地址的网关,我们称为 NAT 网关」。
❝为什么要使用 NAT?
❞ 1)、「IPv4 最多只有40+亿个 IP 地址」。2)、「早期 IP 地址的不合理规划导致 IP 号浪费」。对于公司,它可以在外部使用全球唯一的外网 IP 地址,通常在内部使用一个 B 类内网地址即可。
同理,对于家庭可以在外部使用全球唯一的外网 IP 地址,通常在内部使用一个 C 类内网地址即可。
❝问题:内网的多个设备使用同一个外网 IP 请求外网服务,外部是怎么样才能知道是哪一个内网设备请求的呢?
❞「使用 NAT ,它用于多个主机通过一个公有 IP 访问互联网的私有网络,并减缓了 IP 地址的消耗,但是增加了网络通信的复杂度」。
例如如下两个 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」。
ICMP 协议主要是用于 「辅助 IP 协议发送与接收数据的,它可以报告错误信息或异常情况」。
「ICMP 协议被封装在 IP 数据报的数据之中,其也分为 报文首部与报文数据。如果需要使用 ICMP 协议,则需要在 IP 协议首部的8位协议中写入1,以表明 IP 数据所携带的具体数据是 ICMP 协议的」。
差错报告报文具体分为 「七种类型」,而 「大部分的报文类型是由类型的值和具体代码组成的」。具体如下图所示:
询问报文具体分为 「两类」,它仅仅是由 「类型的值」 决定的。具体如下图所示:
常用的 ping 就是查询报文,是一种主动请求并且获得主动应答的 ICMP 查询报文,如下:
ICMP ECHO REQUESTZ:「对 ping 的主动请求进行网络抓包」。ICMP ECHO REPLY:「主动请求的回复」。所以,ping 发的包也是符合 ICMP 格式的,仅仅增加了一些自己的格式。如下所示:
1)、「标识符:派出去两队侦察兵,一队是侦查战况的,一队是去查找水源的,要有个标识才能区分」。2)、「序号:派出去的侦察兵,都要进行编号,便于知道前线的战况」。3)、「发送请求时间值:存放在选项数据中,用来计算往返时间和路程的长短」。ping 命令执行时,源主机会构建一个 ICMP 请求数据包,其中有两个最重要的字段,如下:
1)、「类型:对于请求数据包,此值为8」。2)、「顺序号:区分连续 ping 时发出的多个请求数据包。每发出一个请求数据包,顺序号会自动加1」。例如 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 目标 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,通过其他协议来测试网络是否畅通。
「用于探测 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 包。
路由表包括了 「目的 IP 地址与下一跳 IP 地址的映射关系」。
「从网络的分级层级来看,每一个主干 ISP 都可以认为是一个主干 AS,每一个地区 ISP 都可以认为是一个地区 AS,而每一个公司、校园、家庭都可以认为是一个小的 AS」。
例如家庭 AS1 与公司 AS2 它们直接使用的网关协议示意图如下所示:
我们可以把网络拓扑图转换为图,其中
「每一个顶点表示一个网络、路由器或计算机」。「每一条边表示一条网络路径」。「路由算法的本质即图论的算法,但由于复杂的网络环境,所以路由算法比图论算法要更加复杂」。
❝如何设计一个好的路由算法?
❞ 1)、正确、完整:算法是正确与完整的。2)、计算简单:算法在计算上应该尽可能地简单。3)、适应变化:算法可以适应网络中的各种变化。4)、稳定、公平:算法是稳定与公布的。「实现简单,开销很小」。
假设有一个 A-B-C 的链路,假如 A 路由节点出现问题无法使用,那么 B、C 就会互相询问,知道它们各自的跳数一直累加到超过 15 跳。
1)、「随便相信相邻节点」。2)、「自己不思考,视野局限,导致故障信息传递慢」。3)、「限制了网络的规模,只能在较小的网络中使用,因为它把跳数大于15的认为不可达」。与 RIP 协议的不同:
1)、「向所有的路由器发送消息」。2)、「消息描述该路由器与相邻路由器的链路状态」。3)、「只有链路状态发送变化时,才发送更新消息」。因此,可以看到 「LS 协议解决了 RIP 协议 随便相信隔壁路由、视野不够的问题」。
特点:
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 集合为空,算法完成」。核心是 Dijkstra 算法。
1)、「向所有的路由器发送消息,因此每一个路由器都可以获得网络中的所有信息,并因此得到完整的网络拓扑(链路状态数据库)。而且,每一个路由器都可以使用 Dijikstra 算法找到自己到达某一个顶点的最短路径」。2)、「消息描述该路由器与相邻路由器的链路状态(即距离、时延、带宽),因此 OSPF 协议比 RIP 协议更加客观与先进」。3)、「只有链路状态发生变化时,才发送更新信息,这使得路由器减少了数据的交换,能够更快地收敛」。然后,我们再来回顾一下 「完整过程」:
首先,「路由器接入网络」。然后,「路由器向邻居发出问候信息,以此来确认可达性」。确认后,「就会与邻居交流链路状态数据库,并将链路状态数据库都同步为最新的」。最后,「路由器会广播和更新未知路由」。虽然 OSPF 协议解决了 RIP 协议的问题,对整个网络有了一定的全局观,但是 「OSPF 协议本身较为复杂,实现开销较大」。
为什么要在 AS 之间使用 BGP 协议呢?
❞ 1)、「互联网的规模很大,这使得在 AS 之间选择路由非常困难,如果我们在 AS 之间选择链路状态协议,每个路由器都需要存储很多链路状态的数据,并且如果使用 Dijikstra 算法,运行会很慢,因此需要使用 BGP 协议」。2)、「AS 内部使用不同的路由协议,例如在一个 AS 中使用了 RIP 协议,而另一个 AS 中则使用了 OSPF 协议。对于使用不同的协议的路由器,在它们之间是无法通信的,因此它们之间便需要借助 BGP 协议来进行协调」。3)、「AS 之间需要考虑除网络特性之外的一些因素,例如 政治、安全」。「由于各个 AS (国家、地区)之间政策、安全等原因,BGP 仅能够找到一个到底目的地的比较好的路由。而 AS 之间是通过 BGP 发言人来进行路由信息的交换的」。
什么是数据帧?
❞ 「帧是数据链路层数据的基本单位」。「发送端在网络层的一段数据前后添加特定标记形成帧」。「接收端根据前后特定标记识别出帧」。如果数据里面刚好有这些比特流怎么办?
❞透明传输是什么?
❞ 1)、「计算机领域中非常重要的一个术语。例如对于数据链路层来说,物理层所做的工作就是透明的,物理层只需向外暴露接口即可」。2)、「一种实际存在的事物但是看起来像不存在一样」。3)、「即使控制字符在帧数据中,但是要当做不存在一样去处理」。如果数据里面刚好有这些控制字符该怎么办?
❞在该控制字符前面加上一个 ESC 转义字符,如果数据中也包含有 ESC 转义字符时,则可以在前面再加一个 ESC 转义字符。而数据链路层的转义字符可以类比与编程语言中的转义字符。
为什么要进行差错监测?
❞「因此物理层只管传输比特流,无法控制是否出错。所以数据链路层需要负责 差错监测 的工作」。
「在比特流的后面加上 奇偶校验码(1/0).例如:00110100 => 所有位数和为3,是基数,在该比特流后面加1。(偶数加0)」
它的局限性在于 「当比特流中出错两位时,无法检测出错误」。
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)、「数据链路层只进行数据的检测,不进行纠正,如果检测出错误数据会把该数据丢弃」。为什么要设计出 MTU?
❞数据帧过大或过小都会影响传输的效率。例如会增加数据传输时的总时延。以太网 MTU 一般为 1500 字节。
由传输链路中所有 MTU 中的最小 MTU 决定。
「存有 MAC 地址和硬件接口的映射关系。其中每一个 MAC 地址都有与之对应的硬件接口」。
单位为 「字节」。
❝其中的帧数据具体是什么数据?
❞ 「如果是网络层的 IP 数据,则 类型为 0800,帧数据 = IP 数据报」。「如果是 ARP 请求/应答,则 类型为 0806,帧数据 = ARP 请求/应答(28字节) + PAD(18字节)」。「如果是 RARP 请求/应答,则 类型为 8035,帧数据 = RARP 请求/应答(28字节) + PAD(18字节)」如果 MAC 地址并不知道 B 的硬件接口,路由器如何处理?
❞ 1)、E 检查 MAC 地址表,发现没有 C 的信息。2)、E 将广播 A 的数据包到除 A 以外的端口。3)、E 将收到来自 B、C 的回应,并将地址记录。什么是比特流?
❞「由高低电频表示的数据流,1 => 高电频,0 => 低电频」,例如由比特流 100110101010 转化成的数字信号如下图所示:
从外至内由 「聚氯乙烯套层、绝缘层、铜线」 组成。
不同于 无屏蔽双绞线,其在第二层 「加了屏蔽层」。
从外至内由 「绝缘保护套层、外导体屏蔽层、绝缘层、内导体」 组成。
光纤由 「包层(低折射率的媒体)、纤芯(高折射率的媒体)」 组成。
如何处理发送与接受出现冲突的情况?
❞计算机网络是一个需要我们持续深入探索的一门基础学科,在本篇中我们全面了解了计算机网络的核心基础知识,这为我们之后探讨移动网络优化相关的问题打下了一定的网络基础。网络优化之旅才刚刚开始~
❝关于计算机网络的高频问题可以 查看此处。
❞我的公众号 JsonChao 开通啦,如果您想第一时间获取最新文章和最新动态,欢迎扫描关注~
欢迎关注我的微信:bcce5360
❞「由于微信群已超过 200 人,麻烦大家想进微信群的朋友们,加我微信拉你进群。」
❞2千人QQ群,「Awesome-Android学习交流群,QQ群号:959936182」, 欢迎大家加入~
❞