趣谈网络协议-第二模块-底层网络知识详解:1从一层到三层

趣谈网络协议-第二模块-底层网络知识详解:1从一层到三层

一层:物理层
二层:链路层(MAC层)
三层:网络层(IP层)

1:从物理层到MAC层:如何在宿舍里自己组网玩联机游戏?

第一层(物理层)

物理层就是各种线,硬件如集线器。

网线

从古老的1-3、2-6 交叉接线法(现在已经不需要)到现在七类线

集线器(Hub)

这种设备有多个口,可以将宿舍里的多台电脑连接起来。但是,和交换机不同,集线器没有大脑,它完全在物理层工作。它会将自己收到的每一个字节,都复制到其他端口上去。即:Hub 采取的是广播的模式,如果每一台电脑发出的包,宿舍的每个电脑都能收到。

连接设备的还有交换机和路由器:
交换机(注意,交换机不是一层设备)交换机有“大脑”。后面再补充怎么个“大脑”
路由器(注意,路由器不是一层设备)后面再说。

第二层(数据链路层)

Hub 采取的广播模式,会有以下问题:

  1. 这个包是发给谁的?谁应该接收?
  2. 大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?
  3. 如果发送的时候出现了错误,怎么办?

数据链路层就是用来解决上述问题的。MAC的全称是Medium Access Control,即媒体访问控制

多路访问解决“谁先发、谁后发”问题

第二个问题是“谁先发、谁后发的问题,防止发生混乱”的问题,解决这个问题的规则,学名叫多路访问
多路访问算法(车管所管束马路上跑的车作类比):

  1. 方式一:分多个车道。每个车一个车道,你走你的,我走我的。这在计算机网络里叫作信道划分
  2. 方式二:今天单号出行,明天双号出行,轮着来。这在计算机网络里叫作轮流协议
  3. 方式三:不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。我们叫作随机接入协议。著名的以太网,用的就是这个方式。(以太网?局域网?广域网?互联网?以太网与互联网有什么区别?

数据链路层中说的媒体访问控制MAC、平时说的MAC层, 和MAC地址没什么关系。?

链路层地址解决收发人的问题

回头看年第一个问题:发给谁,谁接收?这里用到一个物理地址,叫作链路层地址。但是因为第二层主要解决媒体接入控制(Medium Access Control,MAC)的问题,所以它常被称为MAC 地址
先看看第二层的网络包的格式:
在这里插入图片描述

目标的 MAC 地址和源的 MAC 地址
类型

大部分的类型是 IP 数据包,然后 IP 里面包含 TCP、UDP,以及 HTTP 等,这都是里层封装的事情。

包是怎么流转和被解释的:
有了这个目标 MAC 地址,数据包在链路上广播,MAC地址为目标MAC 的网卡才能发现,这个包是给它的。MAC地址为目标MAC 的网卡把包收进来,然后打开 IP 包,发现 IP 地址也是自己的,再打开 TCP 包,发现端口是自己,也就是 80,而 nginx 就是监听 80。
于是将请求提交给 nginx,nginx 返回一个网页。然后将网页需要发回请求的机器。然后层层封装,最后到 MAC 层。因为来的时候有源 MAC 地址,返回的时候,源 MAC 就变成了目标 MAC,再返给请求的机器。

CRC

对于以太网,第二层的网络包的最后面是CRC,即循环冗余检测(Cyclic Redundancy Check)。它通过 XOR( 异或)的算法,来计算整个包是否在发送的过程中出现了错误,主要解决第三个问题,即“如果发送的时候出现了错误,怎么办?”。

ARP 协议解决已知IP地址求MAC地址的问题

当源机器知道目标机器的时候,可以将目标MAC地址放入包里面。但如果不知道呢?一个广播的网络里面接入了 N 台机器,只知道目标IP地址,怎么知道对应的 MAC 地址呢?
这时,要使用ARP (Address Resolution Protocol,地址解析协议)协议,ARP就是已知 IP 地址,求 MAC 地址的协议(即根据IP地址获取物理地址的一个TCP/IP协议)。
局域网内,机器A只知目标IP,求目标MAC的示意图如下,这时A广播一下,等人回答:
在这里插入图片描述
A问和B答的过程如下:
在这里插入图片描述
注意1和4,为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。当然机器会不断地上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期。

具体询问和回答的报文如下:
在这里插入图片描述
PS1:
数据链路层其实不等于MAC层?数据链路层协议又被分为两个子层 :逻辑链路控制(LLC)协议和媒体访问控制(MAC)协议?)

局域网

