《计算机网络:自顶向下方法》Chapter4:网络层

摘要:本章主要介绍了路由器的结构、转发和编制、广域网中的路由算法以及差错检验和信息报告等。介绍的这所有内容都是为了实现一个功能:正确的转发一个分组,这是路由器最基本也是最核心的功能。
关键词:路由器;分组转发;DHCP;NAT;Dijkstra算法;距离向量算法;
目录
  1.路由器体系结构
  2.网络层的三个重要组件:01 IP协议
    2.1 报文格式和编址
    2.2 动态主机配置协议(DHCP)
    2.3 网络地址转换协议(NAT)
  3.网络层的三个重要组件:02 路由选择算法
    3.1 Dijkstra算法和距离向量算法简介
    3.2 自治系统内部的路由选择
    3.3 自治系统间的路由选择
  4.网络层的三个重要组件:03 因特网控制报文协议(ICMP)
  扩展:单播、广播、多播

1 路由器体系结构

路由器主要由两个部分组成:数据转发平面控制管理平面;其中数据转发平面主要负责分组的转发,控制管理平面则负责计算路由表以及其他的路由器管理工作。这两个平台实现了路由器的两个主要功能,其中数据转发平台由于其要求转发速度在纳秒级别,因此依赖于硬间实现,而控制管理平面的功能对时间性能没有那么高,因此由软件实现。控制管理平台是个软件平台,我们仅需要知道通过它来计算路由转发表即可。因此主要介绍数据转发平台的结构,看一下数据是怎么通过一台路由器的。

《计算机网络:自顶向下方法》Chapter4:网络层_第1张图片
路由器体系结构
数据转发平面由三部分构成:输入端口、输出端口、交换结构。一台路由器下可以有多个网络接口,每个接口下都是一个子网,有自己的ip地址。哪怕是家用路由器,他也有两个接口即两个ip地址。每个接口下都对应了一组端口,一个用于输入一个用于输出。路由器数据转发平台的目的就是将一个分组从输入端口转发到正确的输出端口。其过程可以简单的描述为:一个分组进入输入端口后开始排队,等待着出入端口的处理,当处理该分组时,路由器会检查它的目的地ip地址,然后对照由控制管理平台计算好的已经的路由转发表决定其输出端口。然后由交换结构来实现将分组从一个输入端口输送到指定的输出端口,然后排队被推向链路中。

因此一个路由器即可能在输入端外排队,也可能在输出端排队。你要记住一个重要的特点是,路由器由好几个ip地址。

2.网络层的三个重要组件01:IP协议

互联网是计算机与计算之间进行交流的桥梁,有了桥梁比如路由器和物理链路,双方还要约定如何交流,不能一个将英语一个将汉语,即使约定一个第三方语言,如果将英语双方就都得符合英语的语法规范,两边才能正常的交流或者说通信。协议就是这个,它就像英语的语法,规定了英语应该怎么讲。IP协议以及其他计算机协议都是如此,它是一个规范,规定了诸如数据报文的格式,它能提供的功能,确定他的运行机制应该是怎样的等方方面面,然后大家共同遵守,达成一致,相互之间通信的时候就知道对方说的是什么意思了。

IP协议本章主要介绍了IPv4和IPv6,并对其报文格式和编码方式做了简要的介绍

2.1 报文格式和编址方式

2.1.1 报文格式

《计算机网络:自顶向下方法》Chapter4:网络层_第2张图片

IPv4和IPv6最明显的区别就是其ip地址的位数不一样,ipv4是32位,ipv6是128位,主要不是64位,因此形象的说就是地球上的每个沙砾都可以用ipv6来寻址。当然ipv4和ipv6的区别远不止于此,你更应该感兴趣的是,一个用于ipv4的路由器能用于ipv6吗?为什么能或为什么不能?目前是如何使用ipv6的?在一个既有ipv4又有ipv6的网络中,如何使一个数据包经历不同版本的ip协议到达目的地?这些都能在课本中找到答案。

2.1.2 编址方式

由于目前ipv6应用还不算广泛,接触更多的还是ipv4。因此我们主要介绍ipv4的编码方式。ipv4的32位地址,每8位一段,用点分10进制表示,以便于我们使用,毕竟你配置的时候输32位01和输4个10进制的数,谁更复杂谁更容易出错,不用说也知道。这只是说ip地址的形式上是这样,具体的,你的机器分配到一个什么样的ip地址,由你所在的子网所决定。

