一网打尽数据平面路由转发与IP报文

数据平面路由转发与IP报文

计算机的网络层可以分为数据平面和控制平面。数据平面执行的任务是转发功能,就是将数据从路由器的输入端口,发送到输出端口。控制平面执行的功能是路由选择功能,就是选择报文从源地址到目的地址经过的路由器的路径。这里主要讲的路由器如何转发一个报文(数据平面),然后讲一下IP报文。

1. 路由器的功能

路由器的转发有两种,基于目的的转发和通用转发,这里我们用基于目的的转发,后面讲IP的时候再讲通用转发。下图展示了路由器的整体状态:

1.1 输入端口

在每一个输入端口里,都有一个转发表。输入端口会通过将报文的目的地址与转发表相匹配来决定将报文发送到哪个输出端口。

下面是一个例子看图:

Prefix Output port
11001000 00010111 00010 0
11001000 00010111 00011000 1
11001000 00010111 00011 2
Otherwise 3

图中是一个转发表,匹配采用的是最大前缀匹配规则。假设我们的IP地址是11001000 00010111 00011000 10100001,这个地址同时与第2项和第3项匹配上了,但是根据最大前缀匹配规则,我们选择的是第2项,将报文发送的1号输出端口。

1.2交换结构

交换结构将一个报文从输入端口发送到输出端口。经典的有三种方式,总线,内存和纵横式。

下面是介绍这三种交换方式的各自的特点:

  • 总线,一次只能通过一个分组。
  • 内存,一次仅能执行一个内存的读写。
  • 纵横式,当报文的目的端口不是同一个时,可以并行地发送多个报文。

1.3 输出端口

到达输出端口后,输出端口将报文发送出去。

1.4 排队现象

1.4.1 输入排队

即使交换结构很快,在输入端口仍然可能发生排队现象。

考虑下面这种情况,我们采用纵横式的交换结构,假设现在在输入队列的报文如图1,同时我们假定当上中下三个队列中要发送的报文相同时,优先发送上面队列的报文

  1. 第一次发送时:由于上下队列中的要发送的报文相同,优先发送上面的报文到对应的输出端口。同时并行的发送中间队列的报文到对应的输出端口(对应图1)。
  2. 第二次发送时:由于上下队列中的要发送的报文还是相同的,优先发送上面的报文到对应的输出端口(对应图2)。
  3. 第三次发送时:现在只有下面的队列有报文,发送第一个报文。此时下面还剩下一个报文。

于是我们看到,即使没有与下面队列左边那个报文竞争的,但是由于他前面的报文一直没有发送,所以他也一直被堵塞着。这就导致了他白白等待了三个报文的发送时间,这种现象叫做输入队列的线路前部阻塞(HOL)。由于有HOL的存在只要输入链路的分组到达速率达到其容量的58%,在某些假设前提下,输入队列长度就会无限增长。

1.4.2 输出排队

当到达报文的速度超过输入端口发送报文的速度时,输出队列就会迅速的被填满。当输出队列满了的时候,一是采取弃尾,把后面到达的报文全部丢弃,二是删除前面的分组,给新的分组提供位置。在某些情况下,可以在队列满之前,先丢弃一个分组(或在首部添加标志),这可以向发送方发送一个拥塞信号,来调控阻塞情况。

同时当报文在输出队列排队时,还涉及到了分组调度,即如何排队。现在有三种排队方法,先进先出,优先权排队和循环和加权公平排队。

  • 先进先出,就是先来的报文也先发送出去,这和我们日常排队买东西一样。
  • 优先权排队,将队列分为优先权高的和低的,只要优先权高的有分组,就先发送他的分组。这就和我们有应急车道差不多。
  • 循环和加权公平排队循环排队就是把报文分成几类,然后循环的一类一类的发送报文,如果其中一类在轮到他是在他的队列中没有报文,那就直接跳过。加权公平排队把报文分成几类,并且第ii类的权重为wiw_i,加权公平排队保证第ii类接受到的服务等于wi/wiw_i/\sum w_i。当加权公平排队的wiw_i都相同时,加权公平排队和循环排队的作用就一模一样了。

2. IPv4IP_v4报文

2.1 报文格式

IPv4IP_v4的报文格式如下:

