Skip to main content

网络层

一、网络层简介

🔔 网络层的作用简述

网络层介于传输层和数据链路层之间,主要作用是实现两个不同网络系统之间的数据透明传送,具体包括路由选择,拥塞控制和网际互连等。网络层负责在不同的网络之间(基于数据包的IP地址)尽力转发数据包,不负责丢包重传和接收顺序

网络层是网络与网络之间通信的最底层,在数据从数据链路层向传输层进行数据传输的通信中,起到构建一个中间通信子网的作用不同网络有不同的网络层协议和地址规范,如果一个网络中的用户不能识别其他网络的通信协议和地址规范,那么这两个网络之间就不能进行数据通信

🔔

就好比不同国家有着不同的交通法规,属于不同的交警系统管理,不允许他国车辆随便出入一样。不同网络也有不同的设计规范,属于不同的组织来管理,必须通过授权,并由专门的协议来负责网络间的通信。

🔔

如果只是同一局域网内的各个计算机之间的通信,单靠物理层和数据链路层就可以建立通信链路完成用户间的数据通信但要扩大应用范围,连接不同的局域子网,就需要借助网络层处理各个网络子网的协议,从而进行计算机的网络互连,所以网络层在 TCP/IP 协议体系中叫网际互连层。

1.1 数据链路层和网络层的区别

image.png

1.2 网络互连使用的设备

(1)物理层使用的中间设备叫转发器(repeater)
(2)数据链路层使用的中间设备叫做网桥或者桥接器(bridge)
(3)网络层使用的中间设备叫做路由器(router)
(4)在网络层以上使用的中间设备叫做网关(gateway)。用网关连接两个不兼容的系统需要在高层进行协议转换。
image.png

1.3 网络层的作用

🌳

简单来说,网络层的功能就是让我们的计算机在成千上万的计算机中,能够找到另一台计算机在哪里,是否属于同一个子网等。

它的主要作用表现在下面的几个方面:
(1)屏蔽网络差异,提供透明传输

网络层就是为了解决不同网络有不同的规范要求的差异问题,寻找一个不同网络间都能共同遵守的网络通信规范,以便不同网络间能相互识别,并接受对方的网络请求。也就是一个中转站的作用,两个毫无交集的网络通过这个中转站来建立交集。

(2)为网络间通信提供路由选择

路由选择是根据一定的原则和路由选择算法在多个结点的通信子网中选择一条到达目的节点的最佳路径的过程。确定路由选择的策略称为路由算法。在无连接的数据包服务中,网络节点要为每个数据包做出路由选择,即选择到达目的节点的最佳路线,而在面向连接的虚电路服务中,存在一条专门的逻辑线路,在建立连接时就已经确定了路有路径,无需额外选择。

(3)拥塞控制

拥塞控制是为了避免网络传输路径中数据的传输延迟或死锁。数据链路层中的流量控制功能,是针对数据链路中点对点传输速率的控制,这里的拥塞控制是针对在网络层传输路径中的端到端传输效率的控制。主要采用预约缓冲区、许可证和分组丢弃等方式。

二、IP协议

2.1 IP协议格式

IP协议提供的服务为数据报服务,尽力而为的服务,数据单元为IP数据报.
image.png

  1. 4位版本号。标识当前的协议版本,比如ipv4.
  2. 4位首部长度。用于标识数据报首部的长度。
    caution

    注意,由于IP协议共有5行,每行是32位,也就是4个字节,因此首部长度至少是20字节,4位的首部长度最高能标识的长度为15,显然是不够的,因此这里计算出的首部长度必须乘以4才是真正的首部长度

  3. 8位服务类型(TOS),前三位标识优先级(已经弃用),接下来四位是最小延迟、最大吞吐、最高可能性、最小成本。剩下一位是保留位。1998年改为“区分服务”。只有当网络提供区分服务时才有效。
  4. 16位总长度,标识ip数据包的最大长度位2^16,单位为字节。包含了ip的头部和ip数据报的有效负荷。
    tip

    可以计算得出IP分组的最大总长度为65535B(2^16-1)。最小的IP分组首部20B,IP可以封装的最大数据:65535-20=65515B。

  5. 16位标识。标识那些数据报是同一条数据。用于分片
  6. 3位标志,用于分片,见下方解释。

第一位是保留位。
第二位标识禁止分片。
第三位标识分片是否结束。1表示后面还有分片,0表示后面没有分片。

  1. 13位的片位移。表述这个数据报在同一个数据的哪个位置。
  2. 8位生存时间,路由器经过的最大跳数。也就是说路由器能够转发这条数据的最大次数。

