0%

计算机网络-网络层

数据链路层 是专注于两个设备之间的 交互连接,而网络层则是为了跨区域之间的交流。

网络层

概述

image-20201206191411763

与 IP 协议配套使用的还有三个协议:

  • 地址解析协议 ARP(Address Resolution Protocol)
  • 网际控制报文协议 ICMP(Internet Control Message Protocol)
  • 网际组管理协议 IGMP(Internet Group Management Protocol

IP数据报格式

image-20201206191956087
  • 版本 : 有 4(IPv4)和 6(IPv6)两个值;
  • 首部长度 : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为固定部分长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
  • 区分服务 : 用来获得更好的服务,一般情况下不使用。
  • 总长度 : 包括首部长度和数据部分长度。
  • 生存时间 :TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报。
  • 协议 :指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等。
  • 首部检验和 :因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
  • 标识 : 在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。
  • 片偏移 : 和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。

IP地址编址方式

IP 地址的编址方式经历了三个历史阶段。

1. 分类

分类的的方法就是将 IP地址划分位固定的两段,一段是网络号,一段是主机号。IP 地址 ::= {< 网络号 >, < 主机号 >}。有ABCD四类地址,前三类的就是网络号和主机号的长度分配不同。对于拥有大量节点的少部分网络,使用A类网络,因为主机号长度更长。对于主机数量少的就用C类网络。

路由器仅根据目的主机的网络号来转发分组,从而减小路由表所占用的存储空间以及查找路由表的时间。

image-20210516194527774

2. 子网划分

可以看出,两级 IP 地址 不够灵活, 对 IP 地址空间的利用率比较低。如, C 类地址的局域网最多分配 254 个主机号, B 类地址的局域网最多分配 65534 个主机号。如果有个单位有 255 台主机,则只能为其分配一个 B 类地址的 网络号。这样就会浪费很多 IP 地址

子网划分 将之前的主机号 进一步划分为 子网号(subnet-id)主机号,三级IP地址,从而提高 IP地址 的利用率。路由器将子网掩码和目标地址进行按位与操作,从而得到目标网络的网络号子网号, 进而将数据包发送到相应的网络中去。

image-20210516194627674

可变长度子网掩码 允许将网络划分为不同大小的子网, 每个主机和路由器端口除了分配一个 IP 地址,还需要配置一个子网掩码,以确定其所在子网的规模。如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。

3. 无分类

前两种 A、B、C 类IP地址编址方式网络号都为8的倍数,其划分不够精细,存在很大程度的浪费。因为大部分机构都倾向于申请B类网络,以避免同一个机构需要管理多个类别的网络的问题,所以B类网络用的很快啊。基于此,无分类编址方式CIDR应运而生。CIDR消除了传统的A类、B类和C类地址及划分子网的概念, 将 IP 地址分为网络前缀(network-prefix)主机号 两部分,可以更加有效地分配IPv4的地址空间(可以把多个C类网络聚合成为一个给机构使用,例如一个C类网络主要是能用最低8位254个主机,那么使用如果把低10位都保留给主机段,将22作为前缀分配个机构,就保证机构获得的IP地址中能接入的主机数更多,即划分不够精细的问题得到解决)

使用 CIDR 记法(IP 地址后面加上斜线,然后写上网络前缀所占位数)记录 IP 地址。如:128.14.35.7/20

CIDR把网络前缀都相同的连续IP地址组成一个“CIDR地址块”。我们只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的起始地址(最小地址)和终止地址(最大地址),以及地址块中的地址数。

CIDR 的地址掩码可以继续为子网掩码,子网掩码首 1 长度为网络前缀的长度。虽然,“CIDR不使用子网”,是指CIDR中并没有在32位地址中指明若干位作为子网字段。但分配到一个CIDR地址块的单位,仍然可以在本单位内根据需要划分出一些子网。这些子网也都只有一个网络前缀和一个主机地址号,但子网的网络前缀比整个单位的网络前缀要长一些。

一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网

在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。

地址解析协议ARP (局域网)

网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。(图示的是一个局域网之间的连接,局域网内的IP无重复,局域网中设备通信使用内网IP,但是如果要访问外网,是通过网关以公网IP的形式访问的,因此不同局域网中的设备可能会有相同的 IP地址 但是公网IP全球唯一,由运营商提供)

image-20201206192612627

ARP 实现由 IP 地址得到 MAC 地址 每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。

image-20201206193111967

ICMP协议

一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。ICMP是基于IP协议工作的,但是它并不是传输层的功能。ICMP协议就是这个作用:

  1. 确认IP包是否成功到达目标地址
  2. 通知在发送过程中IP包被丢弃的原因
image-20201206193518864

ICMP 报文分为差错报告报文和询问报文

ping

Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。 Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。

Traceroute

Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。

  • 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;
  • 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
  • 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
  • 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。

虚拟专用网 VPN

IP地址有两类:

  • 本地地址——仅在机构内部使用的 IP 地址,可以由本机构自行分配,而不需要向因特网的管理机构申请。
  • 全球地址——全球唯一的IP地址,必须向因特网的管理机构申请。

RFC 1918 指明的专用地址

  • 10.0.0.0 ~ 10.255.255.255
  • 172.16.0.0 ~ 172.31.255.255
  • 192.168.0.0 ~ 192.168.255.255

这些地址只能用于一个机构的内部通信(局域网用),而不能用于和因特网上的主机通信。在因特网中的所有路由器对目的地址是专用地址的数据报一律不进行转发。

而虚拟专用网VPN技术实现的功能就是使全球地址也能访问本地地址。VPN技术的实质就是在互联网上传输私有数据,但是使用Internet传输私有数据是不安全的。可以通过采取一定的安全措施使得这个传输过程变得安全,比如采用PPTP 或 L2TP等传输协议对数据进行加密和拨号前进行身份验证等。通过这些手段相当于建立了一段安全的专线,可以不安全的环境安全地传输私有数据,这就叫做虚拟专用网络

image-20201206220955214

若远程用户想要访问WebServer,先要向公司内部配置好的远程访问服务器拨号,拨号拨通之后,远程访问服务器就会给远程用户一个私网地址:10.0.0.8。即远程用户获得了两个IP地址:一个公网地址23.23.2.20,拨号后获得的一个私网地址10.0.0.8。然后该用户就有能力访问企业内网的WebServer了。当远程用户与企业内网WebServer通信时,数据包中的源地址和目标地址都为私网地址,但是互联网上的路由器不转私网数据包。解决方法为:(关键就是 套了两层 源地址 目标地址 最外层就是在互联网中必备的 公网IP,内层是VPN服务器给他分的局域网IP和目标主机局域网IP

  • 远程用户在公网上访问企业内部服务器RAS时,先使用RAS服务器分配的私网地址作为数据包的源地址,企业内网的WebServer地址作为目标地址组成局域网数据包。然后远程用户再使用自己的公网地址作为源地址,RAS服务器的公网地址作为目标地址对局域网数据包进行封装,组成广域网数据包。由于广域网数据包的目标地址和源地址都为公网地址,所以数据包可以通过互联网顺利中转到企业内的RAS服务器上。
  • 收到广域网数据包后,RAS服务器再去掉其中的公网目标地址和源地址,把数据包还原为局域网数据包,最后中转给WebServer。
  • 同样的,从WebServer发出的数据包,经过远程访问服务器RAS中转至公网前,先对数据包进行封装,加上一层公网的目标地址和源地址
  • 即远程用户和企业内配置好的远程访问服务器RAS都拥有一个私网地址和一个公网地址,在公网上通信时使用广域网数据包,在私网内通信时使用局域网数据包。

网络地址转换 NAT

专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。(和VPN的区别在于,用NAT可以使得内网的主机访问互联上的资源,但是 互联网上其他用户不能主动通过NAT访问内网的机器,所以这时候就要用VPN)。

原始的NAT不对端口映射,例如校园网只有3个公网IP,那么当内网的用户要访问互联网时,就需要把内网IP 和 公网 IP对应,然后数据包以公网IP为源目标的形式发出去,收数据包的时候再替换。这样很消耗IP。现在的NPAT其实将传输层端口和内网IP都进行了映射,即便只有一个公网IP,每个需要访问外网的内网用户 都使用这个 公网IP和互联网通信,只不过将内网IP和端口号一起映射了。

image-20201206221613385

路由器结构

image-20201206224057134

路由器从功能上可以划分为:路由选择和分组转发。 分组转发结构由三个部分组成:交换结构、一组输入端口和一组输出端口。

转发流程:

  1. 从数据报的首部提取目的主机的IP地址D,得出目的网络地址位N.

  2. 若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要再经过其他的路由器,直接把数据报交付目的主机(这里包括把目的主机地址D转换为具体的硬件地址,把数据报封装成MAC帧,再发送此帧。),否则,就是间接交付,执行(3)

    • A发出目的地为C的IP数据报,查询路由表发现下一跳为E
    • A将IP数据报交给数据链路层,并告知目的MAC地址是E (ARP)
    • 数据链路层填充源MAC地址A目的MAC地址E
    • 数据链路层通过物理层将数据发送给E
  3. 路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器,否则,执行(4)

  4. 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器,否则,执行(5)。

  5. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行(6).

  6. 报告转发分组出错。

数据帧每一跳的MAC地址都在变化(源MAC地址和目的MAC地址), 但是IP数据报每一跳的源和目标IP地址始终不变

路由选择协议

路由选择算法--更新-->路由表--供-->路由器分组转发时使用

image-20210516212802846

AS(Autonomous System)自治系统

自治系统是在单一技术管理体系下的多个路由器的集合,在自治系统内部使用内部网关协议(IGP)和通用参数来决定如何路由数据包,在自治系统间则使用AS间路由协议来路由数据包。

  • 自治系统AS内部的路由选择:RIP 和 OSPF
  • 自治系统间的路由选择:BGP

内部网关协议 RIP

这个和局域网 概念不一样。

RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。 (路由表 : 目的网络IP 距离 到达目的网络的下一跳网络)

距离向量算法:

  • 相邻路由器X 将他的路由表发给 当前路由器W,先修改受到的路由表中所有下一条地址为 X 并把距离字段 加 1
  • 对修改后的RIP报文的每个项目做如下操作:
    1. 若收到的路由表中的项 若 目的网络H 在当前路由表中不存在,则将其添加到W的路由表中,那么此时 W就知道 要去H网络的下一跳是X。
    2. 若W的路由表中有下一跳为X的项目,则将他们都更新为 X 新发过来的项目 (因为X发过来的路由表是它更新过的,肯定是最新且最短的)
    3. 若W的路由表中 到目的网络的距离大于 收到的路由表中到达相同目的网络的距离 则 替换为最短的 如 原本到Net2 的距离是5,下一跳节点是P,而受到的来自X的路由表中 到Net2的距离是4(下一条一定是X),那么就用这个短的。
  • 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16

RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。

image-20201207194718827

内部网关协议 OSPF

开放最短路径优先 OSPF,是为了克服 RIP 的缺点而开发出来的。 开放表示 OSPF 不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了 Dijkstra 提出的最短路径算法 SPF。OSPF 具有以下特点:

  • 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。
  • 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。
  • 只有当链路状态发生变化时,路由器才会发送信息。

所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。

外部网关协议 BGP

AS 之间的路由选择很困难,主要是由于:

  • 互联网规模很大;
  • 各个 AS 内部使用不同的路由选择协议,无法准确定义路径的度量;
  • AS 之间的路由选择必须考虑有关的策略,比如有些 AS 不愿意让其它 AS 经过。

BGP 只能寻找一条比较好的路由,而不是最佳路由。每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信息。

image-20201207195714344