Jiang's blog

《趣谈网络协议》学习笔记之--从二层到三层(下)

Word count: 3.6kReading time: 12 min
2020/03/16 Share

学习自极客时间《趣谈网络协议》 作者:刘超

4. 网关的实现

4.1 怎么样在宿舍上网

有两种方式:

  • 有一台电脑需要两张网卡,一张网卡的线插到交换机上,另一张网卡的线插到校园网的网口。而且,这张新的网卡的 IP 地址要按照学校网管部门分配的配置,不然上不了网。这种情况下,如果你们宿舍的人要上网,就需要一直开着那台电脑。

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

其实家庭路由器和电脑的功能一样,只不过是嵌入式系统而已。

其他电脑要上网还需要配置网卡。当然 DHCP 是可以默认配置的。在进行网卡配置的时候,除了 IP 地址,还需要配置一个Gateway 的东西,这个就是网关。

4.2 MAC 头和 IP 头的细节

885poF.jpg

  • 在 MAC 头里面,先是目标 MAC 地址,然后是源 MAC 地址,然后有一个协议类型,用来说明里面是 IP 协议。
  • IP 头里面的版本号,目前主流的还是 IPv4,数据包是按照服务类型(Type of Service,TOS)被分配到三个波段(band)里面的。TOS 是 IP 头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的。TTL 指生存时间,与ICMP有关。
  • 另外,还有 8 位标识协议。这里到了下一层的协议,也就是,是 TCP 还是 UDP。最重要的就是源 IP 和目标 IP。先是源 IP 地址,然后是目标 IP 地址。在任何一台机器上,当要访问另一个 IP 地址的时候,都会先判断,这个目标 IP 地址,和当前机器的 IP 地址,是否在同一个网段。怎么判断同一个网段呢?需要 CIDR 和子网掩码。

如果是同一个网段,则直接通过ARP获取Mac地址,如果不同网段,就需要经过网关了。获取网关的Mac地址也是在局域网中吼,流程是一样的。

网关往往是一个路由器,是一个三层转发的设备。啥叫三层设备?就是把 MAC 头和 IP 头都取下来,然后根据里面的内容,看看接下来把包往哪里转发的设备。路由器是一台设备,它有多个网口或者网卡,分别连着多个局域网。每个网卡的 IP 地址都和局域网的 IP 地址相同的网段,就是那个局域网的网关。

4.3 静态路由

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

4.4 IP 头和 MAC 头哪些变、哪些不变?

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

  • 当各个局域网间网段有商量,即IP段没有冲突的时候,不同网段间用户的通讯,经过网关的时候,IP地址不会改变,改变的是Mac地址。

  • 当局域网之间没有商量过,各定各的网段,因而 IP 段冲突了。不同网段间用户的通讯,经过网关的时候,需要将当前局域网内的IP地址转换成国际通用的IP地址,当到了最后一跳时,NAT网关再将国际IP地址转换成私网的IP地址,最终达到接收方。这里Mac地址也在不断变化的。从这个过程可以看出,IP 地址也会变。这个过程用英文说就是 Network Address Translation,简称 NAT。

4.5 总结

  1. 如果离开本局域网,就需要经过网关,网关是路由器的一个网口;
  2. 路由器是一个三层设备,里面有如何寻找下一跳的规则;

当在你家里要访问 163 网站的时候,你的包需要 NAT 成为公网 IP,返回的包又要 NAT 成你的私有 IP,返回包怎么知道这是你的请求呢?它怎么就这么智能的 NAT 成了你的 IP 而非别人的 IP 呢?

NAT在进行地址替换时不仅仅包含IP地址,还有端口号。具体说来就是,我们在进行连接外网服务器请求的数据包中,除了源、目的IP地址外,还有源、目的端口号。其中目的端口号是固定的,比如21或80等等。但源端口号是随机生成的。当数据包到达进行NAT的设备时,除了私有IP地址会被替换成公网IP地址外,端口号也会被替换成NAT随机生成的端口号。NAT的端口号和局域网中的主机一一对应,同时NAT设备维护一张端口号和主机对应的表。当外网服务器返回数据到NAT设备时,NAT设备通过返回数据包中的端口号找到局域网中的主机并将数据转发。

5. 路由协议

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

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

5.1 动态路由算法