以前编址的时候,把IP地址分成好几类,每一类都有就是一个大的子网,现在好像是采用无类别的编址方式,具体是不是我还不太确定。

下面我们看看你的ip地址如何确定的。

2.2 动态主机配置协议:DHCP

当你的一台新主机第一次接入网络的时候,你的主机什么都不知道,为了能和因特网连接,他需要获得ip地址,子网掩码,DNS等数据来初始化他的网络配置。这些数据他找谁要呢?就是找一个专门用来做这个事情的服务器要,该服务器叫DHCP服务器。那么他怎么找他要呢?他根本都不知道DHCP服务器的ip地址也不知道自己的ip地址,他会通过广播的方式,使用目的ip地址255.255.255.255,使用该目的ip地址时,链路层会对该数据进行广播。在广播的数据中,按照DHCP协议规定的报文格式,实现与DHCP服务器通信,DHCP收到广播后又会把配置信息通过广播送回去,因为目前你主机还没有ip地址,只能广播过来。当然具体过程可能稍微更复杂一点,但这种简单的描述有助于你理解主机请求网络配置的基本的过程。

2.3 网络地址转换协议:NAT

由于目前接入互联网的设备越来越多,为每个设备分配一个ip地址显然会使得ip地址不够用,于是就用局域网的概念来解决这个问题,局域网是子网的一个子集,在局域网中,局域网藏在一个路由器背后,关键在于不同的局域网络中的设备的ip地址可以是一样的,你家庭有个设备的地址是192.16.8.1.2,隔壁家可能有个设备和你家的这个设备的ip地址是一样的。局域网的ip地址只在局域网内有效,也就是局域网寻址用局域网的ip地址,广域网的寻址采用广域网的ip地址,你的设备往往分不到广域网的ip地址,尤其你处于一个机构或者家庭网络中,这种情况你设备的地址通常都是局域网地址。广域网通过路由选择算法来寻址,而局域网通过链路层MAC地址寻址。局域网内部的机器的通信在第五章链路层介绍。

局域网的设备要与外界通信就必须要经历广域网,而广域网寻址就必须要有个广域网的ip地址,可是你的设备并没有,尤其是两个局域网内的设备通信的是,他们都不具有广域网地址,那么怎么实现彼此时间的通信呢?

就是使用NAT协议,你的局域网的路由器是有对外接口的,也就是路由器是拥有一个广域网ip地址的。因此局域网对外网的所有请求都会被路由器根据NAT表修改ip头部信息。

你和别的主机通信时,会使用一个端口号,分组发到路由器时,会把该端口号映射到路由器上的一个端口号,然后用路由器上映射后的端口号和路由器的ip地址作为源ip地址将分组发送出去,目的主机发送响应时,以路由器的ip地址和端口号作为目的地址和端口号,当路由器收到该响应时,根据NAT表又把他映射回局域网ip和端口号,把分组发回局域网后就由链路层根据局域网ip寻址了。

实际上你可以看到,除非局域网的主机主动的向外界请求,路由器才会给你的这次请求动态的配置一个端口号并将映射关系添加到NAT表。然后得以与外界通信,如果外界要主动和你的应用程序通信呢?就是你作为服务器,别人要主动找你,就没法做。因为别人不知道该发给该路由器的哪个端口。因此为了别人能主动找你,你需要固定一个不变的长期在NAT表中的映射关系,也就是端口映射,或者叫NAT穿越。该功能有一个学名叫做UPnP,即通用即插即用。

这样如果你的设备和邻居家的设备的某个应用程序,都做了端口映射他们之间就可以通信了。实际上用UPnP实现NAT穿越来保证局域网之间的应用直接通信还是不方便的,更常用的做法是,使用代理。两个局域网的设备都先跟广域网中的代理建立连接,然后代理把这两个局域网中的设备分配到的动态端口号转告给双方,有了端口号和路由器ip地址,这两个设备就可以直接通信了。不知道微信视频聊天是不是这个机制。

3 网络层的三个重要组件02:路由选择算法

路由器最主要的高能就是转发分组,那么转发分组的时候在输入端需要一个张路由选择表,该表描述了每个子网对应的输出端口是多少,当一个分组过来,取出其目的ip地址然后根据最长匹配规则,匹配到对应的子网,然后给该分组分配输出端口。路由选择算法就是生成这张表的重要方法。

3.1 Dijkstra算法和距离向量算法简介

在学习路由选择算法之前,先要明白Dijkstra算法和距离向量算法,然后再理解这两种算法是怎么应用到路由选择中的。