Hub 采取的是广播的模式,机器多了,会乱,且本身也浪费。
这时可以用交换机,交换机是二层设备。它能把 MAC 头拿下来,检查一下目标 MAC 地址,然后根据策略转发给MAC地址为目标MAC地址的设备。
这要求交换机知道连接它的各个口的机器的MAC地址。交换机得知这些信息靠的是一个“学习的过程”。过程如下:

交换机得知MAC地址的过程

一台 MAC1 电脑将一个包发送给另一台 MAC2 电脑,当这个包到达交换机的时候,一开始交换机也不知道 MAC2 的电脑在哪个口,所以没办法,它只能将包转发给除了来的那个口之外的其他所有的口。但是,这个时候,交换机会干一件非常聪明的事情,就是交换机会记住,MAC1 是来自一个明确的口。以后有包的目的地址是 MAC1 的,直接发送到这个口就可以了。

当交换机作为一个关卡一样,过了一段时间之后,就有了整个网络的一个结构了,这个时候,基本上不用广播了,全部可以准确转发。当然,每个机器的 IP 地址会变,所在的口也会变,因而交换机上的学习的结果,我们称为转发表,是有一个过期时间的。

2 :交换机与VLAN:办公室太复杂,我要回学校

拓扑结构是怎么形成的?

这样子是没问题的,因为没有环路。
在这里插入图片描述

环路问题具体是怎么样?

这样子就有问题了,因为形成了环路。
在这里插入图片描述
想象一下机器 1 访问机器 2 的过程。一开始,机器 1 并不知道机器 2 的 MAC 地址,所以它需要发起一个 ARP 的广播。广播到达机器 2,机器 2 会把 MAC 地址返回来,看起来没有这两个交换机什么事情。
但是!这两个交换机还是都能够收到广播包的。交换机 A 一开始是不知道机器 2 在哪个局域网的,所以它会把广播消息放到局域网二,在局域网二广播的时候,交换机 B 右边这个网口也是能够收到广播消息的。交换机 B 会将这个广播息信息发送到局域网一。局域网一的这个广播消息,又会到达交换机 A 左边的这个接口。交换机 A 这个时候还是不知道机器 2 在哪个局域网,于是将广播包又转发到局域网二。即数据这样子走,A左->A右->B右->B左->A左……死循环了,这个包停不下来了。
而且,交换机A/B都会懵逼,不知道机器A在哪边。一开始,交换机A收到第一个直接从机器 A广播而来的ARP包,记住了机器A是在左边,但,马上又收到从交换机B的右口发出的ARP包(这个包是机器A广播的,由交换机B的左口入,交换机B右口出),所以交换机A会以为机器A换位置了,更新记忆,记住机器A在右边。如此往复,左右左右左右。

怎么破环路问题?STP!

STP(Spanning Tree Protocol,生成树协),即一个复杂的,带环形的图,变成树结构的一个方法。带环的叫图,还带环的叫树。

先看几个概念

Root Bridge,即根交换机。这个比较容易理解,可以比喻为“掌门”交换机,是某棵树的老大,是掌门,最大的大哥。(就是树的根节点。生成树的过程中,可能会有若干个根节点,即有多棵树。生成树的过程是合并这些树的过程。)

Designated Bridges,即指定交换机。这个比较难理解,可以想像成一个“小弟”,对于树来说,就是一棵树的树枝。所谓“指定”的意思是,我拜谁做大哥,其他交换机通过这个交换机到达根交换机,也就相当于拜他做了大哥。这里注意是树枝,不是叶子,因为叶子往往是主机。(就是树中的节点,既不是根,也不是叶子的节点?待确认)

Bridge Protocol Data Units (BPDU) ,即网桥协议数据单元。可以比喻为“相互比较实力”的协议。行走江湖,比的就是武功,拼的就是实力。当两个交换机碰见的时候,也就是相连的时候,就需要互相比一比内力了。BPDU 只有掌门能发,已经隶属于某个掌门的交换机只能传达掌门的指示。(就是根节点的一个值,合并过程中,对比两棵树怎么合,要看这个值的大小,这就是下图圈里的数字)

Priority Vector优先级向量。可以比喻为实力 (值越小越牛)。实力是啥?就是一组 ID 数目,[Root Bridge ID, Root Path Cost, Bridge ID, and Port ID]。为什么这样设计呢?这是因为要看怎么来比实力。先看 Root Bridge ID。拿出老大的 ID 看看,发现掌门一样,那就是师兄弟;再比 Root Path Cost,也即我距离我的老大的距离,也就是拿和掌门关系比,看同一个门派内谁和老大关系铁;最后比 Bridge ID,比我自己的 ID,拿自己的本事比。(Port ID是啥?没说清楚。。和BPDU的关系是什么?其实不用管这么多,这就是下图中的线上的数字。)

