程序员不得不会的计算机科班知识——计算机网络篇(下)

190 阅读59分钟

计算机科班知识整理专栏系列文章:

【1】程序员不得不会的计算机科班知识——操作系统篇(上)
【2】程序员不得不会的计算机科班知识——操作系统篇(下)
【3】程序员不得不会的计算机科班知识——数据库原理篇(上)
【4】程序员不得不会的计算机科班知识——数据库原理篇(下)
【5】程序员不得不会的计算机科班知识——数据结构与算法篇(上)
【6】程序员不得不会的计算机科班知识——数据结构与算法篇(下)
【7】程序员不得不会的计算机科班知识——软件工程篇(上)
【8】程序员不得不会的计算机科班知识——软件工程篇(中)
【9】程序员不得不会的计算机科班知识——软件工程篇(下)
【10】程序员不得不会的计算机科班知识——编译原理篇(上)
【11】程序员不得不会的计算机科班知识——编译原理篇(中)
【12】程序员不得不会的计算机科班知识——编译原理篇(下)
【13】程序员不得不会的计算机科班知识——计算机网络篇(上)
【14】程序员不得不会的计算机科班知识——计算机网络篇(中)
【15】程序员不得不会的计算机科班知识——计算机网络篇(下)

第五章 网络层

5.1 网络层引入

5.1.1 网络层简介

  • 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输

  • 这些异构型网络N1~N7如果只是需要各自内部通信,他们只要实现各自的物理层和数据链路层即可。但是如果要将这些异构型网络互连起来,形成一个更大的互联网,就需要实现网络层设备路由器。有时为了简单起见,可以不用画出这些网络,图中N1~N7,而将他们看做是一条链路即可

  • 要实现网络层任务,需要解决以下主要问题:
    • 网络层向运输层提供怎样的服务(“可靠传输”还是“不可靠传输”): 我们在之前的课程中曾介绍过数据包在传输过程中可能会出现误码,也有可能由于路由器繁忙而被路由器丢弃,还有可能出现按序发送的数据包,不能按序到达接收方。如果网络层对于上述传输错误不采取任何措施,则提供的是不可靠传输服务。如果网络层对于上述传输错误采取措施,并使得接收方能正确接收发送方所发送的数据包,则提供的是可靠传输服务。

    • 网络层寻址问题:我们来举例说明,这是网络N1 上两个路由器接口各自所分配的IP 地址。他们的前三个数是相同的,可以看作是他们所在网络的网络编号,而第四个数各不相同,用于区分这两个不同的路由器接口。

    • 路由选择问题:我们来举例说明。如图所示,数据包从源站到达目的站可以走这样一条路径,也可以走这样一条路径,对于本例还有其他路径可走,我们就不一一演示了。那么路由器收到数据包后是依据什么来决定将数据包从自己的哪个接口转发出去的呢?这个问题在前面曾简单介绍过,不知大家是否还记得。没错,依据的是数据包中的目的地址和路由器中的路由表。

      路由器收到数据后,是依据什么来决定将数据包从自己的哪个接口转发出去?依据数据包的目的地址和路由器中的路由表。

      但在实际当中,路由器是怎样知道这些路由记录?

      (1)由用户或网络管理员进行人工配置,这种方法只适用于规模较小且网络拓扑不改变的小型互联网。

      (2)另一种是实现各种路由选择协议,由路由器执行路由选择协议中所规定的路由选择算法,而自动得出路由表中的路由记录,这种方法更适合规模较大且网络拓扑经常改变的大型互联网

5.1.2 网络层性质

  • 从发送主机到接收主机的传输段(而 传输层 为应用进程之间提供端到端的逻辑通信。)
  • 发送端将段封装到数据报中(datagrams),接收端将datagrams中的delivers segments拿出来递交给传输层
  • 网络层模块在每一个主机的每一个路由器都存在

5.1.3 两个关键的网络层功能

  • 转发(forwarding):将数据包从路由器的输入到适当的路由器输出
  • 路由(routing):确定报文经过的路由,从源头到终点。(路由算法)

路由算法通过网络转发表决定本路由器上的本地转发

5.1.4 VC和datagram有什么区别

  • 数据报(datagram)网络与虚电路(virtual-circuit)网络是典型两类分组交换网络
  • 数据报网络提供网络层无连接服务
  • 虚电路网络提供网络层连接服务
  • 类似于传输层的无连接服务(UDP)与面向连接服务(TCP),但是网络层服务:
    • 主机到主机服务
    • 网络核心实现

5.2 网络层IP协议

5.2.1 NAT

5.2.1.1 NAT概述

NAT:network address translation 网络地址变换

其实某些机构并不需要连接到因特网,只需要与内部的主机通信,这样如果还是按照全球IP地址去分配,则会大大浪费IP地址。

例如,100个机构各有100台主机,假设现在100个机构都分配全球IP 地址,就需要10000个全球IP地址,但是现在从所有的全球IP地址里面划分出100 个IP地址专门用作一些只需内部通信的机构使用,即100个机构都使用这100个地址,只需要100个IP地址就解决问题了。这100个IP地址在计算机网络中被称为专用地址,且路由器看到专用地址时不转发,所以说专用地址作为目的地址是不可能在因特网上传送的。因特网已经规定了以下地址作为专用地址。

10.0.0.0~10.255.255.255 (相当于一个A类网络)。

172.16.0.0~172.31.255.255 (相当于16个连续的B类网络)。

192.168.0.0~192.168.255.255 (相当于256个连续的C类网络)。

这种采用专用IP地址的互联网络称为专用互联网或本地互联网,或直接称为专用网。专用IP地址也叫作可重用地址。问题出现了,如果专用网的主机想和因特网的主机通信,怎么办?这时NAT就诞生了。NAT就是将专用网内部使用的本地IP地址转换成有效的外部全球IP地址,使得整个专用网只需要一个全球IP地址就可以与因特网连通。

由于这些本地IP地址是可重用的,因此NAT技术可大大节省IP地址的消耗。使用NAT技术,需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫作NAT路由器,它至少有一个有效的外部全球IP地址。但是NAT并不能从根本上解决IP地址的耗尽问题,因为NAT并没有增加IP地址的个数。而真正解决IP地址耗尽问题的是IPv6。

NAT使能路由器对于外部世界来说甚至不像一台路由器。相反NAT路由器对外界的行为就如同一个具有单一P地址的单一设备。在图中,所有离开家庭路由器流向更大因特网的报文都拥有一个源P地址138.76.29.7,且所有进入家庭的报文都拥有同一个目的P地址138.76.29.7。从本质上讲,NAT使能路由器对外界隐藏了家庭网络的细节。

家庭网络计算机是从哪儿得到其地址,路由器又是从哪儿得到它的单一IP地址的。在通常的情况下,答案是相同的,即DHCP!路由器从ISP的DHCP服务器得到它的地址,并且路由器运行一个DHCP服务器,为位于NAT-DHCP路由器控制的家庭网络地址空间中的计算机提供地址。