每经历一个路由器转发TTL减一。TTL>0表示还可以转发,TTL=0表示已经超时,丢弃这个ip数据。一般这个TTL是64.

  1. 8位协议。记录上层协议这条数据需要交付给传输层哪个协议。它实现了IP协议的复用和分用。

  2. 16位首部校验和。检测这个数据在传输过程中是否失真。对头部计算校验和时该字段全部置0,和的反码作为首部校验字段。首部校验和在每次转发的时候都需要重新计算

  3. 32位源IP地址和32位目的IP地址(网络层地址)。

  4. 长度可变的选项字段(0~40B之间),可以携带安全信息、源选路径、时间戳等,实际上很少使用。

  5. 填充域:长度可变(0~3B)目的是补齐整个首部,符合32位对齐,保证首部长度是4的倍数

    tip

    以上1-13部分称为IP分组的头部

  6. 数据部分。

2.2 IP数据报的分片(Fragmented)

最大传输单元,MTU:链路层数据帧可以封装的数据上限。
链路层帧:Head+Data+Tail,其中的Data就是封装的IP分组,MTU=Max(Data)。不同链路的MTU不一样。

MTU带来的问题

如果数据报是从链路A传输到链路B,但是MTU-A>MTU-B,很可能引发一个问题,也就是在A链路中数据报可以完整封装进链路层帧,但是B链路就不行了,所以就有了IP分片
如果这个IP分组是不允许分片的,那么这个IP分组将被丢弃。

image.png
IP分片到达目的地时由主机再进行重组,因此路由器只负责分片,不负责组装。 如果到达主机之后,分片没到全,那么全部分片将被丢弃。

怎么标识一个IP分组呢?

image.png
使用首部的标识ID标识位片偏移进行分辨。
标识位占三位:
image.png

DF:Dont Fragment。  //=1表示禁止分片(丢掉,并告诉发送方太大)、=0表示允许分片
MF:More Fragment。//=1表示这不是最后一片,=0表示这一片就是最后一片(也可能是根本没有分片)

片偏移
占13位,一个IP分组片封装原IP分组的相对偏移量。它封装原Ip分组数据的相对偏移量。片偏移用来指定当前这个片应该被放置在原数据报的哪个位置,从而确保了组装的正确顺序。
片偏移量以8字节为单位

IP分片的过程
  1. 设原IP分组长度为L,待转发的链路MTU=M;

  2. 若L>M,且DF=0,那么就要进行分片;  

  3. 分片时所有分片的标识位均复制原数据报的标识位。

  4. 除了最后一个分片,前面的分片均分为MTU允许的最大分片。一个最大的分片可封装的数据是8的倍数,那么一个最大的分片可以封装的数据为:
    d=下取整[(M-20)/8]×8
    这里的M表示最大允许,20表示首部长度。

  5. 那么需要的总片数为上取整[(L-20)/d]

  6. 每段的片偏移值为:Fi=(d/8)×(i-1),1<=i<=n,n为片数,可以看出第1片的偏移数为0。

  7. 每片的总长度字段:最后一片为L-(n-1)d,其他片为d+20

  8. MF取值除了最后一位取0外其他全部取0.

fc161595d5b97f0626051c1c4bd75c4.jpg
图中,如果1500改为1504或1503呢?实际上,也是一样的。

2.3 IP编址

源地址和目的地址用于表明编址。
接口(interface):主机/路由器与物理链路的链接。用于实现网络层功能,路由器通常有多个接口。主机通常有两个接口。
交换器、WIFI等都在数据链路层,因此不用对其编址。

2.3.1 IP子网

使用32比特的二进制编号。 例如:11011111 00000001 00000001 00000001=223.1.1.1(为方便识别而转化为点分十进制)
image.png
IP地址和每个接口关联。

采取IP子网策略(Subnets)

将IP地址分为网络号(NetID)和主机号(HostID)。在同一个区域网络中的IP地址的网络号一定相同,主机号一定不同。这个区域的网络叫IP子网。在这个网络中,所有的设备都不跨越路由器。
image.png

Details
下图有几个子网 查看图中有几个不同的XXX.XXX.XXX,或者看被路由器分成几个部分,因此下图中有**六个**。中间三个IP子网可以分IP地址也可以不用。

2.4 IP地址分类

image.png IP地址根据网络号和主机号来分,分为A、B、C三类特殊地址D、E。全0和全1的都保留不用。

类别作用比例
A(0.0.0.0-127.255.255.255)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络50%
B(128.0.0.0-191.255.255.255)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络25%
C(192.0.0.0-223.255.255.255)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络12.5%
D是多播地址。不再区分网络号主机号。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1]6.25%
E是保留地址。不再区分网络号主机号。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。6.25%