用一个实例说明STP的过程

一开始,这个状态。每个都是一个独立的树。
圈里的数字表示优先级(优先级是网络管理员分配的,性能好的交换机会被分配比较高的优先级,即数字较小。这里的优先级是上面的BPDU)。
而圈和圈之间的连线上的数字,是指Root Path Cost。
在这里插入图片描述

如5和6“碰见”(即有数据包交流?)了,6会成了5的子节点。同理,1/7、2/8、3/7也形成了树。黑粗的线相连的表示同一棵树。如下图所示:
在这里插入图片描述
他们不断“碰见”,接着合并。下面看一下几种情况。

情形一:根遇到根

当 5 碰到了 1,1的优先级1比5的优先级5小,1更优先,于是树5合入树1,树5成了树1的子树。如下图所示:
在这里插入图片描述

情形二:同一树中的节点相遇
根和子孙节点相遇

上图中,1和6相遇,即尝试连上中间线2,因为2<1+4(即6直接找到1,比6经5再由5到1,要快),所以断开6和5之间的连线,6直接连向1。

子孙节和子孙节点相遇

而5发现,自己直接到1cost为4,如果5到6,再由6到1,cost为1+2=3,所以,断开5和1之间的连线,连上5到6和连线。

如下图所示:
在这里插入图片描述

情形三:根节点和其它树的子孙节点相遇

小弟拿本帮掌门和这个掌门比较,赢了,这个掌门拜入门来。输了,会拜入新掌门,并且逐渐拉拢和自己连接的兄弟,一起弃暗投明。

2 和 7 相遇,虽然 7 是小弟,2 是掌门。就个人武功而言,2 比 7 强,但是 7 的掌门是 1,比 2 牛,所以没办法,2 要拜入 7 的门派,并且连同自己的小弟都一起拜入。
如下图:
在这里插入图片描述

情形四:不同树的子孙节点相遇

各自拿掌门比较,输了的拜入赢的门派,并且逐渐将与自己连接的兄弟弃暗投明。

例如,5 和 4 相遇。虽然 4 的武功好于 5,但是 5 的掌门是 1,比 4 牛,于是 4 拜入 5 的门派。后来当 3 和 4 相遇的时候,3 发现 4 已经叛变了,4 说我现在老大是 1,比你牛,要不你也来吧,于是 3 也拜入 1。
如下图:
在这里插入图片描述
最终,生成一棵树。

如何解决广播问题和安全问题?

广播问题

毕竟机器多了,交换机也多了,就算交换机比 Hub 智能一些,但是还是难免有广播的问题,一大波机器,相关的部门、不相关的部门,广播一大堆,性能就下来了。就像一家公司,创业的时候,一二十个人,坐在一个会议室,有事情大家讨论一下,非常方便。但是如果变成了 50 个人,全在一个会议室里面吵吵,就会乱的不得了。

保密问题

你们公司有不同的部门,有的部门需要保密的,比如人事部门,肯定要讨论升职加薪的事儿。由于在同一个广播域里面,很多包都会在一个局域网里面飘啊飘,碰到了一个会抓包的程序员,就能抓到这些包,如果没有加密,就能看到这些敏感信息了。还是上面的例子,50 个人在一个会议室里面七嘴八舌的讨论,其中有两个 HR,那他们讨论的问题,肯定被其他人偷偷听走了。

解决方法是隔离。

物理隔离

就是每个部门有单独的交换机,配置单独的子网,这样部门之间的沟通就需要路由器了。路由器咱们还没讲到,以后再说。
这样的问题在于,有的部门人多,有的部门人少。人少的部门慢慢人会变多,人多的部门也可能人越变越少。如果每个部门有单独的交换机,口多了浪费,少了又不够用。

虚拟隔离(VLAN,虚拟局域网)

虚拟隔离,即使用VLAN(Virtual Local Area Network,“虚拟局域网”)。
使用 VLAN,一个交换机上会连属于多个局域网的机器,那交换机怎么区分哪个机器属于哪个局域网呢?看下图,二层头加个Tag(在源MAC和类型之间加),来实现这个区分。
在这里插入图片描述
我们只需要在原来的二层的头上加一个 TAG,里面有一个 VLAN ID,一共 12 位。为什么是 12 位呢?因为 12 位可以划分 4096 个 VLAN。这样是不是还不够啊。现在的情况证明,目前云计算厂商里面绝对不止 4096 个用户。当然每个用户需要一个 VLAN 了啊,怎么办呢,这个我们在后面的章节再说。
当这个交换机把二层的头取下来的时候,就能够识别这个 VLAN ID。这样只有相同 VLAN 的包,才会互相转发,不同 VLAN 的包,是看不到的。这样广播问题和安全问题就都能够解决了。