5.2.1.2 NAT转换表与示例

如果从广域网到达NAT路由器的所有数据报都有相同的目的IP地址(特别是对NAT 路由器广域网一侧的接口),那么该路由器怎样知道它应将某个分组转发给哪个内部主机呢?

使用NAT路由器上的一张NAT转换表(NAT translation table),并且在项中包含了端口号及其IP地址。

考虑上图中的例子。

1️⃣ 假设一个用户坐在家庭网络主机10.0.0.1后,请求IP地址为128.119.40.186的某台Web服务器(端口80)上的一个Wb页面。主机10.0.0.1为其指派了(任意)源端口号3345并将该数据报发送到LAN中。

2️⃣ NAT路由器收到该数据报,为该数据报生成一个新的源端口号5001,将源P替代为其广域网一侧接口的IP地址138.76.29.7,且将源端口3345更换为新端口5001。当生成一个新的源端口号时,NAT路由器可选择任意一个当前未在NAT转换表中的源端口号。(注意到因为端口号字段为16比特长,NAT协议可支持超过60000个并行使用路由器广域网一侧单个P地址的连接)

3️⃣ 路由器中的NAT也在它的NAT转换表中增加一表项。Wb服务器并不知道刚到达的包含HTTP请求的数据报已被NAT路由器进行了改装,它会发回一个响应报文,其目的地址是NAT路由器的IP地址,其目的端口是5001。

4️⃣ 当该报文到达NAT路由器时,路由器使用目的IP地址与目的端口号从NAT转换表中检索出家庭网络浏览器使用的适当IP地址(10.0.0.1)和目的端口号(3345)。于是,路由器重写该数据报的目的P地址与目的端口号,并向家庭网络转发该数据报。

进出都要涉及变换,因此会使通信效率下降。

5.2.2 ICMP

5.2.2.1 ICMP概述及分类

  • Internet Control Message Protocol 网络控制报文协议

  • 主机在发送数据报时,经常会由于各种原因发送错误,如路由器拥塞丢弃了或者传输过程中出现错误丢弃了(注意:如果是首部出错,当然可以发,但是一般都不发,因为首部中错很有可能是源IP地址都错了,所以即使发了源主机也不一定收到)。如果检测出错误的路由器或主机都能把这些错误报告通过一些控制消息告诉发送数据的主机,那么发送数据的主机就可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据报(比如ICMP报文发过来的是改变路由,那么主机就不能继续按照这个路由线路发送了,需要用另外一条路由线路发送数据)。尽管这些控制消息并不传输用户数据,但是对于用户数据的传递起着重要的作用。

  • ICMP报文分为两种,即ICMP差错报告报文和ICMP询问报文。

  • TTL:寿命,IP包被路由器丢弃前允许通过的最大网关数量

5.2.2.2 ICMP差错报告报文的分类

  • 终点不可达。当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。
  • 源站抑制。当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
  • 时间超过。当IP分组的TTL值被减为0后,路由器除了要丢弃该分组外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
  • 参数问题。当路由器或目的主机收到的数据报的首部中有字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文(现在一般都不发)。
  • 改变路由(重定向)。路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给其他的路由器(比当前更好的路由)。

5.2.2.3 ICMP询问报文的分类

  • 有回送请求和回答报文。
  • 时间戳请求和回答报文。
  • 掩码地址请求和回答报文。
  • 路由器询问和通告报文。

5.2.2.4 不应发送ICMP差错报告报文的几种情况

  • 对ICMP差错报告报文不再发送ICMP差错报告报文。
  • 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文。
  • 对具有组播地址的数据报都不发送ICMP差错报告报文。
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文。

5.2.2.5 ICMP的两个典型应用

  • ping 用来测试两个主机之间的连通性。ping 使用了ICMP回送请求与回送回答报文。ping 是应用层直接使用网络层ICMP的例子,它没有通过传输层的TCP或UDP。
  • tracert(使用UDP)可以用来跟踪分组经过的路由,它工作在网络层。

5.3 IP地址

5.3.1 简介

IP地址:32位主机标识符,路由器的接口

接口:主机/路由器与物理链路的连接

路由器通常有多个接口,主机通常有一个或两个接口,IP地址与每个接口相关联。

(narrow waist of the internet指的是ip协议)

modularity:模块化

scalability:可扩展性

interoperability:互操作性

efficiency:效率

5.3.2 子网(Subnets)

5.3.2.1 子网引入

  • 子网:由两个及两个以上的IP高位相同的相互连接的网络称为子网。
  • 子网可以直接在物理上进行直接传输。
  • 设备接口的IP地址的子网部分相同
  • Gan不需要干预路由器
  • 分配子网最重要的一个原因:减少广播域

三个子网:

六个子网:

5.3.2.2 子网IP划分

现在使用的三级IP地址包含网络号、子网号、主机号。

一个子网划分纯属是一个局域网内部的事情,对外是透明不可视的。子网内部的每一个IP各不相同,都使用着一个公共IP。

例如,这两种分法都是有可能的: a44176cf439fb875a11c6f00c262db5.jpg

  • IP地址的专业写法:IP地址+/前缀位数#,如192.168.0.5/25。(前缀位数即网络号,子网掩码中有#位为1)

5.3.3 子网掩码(subnet masking)

5.3.3.1 子网掩码引入

  • 子网掩码是一个应用于 TCP/IP 网络的32位二进制值,每节 8 位,必须结合IP地址对应使用。 (常见的 255.255.255.0 等)
  • 子网掩码 32 位都与 IP 地址 32 位对应,如果某位是网络地址部分(网络号部分和子网号部分)则对应的位全为“1”,如果是主机号部分则对应的位全为“0”。(11111111.11111111.11111111.0)
  • 子网掩码(subnet masking)的功能是告知主机或路由设备,地址的哪一部分是网络号,包括子网的网络号部分,哪一部分是主机号部分。
  • 子网掩码可以分离出 IP 地址中的网络地址和主机地址,用于判断该 IP 地址是在局域网上,还是在广域网上。
  • 子网掩码一般用于将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而 IP 浪费。

5.3.3.2 子网掩码使用原因

从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分,因为 IP 地址本身及数据报的首部没有包含任何关于有关子网划分的信息。使用子网掩码 (subnet mask) 可以找出 IP 地址中的子网部分。

5.3.3.3 子网掩码是一个重要属性

  • 子网掩码是一个网络或一个子网的重要属性。
  • 路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。
  • 路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
  • 若一个路由器连接在两个子网上,就拥有两个网络地址和两个子网掩码。

5.3.3.4 默认子网掩码

image.png

5.3.3.5 子网掩码的使用

  • 网络号:IP地址和子网掩码进行与运算得到网络号。
  • 子网号:子网掩码 32 位都与 IP 地址 32 位对应,如果某位是网络地址(网络号部分和子网号部分)则对应的位全为“1”,如果是主机号部分则对应的位全为“0”。将子网掩码中“1”的位数减去该类的默认子网掩码的“1”的位数即为子网号位数。
  • 主机号:子网掩码取反再和 IP 地址做与运算得到主机号。