IPv4IP_v4的关键字段解释如下:

  • versionversion版本字段:根据他来识别IPIP数据报的版本,即IPv4IP_v4IPv6IP_v6
  • header lengthheader \space length首部长度:应为在IPv4IP_v4中有OptionsOptions可选项,所以用首部长度来指明数据报的首部长度,一般为20字节。
  • type of servicetype \space of \space service服务类型:将不同类型的IPIP数据报区分出来。将实时的通信(视频会议)和非实时的通信(邮件)区别出来,有利于提高效率。
  • datagram length(bytes)datagram \space length(bytes)数据报长度:这里指的是整个数据报长度,以字节为单位,包括IPIP的首部。
  • Identifier, flag and fragmentation offsetIdentifier, \space flag \space and\space fragmentation \space offset标识,标志和片偏移:这三个字段用于IPIP报文的分片。当数据报的长度大于链路层的最大传输单元(MTU)时,就需要将数据报分片,然后在目的地址的主机组装在一起。其中同一个IPIP数据报的标识是相同的。为了让目的主机知道他已经收到了最后一片报文,标志字段在前面的报文置1,最后一个报文置0片偏移,是为了让目的主机能按顺序组装报文。
  • time to live(TTL)time \space to \space live(TTL)寿命:这个字段决定报文能过被路由器转发几次。每次转发,TTLTTL1,当减到0时,路由器丢弃这个数据报。
  • upper layer protocolupper \space layer \space protocol上层协议:用来指示将IPIP数据报,交付给上层的那个协议。在维基百科上可以查看具体的关系。其中TCPTCP的是6UDPUDP17
  • header checksumheader \space checksum首部检验和:首部检验和用于帮助路由器检测IPIP数据报首部中的比特错误。
  • **src and  des IP spaceAddresssrc \space and \space \space des \space IP\ space Address源和目的IPIP地址 **:存放IPIP地址。
  • Options(if any)Options(if \space any)可选字段:可选字段允许IPIP被扩展,不过很少用,在IPv6IP_v6数据报中已经删除了这个字段。
  • datadata数据:存放来自运输层的报文。

2.2 IP编址

2.2.1 哪些设备具有IPIP地址

我们要搞明白IPIP编址,首先就要搞清楚什么设备具有IPIP地址,那什么设备有IPIP地址呢?

我们的主机和物理链路之间的边界叫作接口,其中每个接口都具有一个IPIP地址。所以理论上讲有几个接口就有几个IPIP地址。

2.2.2 IPIP地址和子网掩码

IPIP地址是由32位的二进制数字组成,一共有2322^{32}个(大约40亿个)。我们一般表示IPIP地址的方式是点分十进制记法,就是地址中每八个二进制位用十进制表示,中间用点号隔开,他的格式是a.b.c.d。例如123.23.23.23。其中255.255.255.255是**IPIP广播地址**,当我们用255.255.255.255作为目的地址时,报文会转发到网络中的所有主机中。

我们的IPIP 地址并不能随意的选择,他的一部分由子网掩码规定。子网掩码是什么呢?

我们先介绍子网掩码的记法,子网掩码的记法和IPIP地址相似,xxx.xxx.xxx.xxx/xxx。举个例子,123.12.12.0/24,位于这个子网里面的IPIP地址具有这样的形式123.12.12.xxx前面的24位是固定的,后面的8位是可以左右选择的。如下图,左边的三个主机和一个路由器构成一个子网,而子网里面的IPIP地址具有相同的子网掩码。

这三个子网的子网掩码分别是:223.1.1.0/24223.1.2.0/24223.1.3.0/24

2.3 一台主机如何获得一个IPIP地址

一个主机要想获得一个IPIP地址,他必须加入一个组织,然后组织分配给他IPIP地址。举个例子,现在你家里打算安装网线上网,首先我们会选择一个运营商(移动,联通或电信),假设你选择了移动,那么你也就加入了他这个组织,他会给你分配一个IPIP地址。那么他的IPIP地址块又是从哪来来的呢。

2.3.1 获得一块地址

像移动等他们要获得一块IPIP地址,也许要一个机构来分配。有一个全球组织叫ICANNICANN,他管理IPIP地址空间并向ISPISP和其他组织分配地址块。

2.3.2 获得主机的地址:DHCP

现在一个组织有一块IPIP地址了,那么他是如何把这块IPIP地址分配给他的成员的呢?