如下图,VLAN1有机器1和机器3和机器8,他们属于同一个虚拟局域网。注意,机器1和机器 8连的是交换机A,机器3连的是交换机B。
在这里插入图片描述
那么交换机A\B之间怎么连接呢?将两个交换机连接起来的口应该设置成什么 VLAN 呢?对于支持 VLAN 的交换机,有一种口叫作Trunk 口。它可以转发属于任何 VLAN 的口。交换机之间可以通过这种口相互连接。

3:ICMP与ping:投石问路的侦察兵

ICMP 协议的格式

ping 是基于 ICMP 协议工作的。ICMP全称Internet Control Message Protocol,就是互联网控制报文协议。

ICMP 报文是封装在 IP 包里面的。因为传输指令的时候,肯定需要源IP地址和目标IP地址。它本身非常简单。如下图:
在这里插入图片描述
ICMP 报文有很多的类型,最常用的类型是主动请求的类型为 8,主动请求的应答的类型为 0。

查询报文类型

这里说的ICMP 的查询报文类型,如,常用的ping 就是查询报文,是一种主动请求,并且获得主动应答的 ICMP 协议。所以,ping 发的包也是符合 ICMP 协议格式的,只不过它在后面增加了自己的格式。
对 ping 的主动请求,称为ICMP REQUEST。主动请求的回复,称为ICMP ECHO REPLY。比起原生的 ICMP,这里面多了两个字段,一个是标识符。这个很好理解,你派出去两队侦查兵,一队是侦查战况的,一队是去查找水源的,要有个标识才能区分。另一个是序号,你派出去的侦查兵,都要编个号。如果派出去 10 个,回来 10 个,就说明前方战况不错;如果派出去 10 个,回来 2 个,说明情况可能不妙(标识符究竟是在标识啥?有水友说,在ping中,这个标识符就是进程ID)。

差错报文类型

差错报文类型有以下几种:终点不可达的类型为 3,源抑制的类型为 4,超时的类型为 11,重定向的类型为 5。

第一种:终点不可达

终点不可达的原因有多种,原因代码如下:

  1. 网络不可达代码为 0,
  2. 主机不可达代码为 1,
  3. 协议不可达代码为 2,
  4. 端口不可达代码为 3,
  5. 需要进行分片但设置了不分片位代码为 4。
第二种:源站抑制

也就是让源站放慢发送速度。我的理解是,目标站点觉得源站发的ICMP太多太猛了,目标站点不理源站了,直接返回错误(目标站点:源站是不是在攻击我啊?!)。

第三种:超时

这个很好理解。

第四种:重定向

也就是让下次发给另一个路由器。我的理解是,目标站返回了一个信息,说不要ping我了,ping它吧。

差错报文的结构相对复杂一些。除了前面还是 IP,ICMP 的前 8 字节不变,后面则跟上出错的那个 IP 包的 IP 头和 IP 正文的前 8 个字节。(看上面的图)

ping:查询报文类型的使用

重点来看 ping 的发送和接收过程,如下图:
在这里插入图片描述
假定主机 A 的 IP 地址是 192.168.1.1,主机 B 的 IP 地址是 192.168.1.2,它们都在同一个子网。那当你在主机 A 上运行“ping 192.168.1.2”后,会发生什么呢?

ping 命令执行的时候,源主机首先会构建一个 ICMP 请求数据包,ICMP 数据包内包含多个字段。最重要的是两个,第一个是类型字段,对于请求数据包而言该字段为 8;另外一个是顺序号,主要用于区分连续 ping 的时候发出的多个数据包。每发出一个请求数据包,顺序号会自动加 1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间。

然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址,加上一些其他控制信息,构建一个 IP 数据包。

接下来,需要加入 MAC 头。如果在本节 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用;如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建一个数据帧,目的地址是 IP 层传过来的 MAC 地址,源地址则是本机的 MAC 地址;还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。

主机 B 会构建一个 ICMP 应答包,应答数据包的类型字段为 0,顺序号为接收到的请求数据包中的顺序号,然后再发送出去给主机 A。

在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 应答包,则说明目标主机可达。此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

