前面例子中,咱们都是在一个局域网内折腾。今天就让咱们扩大范围,在多个局域网甚至到广阔的互联网世界中遨游,看看这中间会发生什么。html
这个过程当中,跨网关访问是咱们要了解的第一个内容。算法
当咱们要了解跨网关访问时,就牵扯到 MAC 地址和 IP 地址的变化,所以,咱们先来看下 MAC 头和 IP 头的细节。服务器
如图,在 MAC 头里,先是目标 MAC 地址,而后是源 MAC 地址,最后是协议类型。网络
在 IP 头里,最重要的就是源 IP 地址和目标 IP 地址。除此以外,还有版本号,也就是咱们常说的 IPv4 和 IPv六、服务类型 TOS(表示数据包优先级)、TTL(数据包生存周期)以及标识协议(TCP 和 UDP)负载均衡
当咱们访问博客园时,通过的第一个网关应该就是咱们配置的默认网关。当本机访问默认网关时,仍是走局域网内部访问的步骤:cdn
而咱们的网关,通常就是指家里的路由器,是一个三层转发的设备。它会把 MAC 头和 IP 头都取下来,而后根据里面的内容,看看接下来把数据包转发到哪里。htm
不少状况下,人们把网关叫作路由器。其实并不许备,用这个比喻应该更为恰当些:blog
路由器是一台设备,它有五个网口或者网卡,至关于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址有着相同的网段,每只手都是它握住的那个局域网的网关。路由
任何一个想发往其余局域网的包,都会到达其中一只手,被拿进来,拿下 MAC 头和 IP 头,而后根据本身的路由算法,选择另外一只手,加上 IP 头和 MAC 头,而后扔出去。get
注意,在上面这个过程当中,有出现路由算法。接下来,咱们就来认识下它。
路由算法,又名选路算法,是提升路由协议功能,尽可能减小路由时所带来的开销的算法。
路由算法能够根据多个特性来加以区分,找到到达目的地的最佳路由。
路由算法的区分点有不少,有
这里主要介绍静态与动态路由算法。
静态路由算法,实质上是由网关配置好的映射表。
咱们家里的路由器,可能会有这样的路由配置
访问博客园,从 2 号口出去,下一跳是 IP2; 访问百度,从 3 号口出去,下一跳是 IP3。
相似上述这样的规则就是静态路由,按照必定的语法保存在路由器里。
每当要选择从哪一个口抛出去的时候,就一条一条的匹配规则,找到符合的规则,就按规则办事,从指定口抛出去,找下一跳 IP。
以前咱们了解到,MAC 地址是一个局域网内才有效的地址。所以,MAC 地址只要过网关,就确定会改变。而 IP 地址在过网关后 ,就不必定会改变了。
通过网关 A 后,若是IP 地址没有改变,那 A 就是转发网关,不然,就是NAT网关。
如上图,服务器 A 要访问服务器 B,要通过过程:
1)服务器 A 到 网关 A
而最后发送包的内容主要有:
数据包到达 192.168.1.1 这个网口后,网口发现 MAC 地址是它的,就将包收进来,而后开始“思考”往哪里转发。
这时候,路由器 A 中配置了规则 A1:
要访问 192.168.4.0/24,就从 192.168.56.1 这个网口出去,下一跳是 192.168.56.2
2)网关 A 到 网关 B
因而,路由器 A 匹配了 A1,要从 192.168.56.1 这个口发出去,发给 192.168.56.2。因而,又开始了这个过程:
数据包的内容是:
数据包到达 192 .168.56.2 网口,网口发现 MAC 地址是它的,就将包收进来,而后去检查路由规则。
路由器 B 配置如下规则 B1:
想访问 192.168.4.0/24,就从 192.168.4.1
而路由器 B 发现,它的右网口就是目标地址网段的,所以就没有下一跳了。
3)网关 B 到 服务器 B
路由器 B 匹配上 B1。从 192.168.4.1 出口,发给 192.168.4.101。数据包内容:
服务器 B 收到数据包,发现 MAC 地址是它的,就把包收进来。
经过上面的过程能够看出,每到一个新的局域网, MAC 地址都是要变的,而 IP 地址则都不变。在 IP 头里面,不会保存任何网关的 IP 地址。
而咱们说的下一跳,就是某个 IP 要将这个 IP 地址转换为 MAC 放入 MAC 头。
NAT 网关,也就是 Network Address Translation。
因为各个局域网都有各自的网段,很容易出现 IP 冲突的状况。如上图,美国服务器 A 的 IP 地址和 法国服务器 B 的 IP 地址都是 192.168.1.101/24,从 IP 上看,好像是本身访问本身,但实际上从美国的 192.168.1.101 访问法国的 192.168.1.101。
如何解决这个问题呢?既然局域网之间没有商量好 IP 分配,各管各的,那到国际上,也就是中间的局域网里面,就须要使用另外的地址,就像出国后,咱们要改用护照同样。
首先,目标服务器 B 在国际上要有一个国际的身份,咱们给它一个 190.168.56.2.在网关 B 上,咱们记下来,国际身份 192.168.56.2 对应国内身份 192.168.1.101.凡是要访问 192.168.56.2 的,网关都要转成 192.168.1.101。
因而,源服务器 A 要访问目标服务器 B,目标地址就变成国际 IP 地址 192.168.56.2。过程以下:
1)源服务器 A 发数据包到网关 A
数据包的内容是这样的:
路由器 A 中 192.168.1.1 这个网口收到数据包后,检查 MAC 地址一致,将包收进来。
在路由器 A 中配置了规则:
想访问 192.168.56.2/24,就从 192.168.56.1 网口发出去,发给 192.168.56.2,没有下一跳。
因为路由器的右网口(192.168.56.1) IP 地址和目标 IP 地址在同一网段,所以没有下一跳。
2)网关 A 到网关 B 当网络包发送到中间的局域网时,服务器 A 也须要有个国际身份。所以,源 IP 地址 192.168.1.101 要改为 192.168.56.1,因此数据包的内容是:
包到达 192.168.56.2 这个网口后,发现 MAC 一致,就将包收进来。
而路由器 B 是 NAT 网关,它上面配置了,国际身份 192.168.56.2 对应国内的 192.168.1.101,因而目标地址改成 192.168.1.101。
一样的,路由器 B 中配置了规则:
想访问 192.168.1.101,就从 192.168.1.1 网口出去,没有下一跳。
因而,数据包就从 192.168.1.1 这个网口发给 192.168.1.101。
3)网关 B 到服务器 B 数据包从 192.168.1.1 网口发出后,一样通过这些步骤:
这时的数据包就变成了:
服务器收到包后,检查 MAC 地址一致,就将数据包收进来。
从服务器 B 接收的数据包能够看出,源 IP 为 服务器 A 的国际身份,于是发送返回包的时候,也发给这个国际身份,由路由器 A 作 NAT,转换为国内身份。
1)基本思路
基于Bellman-Ford 算法。每一个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是要到目标路由器,从哪条线出去,另外一个是到目标路由器的距离
2)存在问题
a. 好消息传得块,坏消息传的慢。
新加入的路由器可以很快的新路由器信息广播出去。可是若是一个路由器挂了,挂的消息没有广播。每一个通过这个宕机节点的路由器,没法得知该节点一宕机,而是试图经过其余的路径访问,直到试过了全部的路径,才发现这个路由器已经宕机了。
示例:
b. 每次发送消息,要发送整个全局路由表
上面的两个问题,限制了***距离矢量路由***的网络规模,仅适用于小型网络(小于 15 跳)。
1)基本思路
基于Dijkstra 算法。当一个路由器加入网络是,首先是发现邻居,给邻居说 hello,邻居都回复。而后计算和邻居的距离,发送一个 echo,要求立刻返回,除以 2 就是距离。接着将本身和邻居之间的链路状态包广播出去,发送到整个网络的每一个路由器。
这种算法中,每一个路由器都能在本身本地构建一个完整的图,而后针对这个图使用 Dijkstra 算法,找到两点之间的最短路径。
不像距离矢量路由协议那样,更新时发送整个路由表。链路状态路由协议只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了宽带和 CPU 利用率。并且一旦一个路由器挂了,它的邻居都会广播这个消息,可使得坏消息迅速收敛。
OSPF(Open Shortest Path First, 开放式最短路径优先)协议,普遍应用在***数据中心***的协议。因为主要用在数据中心内部,用于路由决策,所以称为***内部网关协议(Interior Gateway Protocol,简称 IGP)***
内部网关协议的重点就是***找到最短路径***。当存在多个最短路径时,能够在这多个路径中进行负载均衡,这经常被称为***等价路由***。
等价路由不只能够用来分摊流量,还能够提升容错率,当一条路径不通时,还能够经过另一条路到达目的地。
针对网络之间的路由协议,称为***外网路由协议(Border Gateway Protocol,简称 BGP)***
每一个数据中心都有本身的路由配置。例如,哪些外部 IP 可让内部知晓,哪些内部 IP 可让外部知晓,哪些能够经过,哪些不能经过。
所以,在各个数据中心进行交互时,须要一种协议,经过这种协议,能够知道相邻数据中心的路由配置,从而找到数据中心之间最好的路由。
BGP 协议就是这样的协议。它不着眼于发现和计算路由,而在于控制路由的传播和选择最好的路由。