5.3.4 CIDR无类别域间路由选择

classless interdomain routing无类别域间路由选择

作用:现行的IPv4(网际协议第4版)的地址将耗尽,这是一种为解决地址耗尽而提出的一种措施。它是将好几个IP网络结合在一起,使用一种无类别的域际路由选择算法,可以减少由核心路由器运载的路由选择信息的数量。

a.b.c.d/x 代表高x 位是子网部分.

5.3.5 DHCP动态主机配置协议

  • Dynamic Host Configuration Protocol动态主机配置协议:给主机动态地分配IP地址
  • 他是一个应用层协议,DHCP报文使用UDP传输
  • 它提供了即插即用连网的机制,这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与。例如,现在有一台主机需要 IP地址。在该主机启动时就可以向DHCP服务器广播发送报文,将源地址设置为0.0.0.0,目的地址设置为255.255.255.255(特殊IP地址)。这时主机就成为DHICP 的客户,发送广播报文主要是因为现在该主机还不知道DHCP在哪,这样在本网络上的所有主机都能够收到该广播报文,但是只有DHCP服务器能够应答。DHCP服务器先在其数据库中查找该计算机的配置信息,若找到,则返回找到的信息,若找不到,则从服务器的IP地址池中取一个地址分配给该计算机。
  • DHCP服务器和DHCP客户端的交换过程如下(4路广播):

1️⃣ DHCP客户端广播“DHCP discover”报文,试图找到网络中的DHCP服务器,服务器获得一个IP地址

2️⃣ DHCP服务器收到报文后,就向网络中广播“DHCP offer”报文,其中包括提供DHCP客户端的IP地址和相关配置信息

3️⃣ DHCP客户机收到“DHCP offer”报文,如果接受DHCP服务器所提供的相关参数,则通过广播“DHCP request”报文向DHCP服务器请求提供IP地址。

4️⃣ DHCP服务器广播“DHCP ack”报文,将IP地址分配给DHCP客户机。同时其他DHCP 服务器将其IP 地址收回。

DHCP允许网络上配置多台DHCP服务器,当DHCP客户发出DHCP请求时,就有可能收到多个应答报文。这时,DHCP客户只会挑选其中的一个,通常是挑选“最先到达的报文。

  • 除了主机IP地址分配以外,DHCP还允许一台主机得到其他信息:
    • 它的子网掩码
    • 它的第一条路由器地址(默认网关)
    • 它的本地DNS服务器地址

5.4 IPv4

5.4.1 IPv4引入

网际协议版本4(英语:Internet Protocol version 4,缩写:IPv4,又称互联网通信协议第四版)是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署和使用的版本。其后继版本为IPv6。

IPv4是一种无连接的协议,操作在使用分组交换的链路层(如以太网)上。此协议会尽最大努力交付数据包,意即它不保证任何数据包均能送达目的地,也不保证所有数据包均按照正确的顺序无重复地到达。这些方面是由上层的传输协议(如传输控制协议)处理的。

5.4.2 IPv4数据报格式

  • 版本(ver):指定IP数据报中使用的IP协议版本,占4位。IPv4对应值为4(0100)
  • 首部长度(head len):指示IP数据报头部的总长度,占4位。IP数据报头部的总长度以4字节为单位(即4字节的整数倍),最小为54=20bytes,最大为154 = 60bytes。
  • 区分服务(type of service):用于表示数据报的优先级和服务类型,占8位。包括一个3位长度的优先级,4位长度的标志位,最高位未用(不考)
  • 总长度(length):标识整个IP数据报的总长度,包括报头和数据部分,占16位,由此可知IPv4的最大长度为65535(64KB)
  • 标识(16-bit identifier):用于表示IP数据报的标识符,占16位,每个IP数据报有一个唯一的标识(不是序号)。当数据报分段时,这个标识的值就被复制到所有分段的标识字段中,相同的标识字段值使分段后的数据报分段最后能正确地重组成为原来的数据报。
  • 标志(flgs):指出该IP数据报后面是否还有分段,为分段标志,占3位,仅最低位有意义
  • 片偏移(fragment offset):指出该分段在数据报中的相对位置。相对于用户数据字段的起点,该字段从何处开始,占13位
  • 生存时间(time to live):TTL字段,标识IP数据报在网络中传输的有效期,以秒来计数,占8位。现在通常认为这个数值是指数据报允许经过的路由器数,当值为0时,就丢弃这个数据报。设定生存时间是为了防止数据报在网络中无限制地循环转发。
  • 协议(upper layer):用来标识此IP数据报在传输层所采用的协议类型(如TCP、UDP或ICMP等),以便使目的主机的IP层知道应将数据部分上交给哪个处理过程,占8位
  • 首部校验和(header checksum):用来检验IP数据报的包头部分(不含“数据”部分)在传输到接收端后是否发生了变化,占16位。因为数据报每经过一个路由器,路由器都要重新计算一下报头校验和
  • 源地址/目的地址(source/destination):分别表示该IP数据报发送者和接收者的IP地址,各占32位
  • 可变部分(options):用来支持各种选项,提供扩展余地,可用来支持排错、测量以及安全等措施。后面的填充字段就是为了保证IP数据报的报头是32位的整数倍。

一个数据包被路由器转发一次之后,data包头哪些字段一定会被修改:TTL,一定会被减1,包头不一样了,checksum也会变。

5.4.3 IPv4数据报分片

链路层所能传送的最大数据量为最大传送单元(Maximum Transmission Unit,MTU)。超过其最大传送单元的IP数据报会被分为多个更小的数据报,然后链路层对其进行封装为帧转发出去,小的数据报被称为片。(仅在最终目的地重新组合,包头用来识别、排序相关片段)

例如:

d0a75aa9eef8ddd9763c0412ceba8df.jpg

(通过数据包头的标识(16-bit identifier)位来识别这些碎片是来自同一数据包的,偏移量offset规定要除以8后才能填(第一个碎片offset为0),因为字段长度不够,如果fragflag=0,则说明该碎片是最后一个碎片。)

除不尽怎么办:说明切包切错了,每个碎片的包体都应该是8的整数倍,例如上述题的MTU=1498时,就不能按照(20,1478),(20,1478),(20,984)这样切包,因为1478不是8的整数倍。

应该找一个最接近MTU且减20后是8的整数倍的数来切,即1472,应该切为(20,1472),(20,1472),(20,1036)这样切包,他们的offset分别是0,184,368。

5.5 IPv6

5.5.1 IPv6引入