当然这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。但是对于 ICMP 的头来讲,是没什么影响的。会影响的是根据目标 IP 地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换 MAC 头里面的 MAC 地址。这个过程后面几节会详细描述,这里暂时不多说。
【关键结合图看,看包头是怎么一层一层加上去(IP头/MAC头)然后放出,又是怎么接收之后一层一层被剥去头,把内容解释出来的】

Traceroute:差错报文类型的使用

(Trace route 跟踪 线路?)
Traceroute会使用 ICMP 的规则,故意制造一些能够产生错误的场景。

Traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器

TTL(Time To Live是生存时间的意思,就是说这个ping的数据包能在网络上存在多少时间。)
Traceroute 的参数指向某个目的 IP 地址,它会发送一个 UDP 的数据包。将 TTL 设置成 1,也就是说一旦遇到一个路由器或者一个关卡,就表示它“牺牲”了。

如果中间的路由器不止一个,当然碰到第一个就“牺牲”。于是,返回一个 ICMP 包,也就是网络差错包,类型是时间超时。那大军前行就带一顿饭,试一试走多远会被饿死,然后找个哨探回来报告,那我就知道大军只带一顿饭能走多远了。

接下来,将 TTL 设置为 2。第一关过了,第二关就“牺牲”了,那我就知道第二关有多远。如此反复,直到到达目的主机。这样,Traceroute 就拿到了所有的路由器 IP。当然,有的路由器压根不会回这个 ICMP。这也是 Traceroute 一个公网的地址,看不到中间路由的原因。

怎么知道UDP 有没有到达目的主机呢

Traceroute 程序会发送一份 UDP 数据报给目的主机,但它会选择一个不可能的值作为 UDP 端口号(大于 30000)。当该数据报到达时,将使目的主机的 UDP 模块产生一份“端口不可达”错误 ICMP 报文。如果数据报没有到达,则可能是超时。

Traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU

(MTU即Maximum Transmission Unit 最大传输单元。它是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。)

要做的工作首先是发送分组,并设置“不分片”标志。发送的第一个分组的长度正好与出口 MTU 相等。如果中间遇到窄的关口会被卡住,会发送 ICMP 网络差错包,类型为“需要进行分片但设置了不分片位”。其实,这是人家故意的好吧,每次收到 ICMP“不能分片”差错时就减小分组的长度,直到到达目标主机。

4:世界这么大,我想出网关:欧洲十国游与玄奘西行

经过路由器之后 MAC 头要变,
如果 IP 不变,相当于不换护照的欧洲旅游,
如果 IP 变了,相当于要换护照的玄奘西行。

怎么在宿舍上网外?

校园网的 IP 地址,假设是 10.10.x.x
宿舍网的 IP 地址多为 192.168.1.x

路由器!
1、软路由
2、家庭路由器:家庭路由器会有内网网口和外网网口。把外网网口的线插到校园网的网口上,将这个外网网口配置成和网管部的一样。内网网口连上你们宿舍的所有的电脑。这种情况下,如果你们宿舍的人要上网,就需要一直开着路由器。

你了解 MAC 头和 IP 头的细节吗?

一旦配置了 IP 地址和网关,往往就能够指定目标地址进行访问了。由于在跨网关访问的时候,牵扯到 MAC 地址和 IP 地址的变化,这里有必要详细描述一下 MAC 头和 IP 头的细节。MAC 头和 IP 头如下图:
在这里插入图片描述
在 MAC 头里面,
先是目标 MAC 地址
然后是源 MAC 地址
然后有一个协议类型,用来说明里面是 IP 协议
IP 头里面的版本号,目前主流的还是 IPv4
服务类型 TOS 在第三节讲 ip addr 命令的时候讲过,
TTL 在第 7 节讲 ICMP 协议的时候讲过。
另外,还有 8 位标识协议。这里到了下一层的协议,也就是,是 TCP 还是 UDP
最重要的就是源 IP 和目标 IP。先是源 IP 地址,然后是目标 IP 地址。

在任何一台机器上,当要访问另一个 IP 地址的时候,都会先判断,这个目标 IP 地址,和当前机器的 IP 地址,是否在同一个网段。怎么判断同一个网段呢?需要 CIDR 和子网掩码,这个在第三节的时候也讲过了。

如果是同一个网段,例如,你访问你旁边的兄弟的电脑,那就没网关什么事情,直接将源地址和目标地址放入 IP 头中,然后通过 ARP 获得 MAC 地址,将源 MAC 和目的 MAC 放入 MAC 头中,发出去就可以了。