配置单个主机的IPIP地址,可以由系统管理员配置,但是现在更为流行的方法是使用**动态主机配置协议(DHCP)**自动配置。DHCP协议也是一个客户-服务器协议,理论上每个子网有一个DHCP服务器。如何子网中没有DHCP服务器,则需要一个DHCP中继代理(通常是路由器)。DHCP允许主机自动获取(被分配)一个IPIP地址。除了主机IPIP地址分配以外,DHCP还允许一台主机获得他的子网掩码,他的第一跳路由器地址(常被称为默认网关)和他的DNS服务器地址。

现在一个学生到达图书馆,考虑图书馆的DHCP服务器如何给学生的主机分配一个IP地址。DHCP协议通过下面的四个步骤实现的:

  • DHCP服务器发现:使用DHCP发现报文找到与客户主机交互的DHCP服务器。客户在UDP分组中想67端口发送该发现报文。因为开始时客户没有IPIP地址,所以客户使用的源地址0.0.0.0。同时客户也不知道DHCP服务器的地址,所以客户的目的地址是广播地址255.255.255.255,使用广播地址可以把发现报文发送到与客户主机相连子网的所有主机中。
  • DHCP服务器提供:DHCP接受到发现报文后,用DHCP提供报文向客户做出响应。因为DHCP服务器不知道客户的地址,所以他使用的目的地址也是广播地址255.255.255.255。DHCP服务器提供的报文包含收到的发现报文的事务ID,向客户推荐的IPIP地址,网络掩码和**IPIP地址租用期**,就是IPIP地址有效的使用时间(通常为几个小时或几天)。
  • DHCP请求:客户根据DHCP服务器提供报文,从一个或多个DHCP服务器中选择一个,并向服务器发送DHCP请求报文进行响应。源地址和目的地址同发现报文。
  • DHCP ACK:服务器用DHCP ACK报文回应客户的DHCP请求报文。

通过以上的步骤,客户就可以在租用期内使用DHCP提供的IPIP地址。

2.4 网络地址转换(NAT)

随着网络的发展,越来越多的设备接入互联网。在公司和家庭中,如果开始已经分配好了地址,但是现在公司又来了几个人,或者在家里你又买了一台电脑,于是ISPISP需要该你分配地址,如果子网变大了,就需要给你分配你块较大的地址。但是如果这块IPIP原来是连续分配的,现在没有了,怎么办?

这时我们就需要网络地址转换(NAT)

NAT使得在家庭网络的内部是一个子网掩码为10.0.0/24的子网。这些地址只能用于家庭网络的内部,叫做专用网络具有专用地址的地域。在外部看来,NAT是一个具有单一IPIP地址的单一设备。

NAT通过在他的内部保持一个NAT转换表将内部不同设备的**IPIP地址和端口号转化为可用与外部的IPIP和端口号。每当内部的某一设备通过NAT向外部发送一个报文时,NAT在NAT转换表中记录该设备的IPIP和端口号**,然后当响应报文发送后来时,NAT在通过NAT转换表转化将报文转化为内部子网的格式(修改目的IPIP和端口号)。如下图:

2.5 通用转发和SDN

前面我们将的路由器的转发都是基于目的地址的转发,我们接下来了讲的是通用转发。他们之间的主要区别是,基于目的的转发,只能根据目的IPIP地址转发。而通用转发可以匹配更多的报文首部,实现对报文的转发,丢弃和修改字段等功能。在这里路由器和其他的设备,在这里叫做分组交换机。

在分组交换机中,里面配置的表项叫做流表每个表项包括:

  • 首部字段值:和基于目的地址的转发相似,这里的首部字段是很多首部字段的集合。通过匹配首部字段,进而执行响应的动作。
  • 计数器集合(当流表项与分组匹配是更新计数器):这里的计数器可以包括已经与该表项匹配的分组数量,以及自从该表项上次更新以来的时间。
  • 当分组匹配流表项时所采取的动作集合:这些动作可能是转发分组,丢弃分组,复制分组并转发到多个输出端口,以及重写首部字段。

可以匹配的字段有如下的12个值:

参考文献

  • 计算机网络:自顶向下方法

以上就是数据平面的基本内容,其中没有涉及的就是IPv6IP_v6报文。因为本人的能力有限,所以如果有什么不对的希望大家可以在评论区里批评指正。

最后如果大家觉得好可以点个赞,谢谢大家!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章