由于IPv4地址已经耗尽,因此必须采取相应的办法去解决。前面已经介绍过采用网址转换(NAT)方法以节省全球IP地址和采用无分类编址(CIDR)使IP地址的分配更加理。这两种方法仅是优化了IPV4地址的使用方法,并没有从根本上解决IP地址的耗尽向题而采用具有更大地址空间的新版本的IPv6才能在真正意义上解决IPv4即将耗尽的问题。

总结IPv6的主要特点:

  1. 更大的地址空间。IPv6将地址从IPv4的32位增大到了128位。
  2. 扩展的地址层次结构。因为地址多了,所以可以划分更多的层次。
  3. 灵活的首部格式。
  4. 改进的选项。
  5. 允许协议继续扩充。
  6. 支持即插即用(自动配置)。
  7. 支持资源的预分配。
  8. IPv6首部长度必须是8B的整数倍,而IPv4首部是4B的整数倍

虽然IPv6与IPv4不兼容,但总的来说它跟所有其他的因特网协议兼容,包括TCP、UDP、ICMP、DNS等,只是在少数地方做了必要的修改(大部分是为了处理长的地址)。IPv6相当好地满足了预定的目标,主要体现在以下3个方面:

  1. IPv6第一个主要改进也是最重要的,即IPv6有比IPv4长得多的地址。
  2. IPv6第二个主要改进是简化了IP分组的基本首部,它包含8个段(IPv4是12个段)。这一改变使得路由器能够更快地处理数据报,从而可以改善吞吐率。
  3. IPv6第三个主要改进是IPv6更好地支持选项。这一改变对新的分组首部很重要,因为一些从前是必要的段现在变成可选的了。此外,表示选项的方式也有所不同,使得路由器能够简单地跳过与它们无关的选项。这一特征加快了数据报处理速度。

5.5.2 IPv6数据报格式

IPv6的首部格式如下:

  • 优先级priority:确定流中数据报的优先级
  • 流标号flow label:识别相同“流”的数据报
  • 下一个报头next header:识别数据的上层协议

5.5.3 从IPv4转变到IPv6

IPv4和IPv6混合的网络将如何运行?

  • 隧道技术Tunneling
  • 双栈技术Dual-stack

1、 隧道技术 Tunneling

将IPv6(IPv4)的包整个封装到IPv4(IPv6)的包中

隧道技术不止这一种

2、双栈技术 Dual-stack

到达边缘路由器的时候将包进行转换(IPv4<->IPv6)

5.5.4 IPV4数据包格式和IPV6数据包格式的区别

参考博客:blog.csdn.net/weixin_4567…

image.png

5.6 路由算法

5.6.1 路由算法的种类

  • 路由器转发分组是通过路由表转发的,而路由表是通过各种算法得到的。如果从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则只有两大类,即静态路由选择策略(又称为非自适应路由选择)与动态路由选择策略(又称为自适应路由选择)。
  • 静态路由选择的特点是简单和开销小,但不能及时适应网络状态的变化。对于很小的网络,完全可以采用静态路由选择,自己手动配置每一条路由。
  • 动态路由选择的特点是能较好地适应网络状态的变化,但实现起来比较复杂,开销也较大。因此,动态路由适用于较复杂的网络。
  • 现代的计算机网络通常使用动态路由选择算法。动态路由算法又可分为两种基本类型:距离-向量路由算法和链路状态路由算法。
  • 全局性的路由算法:链路状态路由算法,维护一个全局的拓扑图。
  • 分散性的路由算法:距离-向量路由算法

5.6.2 链路状态算法(link state)

链路状态路由算法要求每个参与该算法的节点都有完全的网络拓扑信息,它们执行下述两项任务:

  • 主动测试所有邻接节点的状态。两个共享一条链接的节点是相邻节点,它们连接到同一条链路
  • 定期地将链路状态传播给其他所有节点

最常见的为dijkstra算法(迪杰斯特拉算法)

5.6.2.1 概述

  • 网络拓扑结构,所有节点都知道链路开销
  • 通过“link state broadcast”完成所有节点都有相同的信息
  • 计算从一个节点(“源”)到所有其他节点的最小开销路径
  • 迭代:经过k次迭代,知道到达k dest的最小代价路径

5.6.2.2 符号

  • C (x,y):节点x到y的链路开销;如果不是直接邻居=∞
  • D(v):从source到dest的路径开销的当前值
  • P (v):从源到v路径上的前继节点
  • N’:已知最小代价路径的节点集合

5.6.2.3 时间代价

  • 算法复杂度:n个节点
  • 每次迭代:需要检查所有节点w,而不是N
  • n (n +1)/2的比较:O (n^2)
  • 更有效的实现:O (nlogn)——优先队列
  • 可能会产生振荡:例如,链路成本=承载的流量

5.6.3 距离-向量路由算法(distance vector)

5.6.3.1 概述

不要求维护一个全局的拓扑图。

距离向量(Distance-Vector,DV)算法是一种迭代的、异步的和分布式的算法,而LS算法是一种使用全局信息的算法。

1️⃣ 分布式的:因为每个节点都要从一个或多个直接相连邻居接收某些信息,执行计算,然后将其计算结果分发给邻居。

2️⃣ 迭代的:此过程一直要持续到邻居之间无更多信息要交换为止。此算法是自我终止的,即没有计算应该停止的信号,它就停止了。

3️⃣ 异步的:是因为它不要求所有节点相互之间步伐一致地操作。

4️⃣ 自终止性

令dx(y)是从结点x到结点y的最低开销路径的开销,则该路径开销与Bellman-Ford方程相关:

方程中的minv是对于x的所有邻居的。Bellman-Ford方程是相当直观的。实际上,从x到v遍历之后,如果我们接下来取从v到y的最低开销路径,则该路径开销将是c(x, v) + dv(y)。因此我们必须通过遍历某些邻居v开始,从x到y的最低开销是对所有邻居v的c(x, v) + dv(y)的最小值。例如:

5.6.3.2 举例说明

该图最左边一列显示了这3个节点各自的初始路由选择表(routing table)。例如,位于左上角的表是节点x的初始路由选择表。在一张特定的路由选择表中,每行是一个距离向量一特别是每个节点的路由选择表包括了它的距离向量和它的每个邻居的距离向量。因此,在节点x的初始路由选择表中的第一行是Dx=[Dx(x) , Dx(y), Dx(z)] = [0,2,7]。在该表的第二和第三行是最近分别从节点y和z收到的距离向量。因为在初始化时节点x还没有从节点y和z收到任何东西,所以第二行和第三行表项中被初始化为无穷大。

初始化后,每个节点向它的两个邻居发送其距离向量。图5-6中用从表的第一列到表的第二列的箭头说明了这一情况。例如,节点x向两个节点y和z发送了它的距离向量,Dx = [0, 2, 7]。在接收到该更新后,每个节点重新计算它自己的距离向量。

第二列因此为每个节点显示了节点的新距离向量连同刚从它的邻居接收到的距离向量。注意到,例如节点x到节点z的最低开销估计Dx(z)已经从7变成了3。