对于一个图结构,他有节点和边,每个边都有距离,这两个算法做的事情,就是对于任何一个节点都能知道到其他任意一个目的节点的最短路径。这是数据结构图这部分都会接触到的基本算法。

Dijkstra:是一种全局的最短路径算法。该算法需要每个节点知道所有边的长度,还要知道节点之间的相连关系。也就是相当于要求每个节点上都有存储着一张图。

距离向量算法:是一种分布式的最短路径算法。他不要求每个节点对整个图有了解,他只需要和邻居节点通信就可以了。也就是每个节点都有一张初始路由表,然后,这张表开始和邻居交换,通过频繁的交换节点之间不停的修改这张表,使得最后收敛。

需要注意的是,在这两个图算法中,我们的目的地是节点,也就是每个节点得到一张表,第一列是其他所有的节点编号,第二列是从自己出发到该节点应该要经过一个邻居节点编号。而路由表有点儿细微的差别,我们的目的地这一列不是要去某台路由器,而是要去某个子网也就是某一条边。但不管目的地是节点还是边,这两种算法都可以计算出正确的结果,得到想要的转发表

3.2 自治系统内部的路由选择

不管是前述的路由选择算法的哪一种,直接应用到当前的计算机网络中,都是不现实的。世界上这么多台路由器,每新增一台路由器就得告诉全世界,这听起来很疯狂。随着规模的增大,还带来很多包括算法收敛,管理等问题。因此目前将路由器放进一个个的自治系统中。一个自治系统就好比一个国家,每个国家自己运行自己的路由选择算法,当你想从武汉去鹿特丹的时候,首先我要确定我经历的国家必须尽可能少,所以先确定途径哪个国家(自治系统间路由选择),然后在每个国家内部我应走什么样的路线来穿越这个国家(自治系统内部路由选择)。

自治系统内部路由选择协议有两种:路由选择信息协议RIP(对应距离向量算法)开放最短路径优先OSPF(对应Dijkstra算法)

我们不深入研究这个两个路由选择协议,我们需要知道一件事,这个两个协议能为自治系统内部的路由器生成内部路径的路由表。

3.3 自治系统间的路由选择

自治系统间的路由则告诉我们,到达某个AS,应该途径哪些AS,该协议是BGP协议,这个协议不是基于图算法,而是基于策略。在自治系统间选择一个好路由通常由经济问题决定而不是技术问题。就好比你从武汉去泥泊尔,你也想翻越喜马拉雅山过去,这是最近的,可是这是不经济的。铁路部门得把自玛拉雅山打穿,然后去到泥泊尔,还是绕着走比较好,毕竟去泥泊尔的不多,为了这点旅客,铁路部门会亏损严重。所以自治系统之间的路由不是说谁近用谁的,可能最近的路径上某个AS不让你过,移动的用户估计不会让电信用户通过。

书中说BGP协议是相当之复杂的一个协议,说实在话,不管是自治系统间的路由选择还是自治系统内部的路由选择。我们都不做深入研究,毕竟我不做网络工程师。我只需要知道基本原理,不做过多研究,研究你该研究的,了解你该了解的,不做无意义的研究,了解反正也用不了多久,如果以后要用,知道有这么一回事,再深入研究就可以了,什么事情都是相通的,只要你把你该研究的研究透着了,以后进入新的领域,自然有也会有能力研究新的领域。

4 网络层的三个重要组件03:因特网控制报文协议(ICMP)

ICMP报文被用于主机和路由器之间沟通网络信息。他位移网络层之上,但是他不是传输层阅也不是应用层。ICMP报文作为有效荷载装入IP报文中,到达主机后主机根据其ip层的指示说上层协议是ICMP,就不会把该报文推给传输层处理了,而由专门处理ICMP报文的程序处理,所以ICMP没有端口号,也无需端口号。

ping程序就是通过发送ICMP报文请求目的主机回显回答,如果你发现ping一个主机ping不通,可能是对方的防火墙阻止了ICMP回显请求分组。

traceroute也是利用ICMP报文来测算路由情况,他连续的发送TTL递增的目的端口不可达的UDP报文,然后接收来自路由器的ICMP报文以估算各个路由器之间的RTT。这样的话,除非防火墙阻挡了UDP报文。这是linux系统做法,windows系统的tracert不同,他不是发送的目的端口不可达的UDP报文,而是连续发送ping报文,也就是ICMP回显请求报文。如果中间有路由器不接受这个你就无法知道该跳路由器了。所以如果你的结果列表里面有部分的行是*号,不要奇怪,可能是那几个路由器不接收你的ping报文。