A类地址:网络位8位,主机位24位。可容纳主机数:2的24次方减2个,可以划分的子网数:为2的22次方,由于每个网络都存在两个不可用的地址(网络地址和广播地址),所以要想划分的子网可用,最小的子网应该留2味主机位,在此最小的网络中的可用地址数十2个,2的2次方减2,这种网络是现在多数小型企业用的联网方式(点到点网络),一个地址在自己的外网,另一个地址是运营上设备上的。
B类地址:按上述说法,网络位和主机位都是16位,所以可容纳主机数是2的16次方减2,子网数为2的14次方。
C类地址:网络位24位主机位8位,容纳主机数位2的8次方减2=254(这就是为什么咱们使用C类地址,比如192.168.1.网络地址的设置范围是从1到254了,因为网络地址1.0和广播地址1.255不可用),子网数位2的6次方。

image.png

tip

在一个网段中都会有一个网络号的和广播号,即 192.0.0.0 ~ 192.0.0.255
网络号:主机号全为0的ip地址,就为该网段中的网络号
广播号:主机号中全为1的ip地址,就为该网段中的广播号
127.0.0.1 :本地回环网卡地址(通常用来测试自己机器的网络连通性)
0.0.0.0:代表本地所有的网卡地址

image.png

2.5 特殊地址(广播地址、环回地址)

image.png

tip

本网内广播地址:255.255.255.255
直接网络地址:网络号为特定值,主机号为全0.
本地测试环回地址:网络号为127,主机号不为全0或者全1的的任何数。
私有地址
image.png C类,例如我们学校的某些网站。是企业私有地址。


2.6 子网划分

实际上,上述的有类地址,并不灵活。所以将IP地址划分为网络号(NetID)、子网号(SubID)、主机号(HostID)
image.png
这些子网(上述四个)将用浏览器联系起来。
如何确定是否划分了子网?使用子网掩码

2.6.1 子网掩码

子网掩码形如IP地址,占32位,使用点分十进制表示
NetID、SubID全部取1。
HostID全部取0。
例如:
A网络默认子网掩码: 255.0.0.0
B网络默认子网掩码: 255.255.0.0
C网络默认子网掩码: 255.255.255.0
借用了主机3比特划分子网的子网B的子网掩码: 255.255.224.0 (11111111.11111111.11100000.00000000)
子网地址+子网掩码-》确定子网大小 image.png

例子

子网201.2.3.0,子网掩码为255.255.255.0,被划分为4个等长的子网(等长,256/4=64):

  1. 201.2.3.0,255.255.255.192(借用主机8位中最高位的两个比特,因为要分成四个子网,0~3==00~11)

  2. 201.2.3.64,255.255.255.192

  3. 201.2.3.128,255.255.255.192

  4. 201.2.3.192,255.255.255.192

路由器如何确定应该将IP分组转发到哪个子网上去呢?

🌳

将IP分组的目的IP地址与子网掩码按位与运算,提取子网地址。
image.png
地址范围为什么是~172.32.1.255?因为子网掩码借走了前面254.去掉主机域全0的和主机域全1的地址称为可分配地址范围。广播地址:主机域全1.

image.png

2.7 环回地址

帮助我们进行本地测试,既做客户端也做服务端。例如vue环境的run dev,就是在本机环回地址下做测试,进行热重载。 1655982239940.png
环回地址是一类特殊的IP地址, 127.0.0.1 —> 127.255.255.254(去掉0和255) 的范围都是本地环回地址。环回地址(loopback)不离开主机的数据包(也就是说,这些数据包不会通过外部网络接口)。例如:127.0.0.1。需要注意的是,它是一个虚拟地址。是 IP地址中内部的一种。
有一特殊的A类IP地址,网络地址是127,这类地址称作环回地址。但是我们经常使用的是127.0.0.1这个地址,且赋给它一个名字:localhost

2.8 IPv6

IPv6数据报格式
固定40B基本首部
有拓展首部
版本:总是6,指明了协议版本
优先级:区分数据报的类别和优先级
流标签:所有同属一个流的数据报有同样的流标签
下一个首部:标示下一个拓展首部或上层协议首部
跳数限制:相当于IPv4的TTL
image.png
image.png


IPv6表示形式
不能用IPv4的点分十进制,改用冒号十六进制记法。
其实就是’.‘号变成’:'号,十进制变成十六进制。
压缩形式:全0的一组字节,直接用一个0即可。
零压缩:一连串的全0字节组,可以直接用一对冒号代替。见图例
FF05:【0:0:0:0:0:0】:B3 => FF05: :B3
image.png
image.png


v4过渡到v6的方法
image.png

2.9 IPv4(32位)和IPv6(128位)对比

v4使用32位格式,v6使用128位
image.png

三、网络地址转换 NAT

3.1 网络地址转换的含义

解决的问题:在专用网内部的一些主机本身就分配到了IP地址(专用IP地址),但是又想和互联网上的主机通信。
NAT路由器:专网和互联网中间的安装了NAT软件的桥梁路由器。它实现了本地主机在和外界通信时,使用NAT将本地地址全部转换为IP地址。