从邻居接收更新距离向量、重新计算路由选择表项和通知邻居到目的地的最低开销路径的开销已经变化的过程继续下去,直到无更新报文发送为止。在这个时候,因为无更新报文发送,将不会出现进一步的路由选择表计算,该算法将进入静止状态,即所有的节点将执行DV算法的中的等待。该算法停留在静止状态,直到一条链路开销发生改变,如下面所讨论的那样。

5.6.3.3 链路开销改变与链路故障

当一个运行DV算法的节点检测到从它自己到邻居的链路开销发生变化时(I see a link cost change to neighbor w ),它就更新其距离向量并且如果最低开销路径的开销发生了变化,向邻居通知其新的距离向量。

1、好消息传达速度快

下图示了从y到x的链路开销从4变为1的情况。我们在此只关注y与z到目的地x的距离表中的有关表项。该DV算法导致下列事件序列的出现

1️⃣ 在t0时刻,y检测到链路开销变化(开销从4变为1),更新其距离向量,并通知其邻居这个变化,因为最低开销路径的开销已改变。

2️⃣ 在t1时刻,z收到来自y的更新报文并更新了其距离表。它计算出到x的新最低开销(从开销5减为开销2),它向其邻居发送了它的新距离向量。

3️⃣ 在t2时刻,y收到来自z的更新并更新其距离表。y的最低开销未变,因此y不发送任何报文给z。该算法进入静止状态。

因此,对于该DV算法只需两次迭代就到达了静止状态。在x与y之间开销减少的好消息通过网络得到了迅速传播。

2、坏的消息传送速度慢

假设x与y之间的链路开销从4增加到60,此时整个链路图变化如下:

1️⃣在链路开销变化之前,D,(x)=4,D,(z)=1,D(y)=1和D,(x)=5。在t0时刻,y检测到链路开销变化(开销从4变为60)。y计算它到x的新的最低开销路径的开销,其值为

当然,从网络全局的视角来看,我们能够看出经过z的这个新开销是错误的。但节点y仅有的信息是:它到x的直接开销是60,且z上次已告诉y,z能以开销5到x。因此,为了到达x,y将通过z路由,完全期望z能以开销5到达x。到了t1时刻,我们遇到路由选择环路(routing loop),即为到达x,y通过z路由,z又通过y路由。路由选择环路就像一个黑洞,即目的地为x的分组在1时刻到达y或z后,将在这两个节点之间不停地(或直到转发表发生改变为止)来回反复。

2️⃣ 因为节点y已算出到x的新的最低开销,它在t,时刻将该新距离向量通知z。

3️⃣ 在t1后某个时间,z收到y的新距离向量,它指示了y到x的最低开销是6。z知道它能以开销1到达y,因此计算出到x的新最低开销D z ( x ) = min{50+0,1+6} = 7。因为z到x的最低开销已增加了,于是它便在2时刻通知y其新开销。

4️⃣ 以类似方式,在收到z的新距离向量后,y决定D,(x)=8并向z发送其距离向量。接下来z确定D,(x)=9并向y发送其距离向量,等等。

以上的过程要一直迭代44次,直到z最终算出它经由y的路径开销大于50为止。这种坏消息会造成无穷计数问题。count to infinity。

5.6.3.4 算法改进:增加毒性逆转poisoned reverse

如果z通过y路由选择到目的地x,则z将通告y,它(即z)到x的距离是无穷大,也就是z将向y通告Dz(x) = ∞(即使z实际上知道Dz(x) = 5)。只要z经y路由选择到x,z就持续地向y讲述这个善意的谎言。因为y相信z没有到x的路径,故只要z继续经y路由选择到x(并这样去撒谎),y将永远不会试图经由z路由选择到x。

但是3个或更多节点(而不只是两个直接相连的邻居节点)的环路将无法通过该技术检测到。

5.6.4 LS算法和DV算法的比较

DV和LS算法采用互补的方法来解决路由选择计算问题。在DV算法中,每个节点仅与它的直接相连的邻居交谈,但它为其邻居提供了从它自己到网络中(它所知道的)所有其他节点的最低开销估计。LS算法需要全局信息。因此,当在每台路由器中实现时,每个节点(经广播)与所有其他节点通信,但仅告诉它们与它直接相连链路的开销。我们通过快速比较它们各自的属性来总结所学的链路状态与距离向量算法。记住N是节点(路由器)的集合,而E是边(链路)的集合。

  • 报文复杂性。我们已经看到LS算法要求每个节点都知道网络中每条链路的开销,这就要求要发送O(|N||E|)个报文。而且无论何时一条链路的开销改变时,必须向所有节点发送新的链路开销。DV算法要求在每次迭代时,在两个直接相连邻居之间交换报文。我们已经看到,算法收敛所需时间依赖于许多因素。当链路开销改变时,DV算法仅当在新的链路开销导致与该链路相连节点的最低开销路径发生改变时,才传播已改变的链路开销。
  • 收敛速度。我们已经看到LS算法的实现是一个要求O(|N||E|)个报文的O(|N|^2)算法。DV算法收敛较慢,且在收敛时会遇到路由选择环路。DV算法还会遭遇无穷计数的问题。
  • 健壮性Robustness。如果一台路由器发生故障、行为错乱或受到蓄意破坏时情况会怎样呢?

LS算法:节点可以通告错误的链路link开销;每个节点只计算自己的转发表

DV算法:节点可以通告不正确的路径path开销;每个节点的表被其他节点使用;错误通过网络传播

两个算法都有在使用。

5.7 路由协议

将路由器聚合成区域、自治系统(AS:Autonomous System)(BGP提供的实体之间的路由;BGP描述了其中一系列路径的中间部分。)

同一AS内的路由器运行相同的路由协议:内部网关协议(lInterior Gateway Protocols (IGP))。

不同AS中的路由器可以运行不同的AS内路由协议。

RIP(Routing Information Protocol,路由信息协议)是一种内部网关协议,采用DV算法。

OSPF(Open Shortest Path First,链路状态协议),采用LS算法。

边界网关协议BGP:broder gateway protocol,所有的AS运行相同的AS间路由选择协议。

  • 自治系统内部:采用LS算法或者DV算法选择路由
  • 自治系统之间:基于策略的路由选择(policy)——热土豆路由选择
    • 热土豆路由选择依据的思想是:对于路由器1b,尽可能快地将分组送出其AS(更明确地说,用可能的最低开销),而不担心其AS外部到目的地的余下部分的开销。
  • BGP:边界网关协议,在BGP中可能发生的导致不稳定的路由表的事情--策略振荡(policy oscilations)

第六章 链路层

6.1 链路层引入

6.1.1 概述

使用链路层协议,将IP数据报通过单一通信链路 从一个节点移动到相邻节点。(如下图中A,B为邻居节点,C,D为邻居节点)

节点:运行链路层协议的任何设备称为节点,包括:主机、路由器、交换机、WiFi接入点。