如果不是同一网段,例如,你要访问你们校园网里面的 BBS,该怎么办?这就需要发往默认网关 Gateway。Gateway 的地址一定是和源 IP 地址是一个网段的。往往不是第一个,就是第二个。例如 192.168.1.0/24 这个网段,Gateway 往往会是 192.168.1.1/24 或者 192.168.1.2/24。

如何发往默认网关呢?网关不是和源 IP 地址是一个网段的么?这个过程就和发往同一个网段的其他机器是一样的:将源地址和目标 IP 地址放入 IP 头中,通过 ARP 获得网关的 MAC 地址,将源 MAC 和网关的 MAC 放入 MAC 头中,发送出去。网关所在的端口,例如 192.168.1.1/24 将网络包收进来,然后接下来怎么做,就完全看网关的了。

网关往往是一个路由器,是一个三层转发的设备。啥叫三层设备?前面也说过了,就是把 MAC 头和 IP 头都取下来,然后根据里面的内容,看看接下来把包往哪里转发的设备。

很多情况下,人们把网关就叫作路由器。其实不完全准确,而另一种比喻更加恰当:路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址相同的网段,每只手都是它握住的那个局域网的网关

路由算法

任何一个想发往其他局域网的包,都会到达其中一只手,被拿进来,拿下 MAC 头和 IP 头,看看,根据自己的路由算法,选择另一只手,加上 IP 头和 MAC 头,然后扔出去。

这个时候,问题来了,该选择哪一只手?IP 头和 MAC 头加什么内容,哪些变、哪些不变呢?这个问题比较复杂,大致可以分为两类,一个是静态路由,一个是动态路由。动态路由下一节我们详细地讲。这一节我们先说静态路由。

静态路由

静态路由,其实就是在路由器上,配置一条一条规则。
这些规则包括:想访问 BBS 站(它肯定有个网段),从 2 号口出去,下一跳是 IP2;想访问教学视频站(它也有个自己的网段),从 3 号口出去,下一跳是 IP3,然后保存在路由器里。
每当要选择从哪只手抛出去的时候,就一条一条的匹配规则,找到符合的规则,就按规则中设置的那样,从某个口抛出去,找下一跳 IPX。

动态路由(路由协议:西出网关无故人,敢问路在何方)

静态路由下,IP 头和 MAC 头哪些变、哪些不变?

对于 IP 头和 MAC 头哪些变、哪些不变的问题,可以分两种类型。我把它们称为“欧洲十国游”型和“玄奘西行”型。

之前我说过,MAC 地址是一个局域网内才有效的地址。因而,MAC 地址只要过网关,就必定会改变,因为已经换了局域网两者主要的区别在于 IP 地址是否改变
不改变 IP 地址的网关,我们称为转发网关
改变 IP 地址的网关,我们称为NAT 网关(网络地址转换(Network Address Translation)简称为NAT)

“欧洲十国游”型-转发网关

在这里插入图片描述
通过这个过程可以看出,每到一个新的局域网,MAC 都是要变的但是 IP 地址都不变。在 IP 头里面,不会保存任何网关的 IP 地址。所谓的下一跳是,某个 IP 要将这个 IP 地址转换为 MAC 放入 MAC 头。

之所以将这种模式比喻称为欧洲十国游,是因为在整个过程中,IP 头里面的地址都是不变的。IP 地址在三个局域网都可见,在三个局域网之间的网段都不会冲突。在三个网段之间传输包,IP 头不改变。这就像在欧洲各国之间旅游,一个签证就能搞定。

“玄奘西行”型-NAT 网关

在这里插入图片描述
从服务器 B 接收的包可以看出,源 IP 为服务器 A 的国际身份,因而发送返回包的时候,也发给这个国际身份,由路由器 A 做 NAT,转换为国内身份。

从这个过程可以看出,IP 地址也会变。这个过程用英文说就是Network Address Translation,简称NAT。

其实这第二种方式我们经常见,现在大家每家都有家用路由器,家里的网段都是 192.168.1.x,所以你肯定访问不了你邻居家的这个私网的 IP 地址的。所以,当我们家里的包发出去的时候,都被家用路由器 NAT 成为了运营商的地址了。

很多办公室访问外网的时候,也是被 NAT 过的,因为不可能办公室里面的 IP 也是公网可见的,公网地址实在是太贵了,所以一般就是整个办公室共用一个到两个出口 IP 地址。你可以通过 https://www.whatismyip.com/ 查看自己的出口 IP 地址。

5: 路由协议:西出网关无故人,敢问路在何方

如何配置静态路由?

。当一个入口的网络包送到路由器时,它会根据一个本地的转发信息库,来决定如何正确地转发流量。这个转发信息库通常被称为路由表。