3.2 NAT工作原理

image.png
在图中,专用网192.168.0.0内所有主机的IP地址都是本地IP地址192.168.x.x。NAT路由器至少要有一个全球IP地址,才能和互联网相连。图中表示出NAT路由器有一个全球IP地址172.38.1.5(当然,NAT路由器可以有多个全球IP地址)。
发送:NAT路由器收到从专用网内部的主机A发往互联网上主机B的IP数据报:源IP地址是192.168.0.3,而目的IP地址是213.18.2.4。NAT路由器把IP数据报的源IP地址192.168.0.3,转换为新的源IP地址(即NAT路由器的全球IP地址)172.38.1.5,然后转发出去。因此,主机B收到这个IP数据报时,以为A的IP地址是172.38.1.5
接收当B给A发送应答时,IP数据报的目的IP地址是NAT路由器的IP地址172.38.1.5。B并不知道A的专用地址192.168.0.3.实际上,即使知道了,也不能使用,因为互联网上的路由器都不转发目的地址是专用网本地IP地址的IP数据报。当NAT路由器收到互联网上的主机B发来的IP数据报时,还要进行一次IP地址的转换。通过NAT地址转换表,就可把IP数据报上的旧的目的P地址172.38.1.5,转换为新的目的P地址192.168.0.3(主机A真正的本地IP地址)。

tip

由此可见,当NAT路由器具有n个全球IP地址时,专用网内最多可以同时有n台主机接入到互联网。这样就可以使专用网内较多数量的主机,轮流使用NAT路由器有限数量的全球IP地址。

但是,这种机制有明显的弊端,显然,也就是必须要内网主动发起才可以,但是如果外网希望主动和内网某个主机通信,这样NAT就不知道找谁了。
为了更加有效地利用NAT路由器上的全球IP地址,现在常用的NAT转换表把运输层的端口号也利用上。这样,就可以使多个拥有本地地址的主机,共用一个NAT路由器上的全球IP地址,因而可以同时和互联网上的不同主机进行通信使用端口号的NAT也叫做网络地址与端口号转换NAPT,而不使用端口号的NAT就叫做传统的NAT。但在许多文献中并没有这样区分,而是不加区分地都使用NAT这个更加简洁的缩写词。下表说明了NAPT的地址转换机制。
20200425184807390.png
从上表可以看出,在专用网内主机192.168.0.3向互联网发送IP数据报,其TCP端口号选择为30000。NAPT把源IP地址和TCP端口号都进行转换(如果使用UDP,则对UDP的端口号进行转换。原理是一样的)。另一台主机192.68.0.4也选择了同样的TCP端口号30000这纯属巧合(端口号仅在本主机中才有意义)。现在NAPT把专用网内不同的源IP地址都转换为同样的全球IP地址。但对源主机所采用的TCP端口号(不管相同或不同),则转换为不同的新的端口号。因此,当NAPT路由器收到从互联网发来的应答时,就可以从IP数据报的数据部分找出运输层的端口号,然后根据不同的目的端口号,从NAPT转换表中找到正确的目的主机。

NAT存在的意义

它可以有效解决公网的地址不足的问题。

四、无类域间路由CIDR与路由聚合

4.1 CIDR简介

无类域间路由(Classless InterDomain Routing,CIDR)
消除A、B、C类的地址界限。
NetID+SubID->Network Prefix网络前缀,可以任意长度。
它融合了子网地址和子网掩码,方便子网划分。
格式:{<网络前缀>,<主机号>}/前缀位数
无类地址格式:a.b.c.d/x,其中x为前缀的长度。
image.png

tip

按照有类IP地址,这是一个典型的C类地址,但是C类地址是前24为为网络号,这里是23位。

优点:

  1. 提高了IPv4地址空间效率。
  2. 提高路由效率。解决了路由表项目过多过大的问题。

4.2 CIDR计算

CIDR给出任何一个IP地址就相当于给出了一个CIDR地址块。这是由连续的IP地址组成的,所以CIDR实现了超网,实现了路由聚合。

实例

例如:一个IP地址:128.14.35.7/20
将其转化为2进制。蓝色部分是网络前缀。
128.14.35.7/20=10000000 0000110 00100011 00000111
后面12位是主机号,因此,可以得到地址范围:
10000000 0000110 00100000 00000000~
10000000 0000110 00101111 11111111
子网掩码是(前20位全1):11111111 11111111 11110000 00000000

在CIDR表示法中也可以进行进一步的子网划分。

例如:将128.14.35.0/20划分四个子网

转换成二进制 128.14.35.0/20 = 10000000 00001110 00100011 00000000

从主机位借走两位:

10000000 00001110 00100011 00000000 = 128.14.35.0/22

10000000 00001110 00100111 00000000 = 128.14.39.0/22