链路:沿着通信路径连接相邻节点的通信信道称为链路。

6.1.2 链路层提供的服务

  • 成帧(framing):在网络层数据报经链路传输之前,几乎所有的链路层协议都要将其用链路层封装成帧。一个帧由一个数据字段和若干首部字段组成,网络层数据报就在数据字段中。
  • 链路接入(link access):媒体访问控制(MAC)协议规定了帧在链路上传输规则,对于链路的一端仅有一个发送方和链路的另一端仅有一个接收方的点对点链路,MAC协议比较简单,即只要链路空闲,发送方都可以发送帧。MAC也可以协调广播中的多个节点的帧传输。
  • 可靠交付(reliable delivery):当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个网络层数据报。与运输层协议(TCP)可靠交付相比,链路层的可靠交付服务通常是通过确认和重传取得的。通常用于易于产生高差错率的链路(无线),其目的是纠正一个差错而不是重传数据。对于低比特差错的链路,包括光纤、同轴电缆等链路层的可靠交付会被认为是一种不必的开销。因此许多链路层协议不提供可靠交付服务。
  • 差错检测和纠正:当帧中一个比特作为1发送时,接收方节点中可能因为链路层硬件不正确地将其判断为0,这种比特差错是由信号衰减和电磁噪声导致的。通过发送节点在帧中包括差错检测比特,让接收节点进行差错检查。链路层差错检查通常由硬件实现。接收方不仅可以检测出比特差错,还可以检测出出错的位置

6.1.3 链路层在何处实现

下图显示了一个典型的主机体系结构。链路层主体部分是在网络层适配器中实现的,网络适配器有时也称为网络接口卡(NIC) 。位于网络适配器核心的是链路层控制器。该控制器一般是实现许多链路层服务的专用芯片。

在发送端,控制器取的了由协议栈较高层生成并存储在主机存储中的数据报,在链路层帧中封装该数据报,然后遵循链路接入协议将该帧传进通信链路中,在接收端,控制器接收了整个镇,抽取出网络层数据报没如果链路层执行差错检测,需要发送控制器在该帧的首部设置差错检测比特,由控制器执行差错检测。

图中显示了主机总线和连接的网络适配器,尽管大部分链路层是在硬件中实现的,但是部分链路层是运行于主机CPU上软件实现的。如组装链路层寻址信息和激活控制器硬件。在接收端,链路层软件响应控制器中断。处理差错条件和将数据报上报给网络层。

6.2 差错检测和技术纠正

6.2.1 引入

EDC:Error Detection and Correction bits (redundancy)(错误检测和纠正位(冗余))

比特级差错检测和纠正:从一个节点发送到另一个物理上连接的邻近节点的链路层帧中的比特损伤进行检测和纠正。要保护的数据不仅包括从网络层传输下来的数据报,而且包括链路帧首部中的链路级的寻址信息、序号和其他字段。差错检测和纠正技术使接收方有时但并不总是检测出已经出现的比特差错,即总有未检测出的比特差错。因此我们需要一个差错检测方案来减小这种事件的概率。

6.2.2 分类

6.2.2.1 奇偶校验(parity)

最简单的差错检测,在偶校验方案中,假设要发送多个比特数据,发送方只需要包含一个附加的比特,选择他的值,是的d+1比特中的1总数是偶数,对于奇校验方案,选择校验比特值有奇数个1。

但是如果分组中多个比特同时出错的话简单的奇偶校验就会有50%的概率未检测出。那么需要将奇偶校验升级一下:二维奇偶校验。

二维奇偶校验:将d个比特分为i行j列,如果出现单个比特比特差错,这时候包含比特的行和列都会出现差错,这时候接收方不仅可以检测出比特差错,还可以利用行和列来找到实际位置并纠正。

6.2.2.2 检验和方法(checksum)

在检验和技术中,d比特数据被作为一个k比特整数的序列处理。一个简单检验和方法就是将这k比特整数加起来,并且用得到的和作为差错检测比特。因特网检验和就是基于这种方法的。即数据的字节作为16比特的整数对待并求和。这和的反码形成了携带在报文段首部的因特网检验和。如之前讨论过的那样,接收方通过对接收数据(包括检验和)的和取反码,并且检测其结果是否全1比特来检测校验和。如果这些比特中有任何比特是0,就可以指示出差错。

6.2.2.3 循环冗余检测(CRC)

  • 为什么CRC强度最好,但是TCP,UDP,IP里面都是checksum呢?因为同时它的计算复杂性也是最高的,而TCP,UDP,IP作为软件模块,用CRC的话会消耗很多CPU资源来进行计算。
  • 当今计算机中广泛使用的差错检测技术基于循环冗余检测(CRC)编码。CRC编码也成为多项式编码,因为该编码能够将要发送的比特串看做为系数是0和1一个多项式,对比特串的操作被解释为多项式算是。
  • 编码操作如下:考虑d比特数据D,发送节点要将它发送给接收节点,发送方和接收方首先必须协商一个r+1比特模式,称为生成多项式。我们将其表示为G。我们将要求G的最高有效位的比特是1。
  • CRC编码关键思想如图所示。对于一个给定的数据段D,发送方要选择r个附加比特R,并将它们附加到D上。使得得到d+r比特模式,用模2算术恰好能被G整除。用CRC进行差错检测的过程很简单:接收方用G去除接受到的d+r比特,如果余数为非零,接收方知道出现了差错;否则认为数据正确被接收。

模2运算是一种二进制算法CRC校验技术中的核心部分。与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种二进制运算。而且,模2运算也使用与四则运算相同的运算符,即“+”表示模2加,“-”表示模2减,“×”或“·”表示模2乘,“÷”或“/”表示模2除。与四则运算不同的是模2运算不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。

CRC采用模2除法运算。

所有CRC计算采用模2算术来做,在加法中不进位,在减法中不借位。这意味着加法和减法是相同的,而且这两种操作等价于操作数按位异或(XOR)
举个🌰:

1011 XOR 0101 = 1110
1001 XOR 1101 = 0100
类似的我们还会有:
1011 - 0101 = 1110
1001 - 1101 = 0100

45d87811a5af6e5a53242e44146883f.jpg

上图解释为:发送方发送的比特数据data为101110,发送方和接收方给的生成多项式是x^3+1,要求算EDC码:

发送方和接收方给的生成多项式对应的二进制表达为1001(位数为m),原因如下:

①先给data添加n位占位符,其中n满足:n=m-1,则变成101110 000,作为被除数,生成多项式作为除数;

②进行模2除法,原则就是被除数和除数在每次运算时:双方位数相同,就商1,位数不同就商0;

a64bdf1370bbdd77e4def4c40ee6f91.jpg

④因此发送方发送出去的数据为101110 011;

⑤接收方收到数据后,再用相同的CRC算法,101110 011 模2 1001,最后余数恰好为0,说明校验成功;否则这个包直接扔掉。

6.3 多路访问链路和协议