复杂的网络拓扑结构中,路由的路径就转化成为如何在途中找到最短路径的问题。
求最短路径常用的有两种方法,一种是 Bellman-Ford 算法,一种是 Dijkstra 算法。在计算机网络中基本也是用这两种方法计算的。

  1. 距离矢量路由算法
    • 第一大类的算法称为距离矢量路由(distance vector routing)。它是基于 Bellman-Ford 算法的。
    • 这种算法的基本思路是,每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行 包含两部分信息,一个是要到目标路由器,从那条线出去,另一个是到目标路由器的距离。
      由此可以看出,每个路由器都是知道全局信息的。那这个信息如何更新呢?每个路由器都知道自己和邻居之间的距离,每过几秒,每个路由器都将自己所知的到达所有的路由器的距离告知邻居,每个路由器也能从邻居那里得到相似的信息。每个路由器根据新收集的信息,计算和其他路由器的距离,比如自己的一个邻居距离目标路由器的距离是 M,而自己距离邻居是 x,则自己距离目标路由器是 x+M。
  • 距离矢量路由算法存在的问题:

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

    • 这种算法的第二个问题是,每次发送的时候,要发送整个全局路由表。

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

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

5.2 动态路由协议

  1. 基于链路状态路由算法的 OSPF
  • OSPF(Open Shortest Path First,开放式最短路径优先)就是这样一个基于链路状态路由协议,广泛应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议(Interior Gateway Protocol,简称 IGP)。
  • 内部网关协议的重点就是找到最短的路径。在一个组织内部,路径最短往往最优。当然有时候 OSPF 可以发现多个最短的路径,可以在这多个路径中进行负载均衡,这常常被称为等价路由。这一点非常重要。有了等价路由,到一个地方去可以有相同的两个路线,可以分摊流量,还可以当一条路不通的时候,走另外一条路。
  1. 基于距离矢量路由算法的 BGP
  • 但是外网的路由协议,也即国家之间的,又有所不同。我们称为外网路由协议(Border Gateway Protocol,简称 BGP)。

  • 对于网络包同样,每个数据中心都设置自己的 Policy。例如,哪些外部的 IP 可以让内部知晓,哪些内部的 IP 可以让外部知晓,哪些可以通过,哪些不能通过。

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

    • Stub AS:对外只有一个连接。这类 AS 不会传输其他 AS 的包。例如,个人或者小公司的网络。
    • Multihomed AS:可能有多个连接连到其他的 AS,但是大多拒绝帮其他的 AS 传输包。例如一些大公司的网络。
    • Transit AS:有多个连接连到其他的 AS,并且可以帮助其他的 AS 传输包。例如主干网。
  • BGP 又分为两类,eBGP 和 iBGP。自治系统间,边界路由器之间使用 eBGP 广播路由。内部网络也需要访问其他的自治系统。边界路由器如何将 BGP 学习到的路由导入到内部网络呢?就是通过运行 iBGP,使得内部的路由器能够找到到达外网目的地的最好的边界路由器。

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

  1. 路由信息协议(RIP)
  • 路由信息协议是在一个AS系统中使用地内部路由选择协议,是个非常简单的基于距离向量路由选择的协议。 它路由器生产商之间使用的第一个开放标准,是最广泛的路由协议,在所有IP路由平台上都可以得到。当使用RIP时,一台Cisco路由器可以与其他厂商的路由器连接。
  • 路由信息协议是内部网关协议IGP中最先得到使用的协议。RIP是一种分布式的基于距离矢量的路由选择协议,是因特网的标准协议,其最大优点就是实现简单,开销较小。

5.3 问题拓展

路由器之间信息的交换使用什么协议呢?

  1. OSPF基于IP协议,端口号为89
    原因:ospf自身提供主从协商机制,可以保证可靠的传输,另外全网路由器保持着同样的一个lsdb,当拓扑发生变化时,需要携带的变更信息较少,通过IP协议即可完成
  2. RIP协议采用UDP是因为,rip每周期需全网组播路由信息,路由信息数目较大,故使用UDP协议可提高效率
  3. BGP为边界网关协议,因携带的路由信息较多,且可能跨不同网络传送路由信息,为保证可靠性,需使用TCP协议,可兼顾容量和可靠性
CATALOG
  1. 1. 4. 网关的实现
    1. 1.1. 4.1 怎么样在宿舍上网
    2. 1.2. 4.2 MAC 头和 IP 头的细节
    3. 1.3. 4.3 静态路由
    4. 1.4. 4.4 IP 头和 MAC 头哪些变、哪些不变?
    5. 1.5. 4.5 总结
  2. 2. 5. 路由协议
    1. 2.1. 5.1 动态路由算法
    2. 2.2. 5.2 动态路由协议
    3. 2.3. 5.3 问题拓展