10000000 00001110 00101011 00000000 = 128.14.43.0/22

10000000 00001110 00101111 00000000 = 128.14.47.0/22

五、DHCP协议(动态主机配置)

概念:DHCP的全称是Dynamic Host Configuration Protocol, 即动态主机配置协议, 它的特点是能够自动设置IP地址,并实行统一的管理。

我们有两种为主机设置IP地址的方式:

管理员手动设置主机的IP地址
通过DHCP自动设置IP地址

DHCP是一种即插即用的协议(plug-and-play protocol)。实际上,我们在生活中经常享受着DHCP带来的便利:我们有时会携带笔记本电脑或手机到公共场所里例如图书馆,并且通过WiFi连上一个陌生的子网但是我们并没有做重新为主机配置IP地址的工作
在没有DCHP下,管理员来设置分配IP地址。
1060770-20171029235528570-268748976.png
在DHCP支持下,自动分配IP地址。
1060770-20171029235537211-1423949993.png

DHCP工作流程
  1. DHCP服务器管理着一个包含一系列IP地址的地址池,每当一台新的主机加入时,DHCP服务器就从其当前可用地址池中分配一个任意的地址给它
  2. 每当一台主机离开的时候,其IP地址就被回收到地址池中
    1060770-20171029235601914-460592322.png

DHCP两个租约表
静态租约表:对应一个静态租约存储文件,server运行时从文件中读取静态租约表。
动态租约表:对应一个周期存储文件,server周期性将租约表存进该文件,在程序开始时将会读取上次存放的租约表。(租约表记录了当前所有分配的租约,包括静态链接的。


DHCP的三种IP分配机制

1) 自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址
2) 动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用
3) 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的DHCP服务器只是将指定的IP地址告诉客户端主机。 三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。
DHCP封包在传输层(Transport Layer)是采用UDP协议,而当 Client传送封包给 Server时,采用的是UDP 67 Port,从 Server传送给 Client则是使用UDP 68 Port


DHCP详细流程

1、DHCP Client以广播的方式(封包的源地址为0.0.0.0目的地址为255.255.255.255)发出DHCP Discover(在UDP 67端口)报文。


2、所有的DHCP Server都能够接收到DHCP Client发送的DHCP Discover报文(也就是说子网内的DHCP服务器不止一个),所有的DHCP Server都会给出响应,向DHCP Client发送一个DHCP Offer报文
DHCP Offer报文中“Your(Client) IP Address”字段就是DHCP Server能够提供给DHCP Client使用的IP地址,且DHCP Server会将自己的IP地址放在“option”字段中以便DHCP Client区分不同的DHCP Server。DHCP Server在发出此报文后会存在一个已分配IP地址的纪录。


3、DHCP Client只能处理其中的一个DHCP Offer报文,一般的原则是DHCP Client处理最先收到的DHCP Offer报文。DHCP Client会发出一个广播的DHCP Request报文,在选项字段中会加入选中的DHCP Server的IP地址和需要的IP地址


4、DHCP Server收到DHCP Request报文后,判断选项字段中的IP地址是否与自己的地址相同。如果不相同,DHCP Server不做任何处理只清除相应IP地址分配记录;如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息


5、DHCP Client接收到DHCP ACK报文后,检查DHCP Server分配的IP地址是否能够使用。如果可以使用,则DHCP Client成功获得IP地址并根据IP地址使用租期自动启动续延过程;如果DHCP Client发现分配的IP地址已经被使用,则DHCP Client向DHCPServer发出DHCP Decline报文,通知DHCP Server禁用这个IP地址,然后DHCP Client开始新的地址申请过程。


6、DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址,DHCP Server收到DHCP Release报文后,会回收相应的IP地址并重新分配。 在使用租期超过50%时刻处,DHCP Client会以单播形式向DHCP Server发送DHCPRequest报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文则按相应时间延长IP地址租期;如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址。 在使用租期超过87.5%时刻处,DHCP Client会以广播形式向DHCP Server发送DHCPRequest报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址,直到IP地址使用租期到期时,DHCP Client才会向DHCP Server发送DHCP Release报文来释放这个IP地址,并开始新的IP地址申请过程。

一个类比