6.3.1 引入

  • 点对点链路:由链路一端的单个发送方和链路另一端的单个接收方组成。许多链路层协议都是点对点链路设计的,如点对点协议(PPP)和高级数据链路控制(DHLC)。

  • 广播链路:让多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。当任何一个节点传输一个帧时,信道广播该帧,其他每个节点都收到一个副本。如以太网和局域网,HDLC协议。

  • 多路访问问题:即多个发送和接收节点对一个共享广播信道的访问。计算机网络中通过协议来规范他们在共享广播信道上的传输行为,也就是多路访问协议。目前多路访问协议划分为三种类型:信道划分协议,随机接入协议,轮流协议。他们有以下特征:

    • 当仅有一个节点发送数据时,该节点具有R bps的吞吐量。
    • 当有M个节点发送数据时,每个节点吞吐量为R/M bps。这并不是要求M个节点中的每一个节点总是有R/M的瞬间速率,而是每个节点在一些适当定义的时间间隔内应该有R/M的平均传输速率。
    • 协议是分散的,这就是说不会因某节点故障而使整个系统崩溃。
      • 没有特殊的节点来协调传输
      • 没有时钟同步
    • 协议是简单的,实现并不昂贵
  • 碰撞:多个节点同时传输帧的时候,帧在所有接收方处将会碰撞,当发生碰撞时候,没有一个接收方节点可以接收到有效帧。

6.3.2 三种多路访问协议

6.3.2.1 信道划分协议(符合特征2,不符合特征1)

特点:需要将信道上的资源切成tips,然后排他性第地使用(exclusive use)。完全消除了碰撞,但是资源浪费及其严重。

时分多路复用(TDM)和频分多路复用(FDM)是两种能够用于在所有共享信道节点之间划分广播信道的带宽技术。

  • TDM将时间划分为时间帧,并进一步划分每个实际帧为N个时隙。每个时隙分配给N个节点中的一个。无论何时某个节点在有分组要发送时候,它在循环的TDM帧中指派给它的时隙内传输分组比特。通常时隙长度应该能够传输单个分组。它消除了碰撞,每个节点在每个时隙内得到了专用的传输速率R/N bps。但是节点被R/N bps速率限制,而且节点必须轮询等待。
  • FDM将R bps信道划分为不同的频段(频多分址,FDMA),每个频段具有R/N带宽,并把每个频段分给N个节点。因此FDM在单个较大的Rbps信道中创建了N个较小的R/N bps信道。它有效地避免了碰撞,但是限制每个节点只能使用R/N的带宽。
  • 码分多址(CDMA):对每一个节点分配一种不同的编码,每个节点用它唯一的编码来对发送数据进行编码。不节点可以同时传输,并且他们各自相应的接收方仍能够正确接收。例如蜂窝电话。

6.3.2.2 随机接入协议(符合特征1,不符合特征2)

在随机接入协议中,一个传输节点总是以信道的全部速率发送。当有碰撞时,涉及碰撞的节点反复重发它的帧,直到该帧无碰撞通过为止。但是当每个节点经历一次碰撞时,他不是立刻重发,而是等待一个延时再发。

(1)时隙ALOHA

一群野蛮人的会议,谁想说话谁就说。

时隙是一个简单的协议,当某个节点是唯一活跃的节点时,时隙ALOHA允许该节点以全速R连续传输,时隙ALOHA也是高度分散的,因为每个节点检测碰撞并独立地决定什么时候重传。当有大量活跃节点且每个节点总有大量帧要发送时,长期运行中成功时隙的份额。最多会有37%的时隙在做有用工作,速率仅为0.37R。时隙ALOHA要求每个节点同步他们额传输,以在每个时隙开始时开始传输,第一个ALOHA协议时间是一个非时隙、完全分散的协议。在纯ALOHA 中,当第一帧到达,节点立刻将该帧传输完整地传输到广播信道。如果一个帧与多个传输经历了碰撞,那么这个节点将立即以概率p重传该帧。否则该节点等待一个帧传输时间再以概率p进行重传。

(2)载波帧听多路访问CSMA(Carrier Sense Multiple Access)

一群绅士的会议,有别人说话的话让对方先说。

载波帧听(Carrier sensing):一个节点在传输前先听信道,如果有来自另一个节点的帧正向信道发送,则等待知道检测到一小段时间没有传输,然后开始传输。

怎样检测呢?

当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。

当一个站检测到的信号电压摆动值超过一定的门限值时,

就认为总线上至少有两个站在同时发送数据表明产生了碰撞,即发生了冲突。

(3) 具碰撞检测的载波侦听多路访问CSMA/CD

我们从广播信道相连的适配器角度总结它的运行:

  1. 适配置器从网络层获得一条数据报,准备链路层帧,并将其放入帧适配器缓冲中
  2. 如果适配器侦听到信道空闲,则开始传输帧,如果侦听到信道在忙,则等待,知道侦听到信道空闲才开始传输帧。
  3. 在传输过程中,适配器监视来自其他使用广播信道的适配器信号能量的存在。
  4. 如果是配置传输整个帧而未检测到来自其他适配器的信号能量,该适配器就完成了该帧。另一方面,如果适配器在传输时检测到来自其他适配器的信号能量,则停止传输。
  5. 停止之后,适配器等待一个随机时间量,然后返回第二步。

如何确定碰撞后的重传时机?

6.3.2.3 轮流协议

轮流协议(Round-robin)是一种网络通信协议,它旨在平均分配系统资源并确保公平性。这种协议将任务或请求分配给一系列可用的处理单元,例如CPU、服务器或其他进程。在一轮轮的处理中,每个处理单元依次接收任务,并按照先来先服务的顺序进行处理。当所有单元都完成了一个任务后,下一个任务又会从头开始分配。

轮流协议的优点在于能够利用系统资源,确保每个单元都有机会获得任务。但是,如果某个单元处理的任务比其他单元更复杂或需要更长的时间,则可能会导致等待其他单元结束任务而延迟整个处理过程。

6.4 交换局域网LANS

6.4.1 MAC地址和ARP

6.4.1.1 MAC地址

我们知道主机和路由器并不具有链路层地址,而是他们的适配器具有链路层地址,因此具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址。但是交换机并不具有相关的链路层地址,因为交换机的任务是在主机和路由器之前承载数据报。

MAC地址又称为LAN地址、物理地址。MAC地址长度为6个字节,共有2的48次方个可能的MAC地址。通常用16进制表示,地址的每个字节被一对十六进制数表示。没有两个适配器的MAC地址是相同的。适配器的MAC地址具有扁平结构,而且不论适配器到哪里都不会变化,带有以太网的便携机总具有相同的MAC地址。

适配器的MAC地址与人的社会保险号类似,后者也具有扁平寻址结构,而且无论人到哪里该号码都不会变化。IP地址则与一个人的邮政地址类似,它是有层次性的,会随着人搬到的地址的变换而而变化。所以一台主机只有唯一一个MAC地址,但是却可以有不同的IP地址。