一张路由表中会有多条路由规则。每一条规则至少包含这三项信息。

  1. 目的网络:这个包想去哪儿?
  2. 出口设备:将包从哪个口扔出去?
  3. 下一跳网关:下一个路由器的地址是?

通过 route 命令和 ip route 命令都可以进行查询或者配置。
例如,我们设置 ip route add 10.176.48.0/20 via 10.173.32.1 dev eth0,就说

  1. 目的网络:这个包想去哪儿?要去 10.176.48.0/20 这个目标网络
  2. 出口设备:将包从哪个口扔出去?要从 eth0 端口出去
  3. 下一跳网关:下一个路由器的地址是? 10.173.32.1

上一节的例子(静态路由)中,网关上的路由策略就是按照这三项配置信息进行配置的。这种配置方式的一个核心思想是:根据目的 IP 地址来配置路由

如何配置策略路由?

当然,在真实的复杂的网络环境中,除了可以根据目的 ip 地址配置路由外,还可以根据多个参数来配置路由,这就称为策略路由

可以配置多个路由表,可以根据源 IP 地址、入口设备、TOS 等选择路由表,然后在路由表中查找路由。这样可以使得来自不同来源的包走不同的路由。

可以通过一顿猛如虎的操作,配置指定的策略路由,控制路由器连哪个网。
原文举了个例,如下图,让租户A只能访问慢速网络。具体配置方法略。
在这里插入图片描述
上面说的都是静态的路由( IP 地址来配置路由和策略路由),一般来说网络环境简单的时候,在自己的可控范围之内,自己捣鼓还是可以的。但是有时候网络环境复杂并且多变,如果总是用静态路由,一旦网络结构发生变化,让网络管理员手工修改路由太复杂了,因而需要动态路由算法。

动态路由算法

使用动态路由路由器,可以根据路由协议算法生成动态路由表,随网络运行状况的变化而变化。
动态路由算法其实是图论里的求最短路径的算法。常用的有两种方法,一种是 Bellman-Ford 算法,一种是 Dijkstra 算法。在计算机网络中基本也是用这两种方法计算的。

距离矢量路由算法

第一大类的算法称为距离矢量路由(distance vector routing)。它是基于 Bellman-Ford 算法的

这种算法的基本思路是,每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是要到目标路由器,从那条线出去,另一个是到目标路由器的距离

由此可以看出,每个路由器都是知道全局信息的。那这个信息如何更新呢?每个路由器都知道自己和邻居之间的距离,每过几秒,每个路由器都将自己所知的到达所有的路由器的距离告知邻居,每个路由器也能从邻居那里得到相似的信息。

每个路由器根据新收集的信息,计算和其他路由器的距离,比如自己的一个邻居距离目标路由器的距离是 M,而自己距离邻居是 x,则自己距离目标路由器是 x+M。

这个算法比较简单,但是还是有问题。

**第一个问题就是好消息传得快,坏消息传得慢。**如果有个路由器加入了这个网络,它的邻居就能很快发现它,然后将消息广播出去。要不了多久,整个网络就都知道了。但是一旦一个路由器挂了,挂的消息是没有广播的。当每个路由器发现原来的道路到不了这个路由器的时候,感觉不到它已经挂了,而是试图通过其他的路径访问,直到试过了所有的路径,才发现这个路由器是真的挂了。

我再举个例子。
在这里插入图片描述
原来的网络包括两个节点,B 和 C。A 加入了网络,它的邻居 B 很快就发现 A 启动起来了。于是它将自己和 A 的距离设为 1,同样 C 也发现 A 起来了,将自己和 A 的距离设置为 2。但是如果 A 挂掉,情况就不妙了。B 本来和 A 是邻居,发现连不上 A 了,但是 C 还是能够连上,只不过距离远了点,是 2,于是将自己的距离设置为 3。殊不知 C 的距离 2 其实是基于原来自己的距离为 1 计算出来的。C 发现自己也连不上 A,并且发现 B 设置为 3,于是自己改成距离 4。依次类推,数越来越大,直到超过一个阈值,我们才能判定 A 真的挂了。

这个道理有点像有人走丢了。当你突然发现找不到这个人了。于是你去学校问,是不是在他姨家呀?找到他姨家,他姨说,是不是在他舅舅家呀?他舅舅说,是不是在他姥姥家呀?他姥姥说,是不是在学校呀?总归要问一圈,或者是超过一定的时间,大家才会认为这个人的确走丢了。如果这个人其实只是去见了一个谁都不认识的网友去了,当这个人回来的时候,只要他随便见到其中的一个亲戚,这个亲戚就会拉着他到他的家长那里,说你赶紧回家,你妈都找你一天了。