当小明来到一个餐厅吃饭,小明必须寻找一个合适的座位。因此他就大喊(广播,UDP67)“大爷我来了!给我找个座位(IP)!”在现场那的所有的服务生(DHCP服务器)都会收到这个信息。服务生A告诉小明,请坐这个1号座位,服务生B告诉小明,请坐这个2号座位,服务生C让其坐3号座位,同时ABC三人这时都认为自己的座位有人坐了,但是小明只能选一个座位坐下,因此他选了最先听到的服务生A的话,选了1号座位,这时小明再次大喊“我坐了1号座位!”,服务生ABC都听到了这个消息,BC发现并不是自己的位子,那么就又认为这个2、3是空位了。A听到客人坐了自己的位置,那么他就在小明的耳边告诉小明:“好的(ACK)!你可以坐1 小时!”,小明听到后检查这个座位是不是真是空的,如果是,他就坐下来喝茶了,如果不是,他会把服务生A叫过来,大声斥责他说:“这已经有人坐了!”,然后小明重新大喊找座位。这里假定1确实是空的,小明坐了半小时后,小明把服务生叫过来说:“这个座位半小时后到期,我一会还要坐!”,如果服务生说:“好的!”,那就延长租期,如果小明耳聋没听到或者服务生嗓子哑了没说清楚,小明就不做理会,继续坐着,等到87.5%的时间之后,小明在餐厅里大喊,“这个座位快到期了!我要续租!”如果服务生说:“好的!”,那就延长租期,如果小明耳聋没听到或者服务生嗓子哑了没说清楚,小明就不做理会,继续坐着,直到时间快到了,他就叫服务生过来“我不坐了!”,然后重新大喊找座位。

六、ICMP协议

6.1 ICMP协议的作用是什么

Internet控制报文协议(Internet Control Message Protocol)
CMP协议主要用来检测网络通信故障和实现链路追踪,最典型的应用就是PING和tracerooute。


PING: 通过发送回送请求报文和回送回答报文来检测源主机到目的主机的链路是否有问题目的地是否可达,以及通信的延迟情况


traceroute: 通过发送探测报文来获取链路地址信息

具体操作

第一个探测报文TTL为1,到达第一个路由器时,TTL减1为0所以丢掉这个探测包,同时向源主机发回ICMP时间超过报文,这时源主机就获得了第一个路由器的IP地址。
接着源主机发送第二个探测报文,TTL增1为2,到达第一个路由器TTL减1为1并转发探测包到第二个路由器,这时TTL减1为0,丢掉这个探测包并向源主机发回ICMP时间超过报文,源主机就获得了第二个路由器的IP地址。
以此类推,直到探测报文到达traceroute的目的地,这时源主机就获得了到目的地的每一跳路由的IP地址

image.png
image.png


七、路由

路由器主要有路由转发两大主要功能。
路由器偶尔也称为网关。
路由器有以下几种功能:

第一,网络互连,路由器支持各种 局域网和 广域网接口,主要用于互连局域网和广域网,实现不同网络互相通信;
第二,数据处理,提供包括分组过滤、分组转发、优先级、复用、加密、压缩和 防火墙等功能;
第三,网络管理,路由器提供包括配置管理、性能管理、容错管理和流量控制等功能。

7.1 路由算法是什么

确定去往目的地的最佳路径。
将网络抽象成图:每个节点是路由器,节点之间的连接线是链路。链路上的权值是通过链路的代价(费用)。当然,费用是越小越好的。
36b33211a9f531f15d7c81547ae3af6.jpg
路由算法的目的是计算最小费用的路径是什么,也就是最短路径算法。 image.png


7.2 链路状态路由算法

基于迪杰斯特拉算法。
链路状态路由算法要求每个路由器构造一个链路状态分组并广播给其他的路由器,每个路由器都会收到邻居路由器的信息。


C(x,y)标识结点x到结点y的链路的费用,如果不直接相连则初始化为正无穷
D(v)标识从原目的到v结点路径的费用值。
p(v)沿着源到v的前序结点。
N标识已经找到最小费用路径的结点集合。
image.png