当一个适配器向另一个适配器发送帧时,发送适配器将目的适配器的MAC地址插入到该帧中,并将该帧发送到局域网上。一台交换机偶尔将帧广播到它所在的接口,这样一个适配器会接收到并非向他寻址的帧,这时候适配器收到帧就会进行MAC匹配,成功就接收,并提取出封装的数据然后传递给上层。不匹配则丢弃。MAC广播地址:如果适配器要让局域网上的所有的适配器接收并处理他们发送的帧,则这时候在发送适配器的该帧的目的地址插入MAC广播地址。该地址是48个连续1组成的字符串(即十六机制表示的FF-FF-FF-FF-FF-FF)。

6.4.1.2 地址解析协议ARP

ARP(Address Resolution Protocol):网络层地址(IP)和链路层地址(MAC)之间进行转换的任务。

每台主机都有一个单一的IP地址和一个单一的MAC地址。IP地址用以点分十进制法表示,MAC地址以十六进制表示法表示。发送主机通过将目的主机的IP地址作为输入通过发送主机的ARP模块返回相应的MAC地址。它有点类似DNS。但是DNS为因特网中任何地方的主机解析主机名,而ARP只为在同一个子网的主机和路由器解析IP地址。

ARP工作原理:每台主机或路由器在其内存中有一个ARP表,这张表包含IP地址到MAC地址映射关系。该表也包含了一个寿命(TTL)值,它表示了一个从表中删除每个映射的时间。如下表:

如果主机要向222.222.222.220发送一个数据报,此时ARP表中没有该主机的表项,该怎么办呢?这种情况下,发送方用ARP协议来解析这个地址,首先发送方构造一个称为ARP分组的特殊分组。一个ARP分组有几个字段,包括发送和接收的IP地址、MAC地址,ARP查询分组和响应分组都有相同的格式。ARP查询分组的目的是询问子网上的所有主机和路由,以确定对应的IP地址的MAC地址。

ARP属于链路层协议还是网络层协议?
一个ARP分组封装在链路层帧中,因而在体系结构上位于链路层之上,然而,一个ARP分组同样具有包含链路层地址的字段,所以也可以认为是链路层协议。但它同样包含网络层的地址,所以也可以认为是网络层协议。

6.4.1.3 数据报发送到子网以外

当两台主机在两个不同子网时数据是如何传输的呢?假设主机111.111.111.111向主机222.222.222.222发送一个数据报。首先111的主机先将数据报发送给110的路由器(通过ARP解析到110的IP地址)。此时该帧传递给路由器由链路层到达网络层。路由器通过路由器中的转发表告诉这台路由器该数据报要通过路由接口到达220.然后该接口把数据报传递给适配器。适配器把数据报封装成帧发送到220的子网中,最后到达222主机。

6.4.2 以太网(Ethernet)

以太网是一种有线的、使用最普遍的计算机局域网技术。

以太网几乎占据了现有的有线局域网市场。在20世界80年代和90年代早期,以太网面临着来自其他局域网技术包括令牌环网、FDDI和ATM的挑战。多年来这些其他技术也成功抓住了部分局域网市场。但是自从20世纪70年代中期发明以太网以来,它就不断演化和发展,并保持了今天的统治地位。

以太网使用的多重访问方式(Style of multiple access):CSMA/CD(具有碰撞检测的载波侦听多路访问)

而无线局域网使用CSMA/CA(带有冲突避免的载波侦听多路访问)。

6.4.3 交换机(Ethernet switch)

  • 分组交换不要求路由器维护每个TCP连接的状态。

交换机:接收入链路层帧并将它们转发到出链路。交换机自身对子网中的主机和路由是透明的,也就是说局域网中的主机和路由器并不知道交换机的存在。

(1)交换机转发和过滤

  • 过滤:决定将一个帧转发到某个接口还是应将该帧丢弃的交换机功能。
  • 转发:决定一个帧应该被导向那个接口,并把该帧移动到那些接口的交换功能。
  • 交换机表:包含局域网上的主机和路由器的表项。其中包含:一个MAC地址;一个通向该MAC地址的交换机接口;表项放置在表中的时间,下图是交换机表
  • 转发和过滤过程:
    • 如果交换机表项中没有目的地址,则交换机广播该帧
    • 表项将目的地址和接口联系起来,这种情况下该帧从包括适配器目的地址的局域网网段到来,无需将该帧进行转发到其他接口,交换机通过丢弃该帧进行过滤。
    • 表项没有将目的地址与接口联系起来,这种情况下,该帧需要被转发到与接口相连的局域网网段,交换机通过将该帧放到接口前面的输出缓冲完成转发功能。

(2)自学习

交换机表是自动、动态和自治地建立的。所有交换机是自学习的。自学习实现方式:

  • 交换机表初始为空
  • 对于在每个接口接收到的每个入帧。该交换机在其表中存储:
  1. 该帧源地址字段中的MAC地址;
  2. 该帧到达的接口;
  3. 当前时间。交换机以这种方式在表中记录了发送节点所在局域网网段。如果局域网中各个主机都发送了帧,则都会在表中留有记录。
  • 如果一段时间后,交换机没有接收到以该地址作为源地址的帧,则删除表中的记录。

交换机是一个即插即用的设备,不需要人为配置,安装交换机只需要将局域网网段与交换机接口相连即可。

(3)链路层交换机性质

交换机不同于总线或基于集线器的星行拓扑那样的广播链路,他们有以下优点:

  • 清除碰撞:使用交换机构建的局域网中,没有因碰撞而浪费带宽,交换机缓冲帧并且绝不会在网段上同时传输多余一个帧。交换机最大聚合带宽是该交换机所有接口速率只和,因此交换机提供了比广播链路的局域网高的多的性能改善。
  • 异质的链路:交换机将链路彼此隔离,因此局域网中的不同链路能够以不同速率运行,并且在不同的媒体上运行。
  • 管理:易于网络管理。交换机可以检测到异常的适配器,并且在内部断开异常的适配器。也可以收集带宽使用的统计数据、碰撞率和流量类型便于管理者使用

(4)交换机和路由器的区别

路由器是使用网络层地址转发分组的存储转发分组交换机。交换机是用MAC地址转发分组。交换机的第二层是分组交换机,而路由器的第三层是分组交换机。

交换机的优缺点:

  • 交换机是即插即用的,
  • 交换机具有相对高的分组过滤和转发速率
  • 交换机对广播风暴不提供任何保护措施。

路由器的优缺点:

  • 当网络中存在冗余路径时,分组不会通过路由器循环。
  • 对广播风暴提供了防火墙保护
  • 缺点是不是即插即用,需要人为配置IP地址。
  • 比交换机处理分组时间长。

通常,几百台主机组成的小网络通常有几个局域网网段,对于这些小网段使用交换机足够。在更大型的网络中除了交换机还需要路由器。