**这种算法的第二个问题是,每次发送的时候,要发送整个全局路由表。**网络大了,谁也受不了,所以最早的路由协议 RIP 就是这个算法。它适用于小型网络(小于 15 跳)。当网络规模都小的时候,没有问题。现在一个数据中心内部路由器数目就很多,因而不适用了。

所以上面的两个问题,限制了距离矢量路由的网络规模。

链路状态路由算法

第二大类算法是链路状态路由(link state routing),它是基于基于 Dijkstra 算法的

这种算法的基本思路是:当一个路由器启动的时候,首先是发现邻居,向邻居 say hello,邻居都回复。然后计算和邻居的距离,发送一个 echo,要求马上返回,除以二就是距离。然后将自己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能够收到它和邻居之间的关系的信息。因而,每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用 Dijkstra 算法,找到两点之间的最短路径。

不像距离距离矢量路由协议那样,更新时发送整个路由表。链路状态路由协议只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了带宽和 CPU 利用率。而且一旦一个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。

动态路由协议

基于链路状态路由算法的 OSPF

OSPF(Open Shortest Path First,开放式最短路径优先)就是这样一个基于链路状态路由协议,广泛应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议(Interior Gateway Protocol,简称IGP)

内部网关协议的重点就是找到最短的路径。在一个组织内部,路径最短往往最优。当然有时候 OSPF 可以发现多个最短的路径,可以在这多个路径中进行负载均衡,这常常被称为等价路由
在这里插入图片描述
这一点非常重要。有了等价路由,到一个地方去可以有相同的两个路线,可以分摊流量,还可以当一条路不通的时候,走另外一条路。这个在后面我们讲数据中心的网络的时候,一般应用的接入层会有负载均衡 LVS。它可以和 OSPF 一起,实现高吞吐量的接入层设计。

有了内网的路由协议,在一个国家内,唐僧可以想怎么走怎么走了,两条路选一条也行。

基于距离矢量路由算法的 BGP

但是外网的路由协议,也即国家之间的,又有所不同。我们称为外网路由协议(Border Gateway Protocol,简称BGP)

在一个国家内部,有路当然选近的走。但是国家之间,不光远近的问题,还有政策的问题。例如,唐僧去西天取经,有的路近。但是路过的国家看不惯僧人,见了僧人就抓。例如灭法国,连光头都要抓。这样的情况即便路近,也最好绕远点走。

对于网络包同样,每个数据中心都设置自己的 Policy。例如,哪些外部的 IP 可以让内部知晓,哪些内部的 IP 可以让外部知晓,哪些可以通过,哪些不能通过。这就好比,虽然从我家里到目的地最近,但是不能谁都能从我家走啊!

在网络世界,这一个个国家成为自治系统AS(Autonomous System)。自治系统分几种类型。

  1. Stub AS:对外只有一个连接。这类 AS 不会传输其他 AS 的包。例如,个人或者小公司的网络。
  2. Multihomed AS:可能有多个连接连到其他的 AS,但是大多拒绝帮其他的 AS 传输包。例如一些大公司的网络。
  3. Transit AS:有多个连接连到其他的 AS,并且可以帮助其他的 AS 传输包。例如主干网。

每个自治系统都有边界路由器,通过它和外面的世界建立联系。
在这里插入图片描述
BGP 又分为两类,eBGP 和 iBGP。自治系统间,边界路由器之间使用 eBGP 广播路由。内部网络也需要访问其他的自治系统。边界路由器如何将 BGP 学习到的路由导入到内部网络呢?就是通过运行 iBGP,使得内部的路由器能够找到到达外网目的地的最好的边界路由器。

BGP 协议使用的算法是路径矢量路由协议(path-vector protocol)。它是距离矢量路由协议的升级版。

前面说了距离矢量路由协议的缺点。其中一个是收敛慢。在 BGP 里面,除了下一跳 hop 之外,还包括了自治系统 AS 的路径,从而可以避免坏消息传的慢的问题,也即上面所描述的,B 知道 C 原来能够到达 A,是因为通过自己,一旦自己都到达不了 A 了,就不用假设 C 还能到达 A 了。

另外,在路径中将一个自治系统看成一个整体,不区分自治系统内部的路由器,这样自治系统的数目是非常有限的。就像大家都能记住出去玩,从中国出发先到韩国然后到日本,只要不计算细到具体哪一站,就算是发送全局信息,也是没有问题的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值