Details
迪杰斯特拉算法步骤演示
由此可确定出u到各点的最短路径。并将其反映到最终的转发表。 ![7d5c7f84446b5c89dd0bf490f1a001f.jpg](https://jetzihan-img.oss-cn-beijing.aliyuncs.com/blog/img/006SHRs9gy1h3j4tni0snj31z418gn8r.jpg)
迪杰斯特拉算法出现的问题

image.png

7.3 距离向量路由算法

基于Bellman-Ford方程(动态规划)
d(xy)为x到y的最小开销(距离)
d(xy)=min{c(x,v)+d(vy)},由邻居告知我它到达y的开销。


举例
image.png
显然,可以从图中得到u的邻居到z的距离:d(vz)=5,d(xz)=3,d(wz)=3
那么根据B-F方程:
d(uz)=min{c(uv)+d(vz),c(ux)+d(xz),c(uw)+d(wz)}=min{2+5,1+3,5+3}=4;故而使用x作为下一跳。
因此u并不需要直到整个拓扑分组就能进行规划。


算法过程
对每个节点x: (1)在每个节点建立自己的距离向量表并初始化
(2)在每个节点将自己维护的距离向量表向其邻居节点转发
(3)每个节点收到邻居节点发送的距离向量表以后基于新的信息采用方程来更新自己的距离向量表
(4)当自己的距离向量表发生变化时,将新的距离向量表发送给自己的邻居节点,如果与以前的向量表相同则不向其邻居节点转发,直到每个节点的距离向量表达到稳定为止。

假设图中只有三个节点,它们两两相连:
cb47905beb554cfca600ce6c4dc3425e.png
上图为x节点的选路表。
节点x选路表中:
行:该节点的距离向量Dx和其邻居的距离向量Dv;
列:所有目的节点。
在初始化时由于每个节点只知道本路由器相连的链路费用,因此只有到相邻节点的最低路径费用有值,其余全部为无穷大,为对应的链路费用值。如下图
c85ce5b6380d428f9e1f3c788ef0afb2.png
当每个节点完成自己的距离向量表后,会不断的向自己的邻居节点发送这个距离向量表。
每个节点收到邻居新的距离向量表后,会使用B-F公式更新自己的距离向量。若距离向量发生变化将新的距离向量通知给邻居。
当距离向量不在变化,则算法终止。
29e941a69c4c4d18ad686765e3ffacc5.png

图解

x、y、z三个节点向其邻居发送了自己的向量表之后,x节点收到了来自y节点和z节点的距离向量分别是2、0、1和7、1、0。分别将这两个向量放在第二行和第三行的第一列中。然后利用收到的新的信息来更新自己的距离向量。首先更新x节点到y节点的最低路径费用。根据B-F方程可是x节点到y节点最低路径费用为2,因此保持不变,x节点到z节点的最低路径费用可进一步减小为3即x节点先到y节点再到z节点。经过上述修改后x的向量表如第一行第二列所示。x节点新的距离向量与以前的发生了变化,因此x节点会将新的距离向量向其邻居节点y和z发送。依次类推,每个节点都不断更新自己的距离向量,直到不在发送变化为止例如第二行第二列这里的y节点重新计算距离向量后发现这里的距离向量没有发生变化仍然是201,因此不再向其邻居节点发送
我们观察到多次从邻居接受更新距离向量、重新计算选路表项、并向邻居发送更新通知的过程,一直持续到没有更新报文发出为止;算法进入静止状态,直到某个链路费用发生改变为止。

7.4 链路状态路由算法和向量路由算法对比

消息复杂度
链路状态路由算法(LS):需要知道每条链路的费用,需发送O(nE)个报文;当一条链路的费用发生变化时,必须通知所有节点
距离向量路由算法(DV):迭代时,仅在两个直接相连邻居之间交换报文;当链路费用改变时,只有该链路相连的节点的最低费用路径发生改变时,才传播已经、改变的链路费用。


收敛速度
LS:需要O(nE)个报文和O(n^2)的搜寻。
DV:收敛较慢。可能会遇到选路回环,或计数到无穷的问题。


健壮性:当一台路由器发生故障、操作错误或受到破坏时
LS:路由器向其连接的一条链路广播不正确费用,路由计算基本独立(仅计算自己的转发表),有一定健壮性。
DV:一个节点可向任意或所有目的节点发布其不正确的最低费用路径,一个节点的计算值会传递给它的邻居,并间接地传递给邻居的邻居,好消息传得快,坏消息传得慢!。


参考文章:https://blog.csdn.net/weixin_42374938/article/details/119349738

八、路由器的转发

网络层协议不再是端到端的服务了,而是一个在路由器间都需要的服务。
转发(forwarding):将分组从路由器的输入端口转移到合适的输出端口。
使用转发表。
image.png

8.1 最长前缀匹配简述

最长前缀匹配机制(Longest Prefix Match Algorithm)是目前行业内几乎所有的路由器都缺省采用的一种路由查询机制。
当路由器收到一个IP数据包时,它会将数据包的目的IP地址与自己本地路由表中的所有路由表进行逐位(Bit-By-Bit)对比,直到找到匹配度最长的条目,这就是最长前缀匹配机制。


在使用 CIDR 时,路由表的每个项目的组成 ,<网络前缀,下一跳地址>。在查找路由的时候可能会得到不止一个匹配的结果。此时应当从匹配结果中选择具有最长网络前缀的路由。因为网络前缀越长,其地址块就越小,路由就越具体。

举例

已知: 收到的分组的目的地址 D = 206.0.71.128
路由表中的项目:
206.0.68.0/22
206.0.71.128/25

问:分组发往哪个地址?


求解思路

将子网掩码与目的地址相与,确定该目的地址是否属于该子网内部如果两者都属于,则选择网络前缀(掩码)最长的

求解过程

  1. 先用 D 和第一个(206.0.68.0/22)下一跳地址的子网掩码相与

206.0.71.128 and 11111111.11111111.11111100.00000000(22位1的子网掩码)

结果:
206.0.01000100.0 也就是 206.0.68.0
说明匹配。

  1. 再用 D 和第二个下一跳地址的子网掩码相与

206.0.71.128 and 11111111.11111111.11111111.10000000
结果是
也是206.0.71.128
也匹配。
这个时候由于两个子网都匹配,选择最长的网络前缀匹配,也就是 206.0.71.128

8.2 层次化路由

背景:将大规模的网络构成图的形式过于理想化,通过链路状态路由等算法进行计算的路由表几乎无法存储。
将某个区域内的路由器聚合在一起,称为自治系统(AS,autonomous system),在同一个自治系统内可以采取某种路由算法,对于上层自治系统之间也可以进行某种路由算法。


网关路由器(Gateway Router):位于自治系统边缘,与其他自治系统交换信息。


下图展示一个互联的自治系统:
f42c4ba0009d9124e915ff473bcb02c.png
如果AS3有信息需要交给AS2,在上图中,就必须由AS1进行转交
AS1必须学习哪些网络可以通过AS2到达,哪些可以通过AS1到达。这些学习到的东西必须传播给AS1内部的路由器。 image.png

8.3 RIP路由信息协议

路由信息协议基本概述
  1. RIP(Routing Information Protocol)路由信息协议,服务于内部网关协议IGP。
  2. 使用的是距离矢量路由算法(DV算法)
  3. 使用传输层用户数据报UDP协议进行传送,端口520
  4. 按固定的时间间隔交换路由信息,时间默认30s
  5. RIP协议中“距离”定义为“跳数”,每经过一个路由,跳数加1.
  6. 为了防止无穷计数问题,最大跳数是15,16相当于不可达。

2021051919244733.png


RIP详细描述

  1. 简单,适用于小型同类网络

  2. 通过广播UDP报文来交换路由信息,是传输层封装的协议,应当属于应用层,但是本质属于网络层

  3. RIP简单的将网络的距离定义为“跳数”。路由器与路由器直连的距离都是1,每经过一个路由器,跳数就加1,RIP认为一个好的路由就是它通过的路由器的数目少。RIP限定了无穷大等于16跳。所以实际上RIP能支持的网络规模很小,在一条路由上若超过了15台路由器,那么RIP就认为不可达

  4. RIP每30秒发送一次路由信息更新。这样作的目的是防止路由器出现故障后无法通告给邻居导致无法保证路由的有效性。

  5. 由于RIP协议是基于距离向量算法的协议,所以RIP具有好消息传的快,坏消息传的慢的特点。可能导致路由回路。

image.png


8.4 OSPF开放最短路径优先

OSPF协议
全称:Open Shortest Path First,开放最短路径优先
采用链路状态路由算法,迪杰斯特拉。
LS分组扩散,每个路由器构造完整的AS拓扑图。
OSPF通告中每个入口对应一个邻居。
OSPF通告在整个AS范围进行泛红:OSPF报文直接封装到IP数据报之中。
IS-IS协议和OSPF协议很像

OSPF协议的优势

安全:所有OSPF报文可以被认证(预防恶意入侵)。
允许使用多条相同费用的路径(RIP只能一条),实现负载均衡。
支持单播路由与多播路由。
OSPF可以划分两层区域分为主干区和局部区。引入了区边界路由器实现了区域之间的通信,它既是主干区的路由器也是其他区的路由器。 image.png

image.png


8.5 BGP外部网关协议

前面介绍了RIP协议、OSPF协议,它们是内部网关协议,本文介绍外部网关协议,Border Gateway Protocol,即AS之间使用协议即BGP协议
18464438-5e786ecd92e03bcb.webp
由于互联网规模太过庞大,所以AS之间进行路由十分困难,因此,外部网关协议BGP 只能是力求寻找一条能够达到目的网络且比较好的路由,而并非最佳路由。BGP采用了路径向量路由选择协议


18464438-29af88b8d4e45c21.webp
BGP协议的特点

  1. 主要和边界路由器进行通信,也就是AS边界的BDP发言人。
  2. 用于交换可达性信息。
  3. 每次发生变化时就要更新有变化的部分。
  4. BGP支持无分类域间路由选择CIDR,因此BGP路由表中包括目的网络前缀,下一跳路由器,以及达到该目的网络所要经过的自治系统序列。
  5. 一个BGP发言人与其他自治系统中的BGP发言人要交换信息,首先需要建立TCP连接(端口号179),然后在此连接上交换BGP报文以建立BGP会话,利用BGP会话交换路由信息。所以,BGP协议是应用层协议,借助TCP传送。 18464438-f232d1b1d9ddee41.webp

BGP协议总结: 18464438-0f55e1b8727dab34.webp

8.6 三种路由协议比较

RIP和OSPF还有ISIS协议属于域内路由协议,BGP属于域间路由协议
18464438-5c07407e87869ba0.webp

感谢路由协议原作者