扩展:单播、广播、多播

单播:目的地址只有一个
广播:网络中所有的主机
多播:网络中的一组主机
你应当感兴趣的是网络层的单播、广播、多播是如何实现的?目前我不感兴趣。如果你深入了解了,记得要用通俗易懂的方式,由浅入深的为我们讲解单播、多博、和广播。其实网络上关于这个讨论应该已经非常多了。

Q&A

  1. 路由选择算法需要知道邻居的ip地址吗?
  2. 网络变差的时候,重启路由器有用吗?
  3. 多人实时互动游戏使用了网络层多播还是应用层多播如P2P?还是使用了其他技术。
  4. 每个路由器中的路由表行数都一样多,都包含了整个因特网的所有子网吗?
  5. 路由器转发表是如何屏蔽掉NAT协议下的子网的?

很简单,转发表中本身就不包含该子网,路由器可以选择他的路由转发表中包含哪些子网,不包含哪些子网,不包含该子网,不代表不向该子网转发路由表。由于不包含局域网,因此你通常无法只通过ip地址从一个局域网访问另一局域网。比如你想登陆隔壁家局域网内的设备。你应当明白,当你从局域网访问一个目的主机时的基本过程,首先用你的子网掩码判断目的ip地址是子网的,还是外网的,如果是子网的,那么查询ARP表获得该ip地址对应的主机MAC地址,然后交换机会将其转发到对应的主机上,每路由器什么事。如果计算发现目的ip是外网的,那么也直接用路由器的MAC地址,交换机会把其转发到路由器,路由器拿到该报文,然后去掉链路层帧的头部信息,得到目的ip地址,首先路由器还充当了网关的作用,如果该ip经过网关计算它确实是外网的(你会好奇,为什么客户端那边已经算过一次了,你还要算一遍,万一客户端子网掩码是瞎填的怎么办?),他会与路由转发表对照,由于该转发表不会包含局域网的转发信息,因此会将该报文推到与广域网对应的端口,该报文就这样被送出去了,而不会到你隔壁,如果计算发现是内网,它会帮你根据以太网协议,查ARP表添加MAC地址,又发回给交换机,这就起到了网关的作用,这表明不管用户还是路由器,子网掩码都不能随意设置,否则会导致无法正常通信。但有种情况可以让局域网访问局域网,当你的报文从路由器输入端通过路由转发协议到了响应的输出端口,如果输出端外面连接的又是一个局域网,那么路由器输出报文到适配器之后,由于是局域网,会执行以太网协议,所以又开始通过网关来检查ip地址的是内网还是外网。如果是外网,送到更高的路由器,如果是内网,找对应的MAC地址,这也可以看到,目的ip一直不变,但目的MAC地址,可以一直发生变化,由每一个发送端重新确定。如果该局域网由这个ip,就可以成功访问了。

可以看到网关就是不同子网之间联络的关卡,报文想逃出一个子网,先要过网关,过了网关后还有广域网的路由转发和目的局域网的交换机转发等着你。假如ip地址不再用子网掩码来验证,理论上他也能到达目的地,设置个网关有什么用呢?除了再主机发送之前可以通过子网验证一下是内网还是外网,而不用以开始就去查ARP表来判断是内网还是外网之外,好像是没什么用。

由于路由转发表中不含有局域网的路由信息,因此你要从局域网外访问局域网,只能通过NAT穿透即UPnP(说白了就是在路由器设置端口映射)。因此一个报文从源到目的,最多也是最通常的情况需要经历四类表格:ARP表→MAC转发表→路由转发表→NAT转发表

总结来将,你的最后的报文会发到什么地方,第一步,要判断内网还是外网,然后经历交换机利用MAC转发分组,第二步,通过路由器时,在入口端时候要经历路由转发表转发,到出口端时如果外面是广域网直接推出去,如果是局域网又要从第一步开始。所以给你一个目的ip你都应该能判断它会经历什么样的路径。

  1. 当一个路由器接入网络之后,他是如何生成路由转发表的?
    路由表真正的表示是:子网+路由器端口号+跳数,每个路由器的每个端口都收到一个从别的路由发过来的路由转发表,但是没有端口号了。只有子网和跳数

你可能感兴趣的:(《计算机网络:自顶向下方法》Chapter4:网络层)