计算机网络——网络层:数据平面
《计算机网络——自顶向下方法》的笔记。
推荐一下中科大的网课,使用的也是这本教材,刚刚看迷糊了去看了一下,老师讲的很好,风趣幽默:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
与应用层和传输层不同的是,网络层中的每一台主机和路由器中都有一个网络层。
数据平面与控制平面#
网络层能够被分为数据平面和控制平面,想象一个路由器,数据平面的工作就是将进入该路由器输入端的数据报(网络层分组)转发给该路由器上的某个输出端,而控制平面的工作是决定如何选择数据被转发的路径。本章主要介绍的是数据平面。
从下图可以看到,端系统H1向端系统H2发送数据,数据从H1的运输层交付到它的网络层中,然后它的网络层将向路由器R1转发这个数据。而从H2的角度来看,它的网络层接收来自路由器R2的数据报,并上交给它的运输层。
网络层分组被称为数据报
这中间的过程经历了很多路由器,这些路由器中没有应用层和运输层相关的内容,它们只负责转发和为数据报选择路径,也就是路由选择。
每个网络路由器维护了一个转发表(路由表),路由器从到达的数据报首部提取值(目标地址),然后在转发表中索引该转发到哪个输出链路接口。
控制平面:传统方法#
那么路由表如何建立起来?
最简单的方法可以由路由器的管理员们彼此交换信息,并由它们来自行配置路由表。这个方案可行,但是人工配置慢,不容易反映出网络中实时的变化且容易出错。所以,需要网络中的路由器遵循某种路由选择协议/算法,每台路由器的路由选择协议之间会进行通信,完成管理员的要做的事。
控制平面:SDN方法#
SDN(Software-Defined Network,软件定义网络)方法是维护一个远程的控制器,它负责计算和分发转发表供每台路由器使用,此时路由器中也不需要路由选择算法了,但需要一种和远程控制器通信的机制。
网络服务模型#
网络服务模型即网络层所提供的服务模型,它可能包括以下服务:
- 确保交付:确保分组最终到达目的地
- 具有延时上界的确保交付:确保分组在特定的延时以内到达目的地
- 有序分组交付:确保分组以它们被发送的顺序到达目的地
- 确保最小带宽:模仿一个发送端与接收端之间的一条特定比特率的传输链路的行为,即保证发送主机以低于特定比特率的速率传输,则所有分组最终会交付到目的主机
- 安全性:提供加密解密
显然TCP/IP中的网络层服务模型什么都没有保证......
有很多网络体系结构已经发展出更好的网络服务模型,但是因特网的大范围实践表示,当前的尽力而为交付的网络服务模型已经足够好了。
路由器工作原理#
首先脑袋里要有个画面,路由器作为网络层的转发设备,它需要具备下三层的处理能力,即从物理层接收物理位信号上交给数据链路层,数据链路层对帧头进行判断,校验数据正确性以及决定是否接收等,再拆解帧中的数据部分,交给网络层进行转发和路由选择这些逻辑。
路由器的输入端口和输出端口都有三个块,其中,输入端的最左和输出端的最右是用来处理物理层逻辑的,中间处理数据链路层逻辑,输入端右侧以及输出端左侧处理网络层逻辑。
下面我们主要聚焦在输入输出端口的网络层的块上,当我们说输入端口,就代表输入端中这个网络层的块,对于输出端口也同理。
- 输入端口:路由处理程序会把转发表信息下放到这个输入端口,输入端口通过查表决定转发到哪个输出端口,而那些路由器之间交换的携带路由选择协议信息的控制分组会通过这个输入端口上交给路由处理程序。
- 交换机构:路由器内部的一个网络,用于将数据从输入端口转发到输出端口。这个交换结构有很多种表现方式,比如其中一个是一根连接所有端口的总线。
- 输出端口:负责从交换结构接收分组并下发给下层传输
- 路由选择处理器:控制平面的功能,执行路由选择协议,维护路由表和关联链路的状态信息,为路由器计算转发表。在SDN路由器中它负责与远端控制器交互
输入端口、输出端口和交换机构往往使用硬件实现,而路由选择处理器通常使用软件实现。
输入和输出端口往往是一起的,这里为了清晰才把它们分开。
输入端口处理和基于目的地的转发#
在输入端口上,需要根据IP来进行查找转发表。如果将每一个IP地址存储一个转发表项,那么32位的IP地址将有40亿个表项。
使用最长前缀匹配,我们在转发表中保留一些前缀,然后将数据转发给它的IP地址与能够匹配到的最长的前缀的这个表项对应的输出接口。这样大大减少了需要记录的表项数。
Cisco Catalyst 6500 和 7500 系列路由器及交换机能够保存 100 多万 TCAM 转发表项
一旦确定一个分组的输出端口,分组就可以被发送进交换结构,某些设计中因为此时此刻可能交换结构正在为其它输入端口服务,所以在输入端需要有一个队列来屏蔽这种差异。
交换#
下图是三种交换机构的实现方式,左上角使用一个通用计算机来实现,这是最早的路由器实现方式,这种实现需要每个分组经过两次系统总线才能到达输出端,左下角使用一个单独的总线来连接所有端口,右上角则更为复杂,速度也更快。
输出端口处理#
输入排队和输出排队#
路由器的输入端和输出端都有队列,它们用于屏蔽不同组件间的速度差异,如果队列满了那么某一个数据包将会被丢弃。
需要注意的是,假设输入和输出线路速度都是,有N个输入端口和N个输出端口,那么交换机构为了不成为系统瓶颈,它的速度必须大于等于
输入排队#
如下图,某一时刻两个输入端都向同一个输出端转发数据,这种情况下会导致其中的一个输入端的队列头阻塞,进而导致后面的所有数据报都阻塞。这种情况叫线路前部(Head-Of-The-Line HOL)阻塞。
输出排队#
输出排队是显而易见的,因为交换机构的速度比输入输出线路快,所以可能输出端口在向输出线路输出一个分组的时间内有更多的新分组到达输出端口。所以这里需要排队。
分组调度#
- 先进先出算法
- 优先级队列(如某些要求实时性较强的服务产生的流量会优先于其他流量)
- 循环公平排队
- 加权公平排队
第三种是将不同的分组分成N类,然后先服务第一类中的一个分组,再服务第二类中的一个分组,一直下去直到服务第N类的一个分组,然后再回到第一类。
第四种是第三种的加权形式,它在循环公平排队的基础上将每一类加一个权重,保证每一类获得百分之多少的带宽。
这些排队调度算法我们在各种科目中都见过好多遍,所以不详细说了
网际协议:IPv4、寻址、IPv6及其它#
IPv4数据报格式#
- 版本:不同版本的IP协议可能具有不同格式,路由器通过这个字段来确定当前IP数据报应该使用哪种版本的IP协议的格式来解析
- 首部长度:一般的IPv4数据报具有20字节的长度,但实际上IPv4的首部可以添加一些可变数量的选项,所以用了4比特的一个字段指示哪里是载荷部分实际开始的位置
- 服务类型:基本废弃的字段,用于标识当前数据报的服务类型以便路由器做出不同优先级的调度处理
- 数据报长度:头部加上数据部分的总长度,该字段16比特,所以IP数据报的最大长度是65535,在当前的链路层MTU中这个长度非常足够
- 标识、标志、片偏移:与IP数据报分段有关,用于解决不同链路层实现的MTU大小不同所带来的问题,后面会介绍
- 寿命(Time To Live,TTL):每当数据报经过一个路由器时,寿命-1,寿命为0该数据报被网络丢弃,这个字段为了避免数据报在网络中无限循环下去
- 上层协议:用于标识使用的上层协议是什么,这个制定了在到达目的主机的网络层后应该交给哪个特定的运输层协议实体。
- 首部校验和:用于校验IP数据报的首部是否出错。数据部分由于承载的是运输层数据,交由特定的运输层进行校验。
- 源和目的地址:无需解释
- 选项:特殊选项,很少使用
- 数据:运输层报文段(或者其他类型的数据,如ICMP报文)
IPv4数据报分片#
现在来解释下为啥要分片。
路由器具有多个网络接口(多张网卡),通过链路连接多个网络,每个链路可能具有不同的链路层实现方式,这些实现方式的MTU可能不同,比如FDDI可能具有4000字节的MTU,而普通的以太网可能只有1500字节的MTU。
此时如果路由器从某个具有4000MTU的端口接到一个数据报,那么这个数据报具有4000字节(20字节头部3980数据),而通过查询转发表,它所要转发到的输出端口实际上只有1500MTU,它必须把这个数据报分片,分成三片并给它们分别加上头部。
fragment1: 20bytes + 1480bytes
fragment2: 20bytes + 1480bytes
fragment3: 20bytes + 1020bytes
既然产生了分片,那么必须要有某种机制记录下这些分片了的数据报原本属于一个大的数据报,然后方便在后面某些地方重组。
IP数据报首部的片偏移(fragment offset)记录了这个片中数据在原数据中的起始位置/8(可以理解为为了节省空间,8个字节为一组),如第一个的offset=0
,第二个的offset=185
(1480/8)。
标志记录了这个片是否是分片的最后一片,为1代表不是,为0代表是。
分片并不会在整条路径中的某个路由器上进行重组,而是到了目标主机才重组,一是因为这些分片并不一定通过同一个输出端口被发送,路由器中重组根本没法实现,二是如果重组逻辑也放到路由器中会增加路由器的负担。
看到这的时候突然有一个想法,如果实际的传输过程中,分片出现了多次,比如第一次从MTU=6000分成了MTU=4000,第二次,这其中的一部分又分成了MTU=1500,那么光靠标志和片偏移,接收端没法确定这些数据报分组的顺序,也没办法重组。
这个问题通过标识来解决,请注意标识(Identification)和标志(Flag)的区别。发送方主机会为每个它发送的数据报加上一个标识,它每发一个就将标识加1,当路由器要为某一个数据报分片时,分得的所有片具有相同的源、目的地址和标识。这样接收端可以分辨出分片属于哪个比较大的块,从而进行正常的重组。
当出现片丢失,就要丢失本次传输的所有分组。
上面的三个分片小例子的表格:
IPv4编址#
之前说路由器匹配转发表时,为了节省转发表占用的空间,使用最长前缀匹配规则。但为什么选择的是最长前缀而不是什么其它别的规则,这和IPv4的编址方式有关。
接口#
先来通过简述一下网络接口(Network Interface)来描述一下通过主机通过IP地址接入到路由器,从而连接到网络的方法。
接口是主机与物理链路之间的边界,只要它连接到一个物理链路上,就需要有一个接口。如上图中的主机只连接通向路由器的链路,那么它只有一个接口,而路由器的任务是连接不同的网络,所以它要有多个接口。
接口处理一台设备与链路的连接,而IP地址就关联到这个接口上。
一台主机如果需要连接多个链路,那么它也可以有多个接口,而且目前通过虚拟网卡的技术虚拟出多个接口的技术很常见,并经常应用到我们的系统中
IPv4的地址由4个字节表示,总共有个地址,通常使用点分二进制计数法表示。
子网(Subnet)#
子网是网络中的一个组的抽象,比如在下图中,左侧圈中是一个组,右侧的223.1.2.1
想要给左侧的圈中的223.1.1.1
发送数据,那么它先要通过路由器来转发它的数据,路由器会选择将数据转发到223.1.1.4
的这个输出端口,剩下它就不管了。因为这四个IP组成了一个子网,这个子网中有某些东西可以负责把数据从223.1.1.4
转发到223.1.1.1
。在下图所示的网络中,通常是一个链路层交换机或者无线AP来负责子网之间的转发。
网络中最后一层的路由器(比如我们的家用路由器)有时是会负责将数据报直接交付给网络中的某个主机的,上面我们为了讲解有关子网的抽象概念把路由器和这个功能剥离开,但实际上的工作模式不一定这样的,请注意概念和实际的区别
子网中的主机具有相同的IP地址前缀,这让路由器更方便地维护转发表,因为它可以只通过记录子网然后将数据转发到某一个子网中(此时后面的时交给子网处理),而非记录每一台主机。
子网并不非要如上图一样小规模,实际上,上图中的IP都具有相同的前缀223.1
,它们同样可以向外部宣称它们共同属于223.1
这个子网中,然后外部的路由器会将它们中某台主机的数据转发给这个子网,然后这个子网内部再进行自己转发处理。一个子网就像网络中一块独立的岛屿。这样的设计减轻了路由计算和通讯的代价,将以主机为单位转化成以网络为单位参与网络接入。
下图具有六个子网
三个主机群为三个子网,这很好看出,而这三个路由器又连结成了三个子网。223.1.9
、223.1.8
和223.1.7
。
IP地址分类#
因为路由器匹配网络IP地址的前缀,所以IP地址被划分为网络号+主机号的组合,相同网络中的IP具有相同的前缀,这样,IP地址被划分成了五类:
这些地址首先使用不同的前缀来标识它们的类别,然后A类B类和C类三类是用于单播的IP地址,它们被划分出了网络号和主机号
类别 | 网络号个数 | 每个网络中主机个数 |
---|---|---|
A | (2^7) - 2 = 126 | (2^24) - 2 = 16777214 |
B | (2^14) - 2 = 16382 | (2^16) - 2 = 65534 |
C | (2^21) - 2 = 2097150 | (2^8) - 2 = 254 |
从上到下,可以代表的网络个数越来越多,但是网络中的可用主机个数越来越少。
CIDR(无类别域间路由选择)#
这个...上面的分类太粗鲁了,每个类别之间网络号长度跨越了一个字节,这一个字节可就是往上走8次方,所以不同类别间网络数量和主机数量的跨度太大。
比如B类IP能构成的网络只有16382个,很容易被分完,而每一个网络中有65534个主机,很少有某个机构具有如此多的主机。而到了C类,可用的网络数上来了,但是可用的主机数却只剩下了254个,一个机构的主机数很容易超过254。
所以,无类别域间路由选择是将上面网络中的网络号长度的跨度从字节变成位。它将IP地址以a.b.c.d/x
的形式来表示,代表这个32位的IP地址中有x位是网络号,x通常称为前缀。
子网掩码#
子网掩码也是点分32位二进制数,它和IP地址配对使用,它的前x位是1,后32-x
位是0。它主要是为了快速方便的计算出网络号而存在的,使用子网掩码和IP地址做与运算得到的就是网络号。
路由器对主机号并不关心,它只关心它要将数据交付给哪个网络,具体网络中如何交付给目标主机那是网络内部的事。
本笔记并不会涉及网络号、子网号(事实上本笔记都没区分网络号和子网号)、子网掩码、主机号、网络主机地址范围等一系列的计算,我们不应付考试,所以那东西交给机器去算吧。
内网地址#
- A类:10.0.0.0~10.255.255.255 MASK: 255.0.0.0
- B类:172.16.0.0~172.31.255.255 MASK: 255.255.0.0
- C类:192.168.0.0~192.168.255.255 MASK: 255.255.255.0
这些地址用于某一个网络的内部编址,不会被因特网路由器转发,不会与公网地址重复。
转发表和转发算法#
- 将过来的数据报的目标地址与子网掩码做一个与运算,得到目标网络号(子网号)
- 如果与转发表中的某一表项一致,通过某个接口(输出端口)发送到IP地址为Next hop IP的路由器上(因为一个接口连接了一个网络,一个网络中可能有很多IP,所以要指定Next hop IP)。
- 如果IP没有和转发表中的任何一项匹配,那么就将这个数据报转发到默认端口,这个默认端口称作默认网关。
网络中与目标主机在相同子网的路由器会完成这个数据报发送的最后一跳,即把数据报直接交付给主机。
获得IP地址#
配置一个主机的IP地址进行通信需要配置它的IP地址、子网掩码、默认网关和本地域名服务器。通常你可以手动配置也可以通过DHCP
自动获得。
路由聚合和最长匹配前缀#
前面说了路由器中使用最长匹配前缀
对目的IP地址与转发表进行匹配,我们也介绍了通过网络号来使路由器避免进行所有IP地址映射的记录,但是好像有了网络号之后,最长匹配前缀
就没用了啊。
是这样,如果路由器中存的就是实际的网络号,那么确实用不到最长匹配前缀
,因为不会有两个重复的网络号,这样每一次匹配都是精确的,只匹配到一条的。但是路由器为了进一步减小路由表的大小,它会将它内部所记录的映射条目聚合。
如上图,Fly-By-Night-ISP
是某个ISP提供的路由器,有四个组织连接到它们,这四个IP地址的网络号不同,但是它们都具有一个20位的公共前缀
11001000.00010111.0001
所以它们原本的四个表项可以被聚合成一个条目并向外发布,即200.23.16.0/20
,这一个条目可以把这四个子网全部覆盖。这其中的过程用文字描述就是:
- 组织0通过某种路由信息交换协议向
Fly-ByNight-ISP
这台路由器宣布,如果有以200.23.16.0/23
的网络号开头的数据报,那么它的下一跳IP是我 - 组织1通过某种路由信息交换协议向
Fly-ByNight-ISP
这台路由器宣布,如果有以200.23.18.0/23
的网络号开头的数据报,那么它的下一跳IP是我 - 组织2通过某种路由信息交换协议向
Fly-ByNight-ISP
这台路由器宣布,如果有以200.23.20.0/23
的网络号开头的数据报,那么它的下一跳IP是我 - 组织7通过某种路由信息交换协议向
Fly-ByNight-ISP
这台路由器宣布,如果有以200.23.30.0/23
的网络号开头的数据报,那么它的下一跳IP是我 - 路由器接到这四个组织的宣布信息,它将它们记录在路由表的四个条目中,当它发现这四个条目具有一个更短的公共前缀时,它将使用同样的路由信息交换协议向其它的路由器宣布,如果遇到
200.23.16.0/20
的网络号开头的数据报,那么它的下一跳是我。这样其它的路由器只需要记录一个条目就可以了。
然而,这样必定会覆盖到一些本来不属于这个Fly-ByNight-ISP
应该处理的数据报,因为200.23.16.0/20
中并非只包含这四个子网。或者,举个更简单的例子,假设上面的组织1连接到另一个ISP:
这样一来,上面的Fly-By-Night-ISP
仍然可以向外界宣告200.23.16.0/20
的数据转发给我,但是如果某个发向组织1的数据报被转发给Fly-By-Night-ISP
了,这个数据将无法到达,因为它并不知道组织1该怎么走。
而当组织1被连接到ISPs-R-Us
,这个ISP的路由器会向外宣布如果有发向200.23.18.0/23
的数据报,请发给我,它这个前缀长度是23,上一个Fly-By-Night-ISP
中的前缀长度是20,虽然上层路由器这两个表项都能匹配,但是它会选择更长的,因为更长意味着更精确。
书中好像并没介绍如果当两个路由器都向外发布相同的网络号该咋办,可能第五章会介绍。
网络地址转换(NAT)#
有一个问题是我一直好奇但总也不知道的。我们的个人设备都使用那些在因特网中被预留给局域网使用的IP地址,如192.168.1.x
,它们是无法被因特网中的路由器转发的,我们从ISP处购买上网服务,其实它只为我们分配了一个可用于因特网传输数据的IP。我们局域网中的多个设备,多个IP地址如何以同一个由ISP给的IP进行因特网数据传输呢?
这份工作由NAT协议完成,我们的连接局域网和外网的路由器都安装了NAT协议,它其中维护一个转换表,转换表的每一个表项是一堆IP地址和端口号的元组。
当你的一个局域网主机10.0.0.1
想以端口号3345
与外部的一个服务器沟通时,你的路由器会选择一个端口,图中是5001
,它会用这个138.76.29.7:5001
与外部服务器通信,然后并在表中记录,所有接收到的目的地址是138.76.29.7:5001
的数据报全部给10.0.0.1:3345
。就是这么简单。
NAT的优点就是无论局域网中的设备有多多,都始终只占用一个(或少量的)公网IP。
NAT的缺点也很多:
- 外部无法直接找到局域网中的主机,这导致无法使用局域网中的主机向因特网提供服务(可以使用NAT穿透技术)
- 路由器作为网络层设备却偷偷的查看了传输层的报文段头中的端口号,它做了它不该做的事
但是不管怎么说,NAT依然是我们目前上网的最常见的手段。
IPv6#
IPv4地址的枯竭导致IPv6的应用,目前我们的网络正处于向IPv6迁移的状态。
下图是IPv6的数据报格式:
IPv6的首部是定长的40字节,它也具有选项字段,但不在首部
- 版本:用于指明该数据报需要用IPv6规定的格式解析
- 流量类型:和IPv4中的服务类型差不多,就是用来提高服务质量的字段
- 流标签:也是为了提供服务质量的一个字段,如果该数据报传递的是某种特殊的要求实时性高(或者花的钱多的用户)的流,可能该流会在转发时被优先考虑
- 有效载荷长度:IPv6的数据部分的长度
- 下一个首部:和IPv4字段中的协议类型一致,即要交给什么上层协议
- 跳限制:和IPv4中的TTL一致
- 源地址和目的地址:不解释了,IPv6的地址更长
IPv6好像和IPv4相比并没有增加啥东西,只是修正了一些IPv4中不那么形象的字段名,而且相比IPv4还少了些东西。
- 分片相关字段:IPv6不在路由器上进行分片,如果它发现某个接口的链路MTU过小,它会放弃传输这个分组,向源发送方发送一个ICMP控制信息,内容是“分组太大”,发送方会使用更小的分组进行重传
- 首部校验和字段:设计者认为运输层和链路层都具有校验功能,所以在网络层提供校验有些多余。所以去掉了这个字段。要注意,IPv4的情况下,每个路由器都要重新计算一个数据报的首部校验和,因为TTL每次会改变。
IPv6丢弃的两个字段是为了给网络层更轻的负担,网络层只需要将注意力放在快速处理IP分组上。
向IPv6迁移#
此次迁移没有选择一次性将整个网络迁移到IPv6上的这种激进的办法,因为现在的网络太庞大了。取而代之的办法是,如果两个使用IPv6的设备需要进行通信,但它们中间的路由器只支持IPv4,那发送和接收两方可以将中间的IPv4设备看成一个隧道,发送方把IPv6的数据报封装到IPv4的数据报中(就是IPv6外面套一层IPv4),这样中间的路由器能认出IPv4的数据报并正常转发,而接收端的IPv6会对这个IPv4进行解包,拿出它的IPv6数据报。
通用转发和SDN#
大量中间盒的出现#
像传统路由器用于实现根据目的IP进行网络层的转发一样,很多类似的设备大量出现,比如用于根据匹配目的IP和端口号进行阻拦流量或重定向流量的防火墙,用于重写IP地址和端口号的NAT设备,用于对流量进行负载均衡从而平均的将流量发送到一批运行同样服务的服务器上的设备,这种设备可以统称为中间盒。
和路由器一样,这些中间盒的任务也是转发,只不过是在转发的基础上加入一些其它的逻辑。我们立刻想到,能不能建立一种抽象的转发设备,它只提供一些基础的转发功能,然后具体的转发策略——是转发还是阻拦分组、是否重写某些首部字段——抽取到另一种可编程的设备上。
但这在传统的设计里是不可实现的,传统设计里的策略僵化在设备中,导致设备的硬件、设备上运行的操作系统、操作系统上运行的软件深度耦合,你购买一款设备相当于你买了它们的全部硬件和软件服务。
SDN提供了另一种架构
转发设备只处理数据平面的功能,它们只会做类似于查找转发表并且执行指定动作的功能,流表是用到达的首部字段值的集合来匹配相应的动作,这些动作包含转发、丢弃或修改首部字段等。和转发表一样,流表由控制平面来下发,只不过控制平面的逻辑不再固化在转发设备中,它是一个独立的远程控制器,远程控制器负责计算并下发流表给每个转发设备。使用SDN技术的转发设备的控制平面就是与远程控制器交互。
这样,不同转发设备(如防火墙、路由器)之间的差异被屏蔽,大家只需要生产同一种符合标准的硬件,而远程控制器上可以运行某种符合标准的网络操作系统,在网络操作系统上可以运行某种符合标准的网络app,如防火墙app、NATapp等。
下面是openflow1.0标准所定义的首部字段集合,允许对三层的首部字段进行匹配,而目前的openflow中能够参与匹配的字段远远大于这个数量:
复习题#
网络层分组的名字是数据报,路由器是三层的设备,它具有下三层的功能(IP、链路、物理),同时,路由器通过三层地址(IP地址)进行转发,而链路层交换机是链路层设备,它只具有下两层的功能(链路、物理),它通过二层地址(MAC地址)进行转发。
数据平面:查询转发表、转发
控制平面:运行路由协议实体,与其他设备交换并计算路由信息,下发转发表给数据平面。在SDN中的控制平面负责与远程控制器交互。
转发是指通过查找转发表将数据从设备的输入端口传送到某个输出端口,而路由选择则是通过路由选择算法与其它路由器交互并计算该如何进行转发。
转发通常在一个很短的纳秒范围中发生,常用硬件实现,而路由选择则需要很长时间,常用软件实现。
输入端口会通过查询它来知道该转发到哪个输出端口。
提供尽力而为的端到端交付,啥也不能保证。
硬件实现:输入端口、输出端口、交换结构
软件实现:路由选择处理器。
数据平面是用硬件实现的,控制平面是用软件实现的。
因为对于前三者和数据平面要实现的功能来说,软件无法提供那么快速的实现。
讲过吗???算了不管了
基于目的地转发意味着转发设备只检查数据报的最终目的IP地址字段,并且它的转发逻辑僵化在设备中,通用转发并没有这种限制,它甚至可以根据传输层或链路层的首部字段作为转发时的参考。
通用转发是软件定义网络所采用的。
最长前缀匹配原则。
- 基于内存
- 基于总线
- 基于内部网络
第三种可以
If the rate at which packets arrive to the fabric exceeds switching fabric rate, then packets will need to queue at the input ports. If this rate mismatch persists, the queues will get larger and larger and eventually overflow the input port buffers, causing packet loss. Packet loss can be eliminated if the switching fabric speed is at least n times as fast as the input line speed, where n is the number of input ports.
和上面的道理一样,但是提高交换结构速率是不能防止这种丢失的,因为可能出现大量的分组涌向一个输出端口的情况。
HOL阻塞是当输入端要转发到的输出端口的缓冲区没空间了,它就只能阻塞,这时阻塞的数据报肯定在某个输入端口的队列头端,所以叫HOL阻塞。
FIFO
一些应用(比如IP语音)比另一些应用(比如telnet)更加需要实时性,还有就是一些客户会花钱获得更快的服务。
RR中所有分类是平等的,没有一个类别的优先级高于另一个类别,WFQ中某些分类的权重高于另一些分类,它将获得更多的传输机会。
在IPv4中通过报头的协议类型字段,在IPv6中通过报头的下一个首部字段。
IPv4的Time To Live (TTL),IPv6的Hop limit。
IP首部的校验和只检测IP的头部,传输层的报文段校验和检验整个传输层报文段。
当输出端口链路的MTU小于输入端口链路的MTU时分割,较小的数据报在接收端中倍重组而非路由器中。还有IPv6没有分割和重组。
任何连接到链路上的接口都有一个关联的IP地址,路由器因为要连接不同网络所以至少它要有两个。
8个接口,3次检索转发表
20字节的TCP头和20字节的IP头,加上原始数据总共80字节,应用数据占50%。
你的路由器会通过DHCP服务实体为五台PC下发内网IP,路由器还会运行NAT实体,为五台PC的内网IP和端口做网络地址转换。
意味着一台路由器将它的转发表中具有相同前缀的某些网络聚合,并向外宣称只要目标地址匹配这个前缀就转发给我。
这样会将上层路由器中的转发表缩小N倍,这样一级一级的缩小才能让具有如此多设备的庞大网络运行起来。用顶级的ISP举例,顶级ISP如果记录它下面的每一个网络那么它要记录无法想象的数据量,而如果每一层ISP聚合一点,到最后它只需要维护少量的数据,而更多的数据由一个树状形式分散到各个底层路由器上。
意味着网络维护人员不需要繁杂的配置,配置由协议来自动完成。
由于IP地址有限,所以专用网络地址是一些专门用来给局域网中分配的IP地址,它不会出现在大型公共因特网中,只应该在内网中使用,如果出现会造成网络地址冲突。
比如你家也有个192.168.1.100
,我家也有一个192.168.1.100
,那么如果它们参与到公网的通信中,那目的地址是192.168.1.100
的数据报该转发给谁呢?
R30. 不回答
R31. 同意,因为IPv6被包装在IPv4中
基于目的地转发的转发逻辑固化在设备上,通用转发的转发逻辑可编程
转发表通过目的IP地址进行匹配,并只能进行转发操作,而流表通过更多的字段进行匹配,甚至包括运输层和链路层字段,并且它除了转发操作还能做很多其他动作,比如丢弃或更改首部值。
匹配加动作意味着匹配可以具有更多的参考字段来选择,并且可以执行更多的动作。
在基于目的地转发的分组交换机,匹配网络层的目的IP地址并使用转发动作。
能匹配的字段
- 目的IP
- 目的端口
- 目的MAC
能采取的动作
- 转发
- 丢弃
- 修改首部字段
能匹配的
- IP源
- IP目的
- IP协议
不能匹配的
- checksum
- TTL
- 数据报长度
参考#
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/16144684.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具