《计算机网络-自顶向下》06. 链路层和局域网

链路层概述

链路层提供的服务

  • 成帧
  • 链路接入
  • 可靠交付
  • 差错检测和纠错

链路层在何处实现

链路层的主体部分实在网络适配器中实现的,网络适配器有时也称为网络接口卡(Network Interface Card, NIC)。

位于网络适配器核心是链路层控制器,该控制器通常是一个实现了许多链路层服务(成帧、链路接入、差错检测等)的专用芯片。

对于控制器:

在发送端,控制器取得了由协议栈较高层生成并存储在主机内存中的数据报,在链路层帧中封装该数据报,如何遵循链路层接入协议将该帧传进通信链路中。

在接收端,控制器接收了整个帧,抽取出网络层数据报。如果链路层执行差错检测,则需要发送控制器在该帧的首部字段设置差错检测比特,由接收端控制器执行差错检测。

链路层许多功能都是硬件实现的。

在 CPU 中也实现了部分链路层功能,如组装链路层寻址信息和激活控制器硬件。

在接收端,链路层软件响应控制器终端(例如,由一个或多个帧的到达),处理差错条件和将数据报向上传递给网络层。

image-20230408082552586

差错检测和纠正技术

奇偶校验

之前学过了,链接: 《计算机组成与设计》05. 大而快:层次化存储

循环冗余检测

计算过程:

  • 发送与接收方都先约定好一个生成多项式 G(x)
  • 发送方基于待发送的数据和生成多项式计算出差错检错码(冗余码),将其添加到待传输数据的后面一起传输。
  • 接收方通过生成多项式来判断收到的数据是否产生了误码。

发送方处理:

image-20230411201718187

接收方处理:

image-20230411201738015

多路访问协议

多个节点在共享信道上进行传输,需要通过多路访问协议来规范它们在广播信道上的传输行为。
在各种各样的网络环境下需要多路访问协议,包括有线和无线接入网,以及卫星网络。

因为所有的节点都能够传输帧,所以多个借点可能会同时传输帧。此时当所有节点在传输的过程中,在某一时刻将碰到一起,这就产生了碰撞
通常,当发生碰撞时,碰撞将导致所有的帧都丢弃,因此将没有一个节点能有效的接收到任何传输的帧。

因为许多节点都需要频繁的传输帧,许多传输将导致碰撞,广播信道的大量带宽将被浪费。

多路访问协议应该具有一下所希望的特征:

  1. 当仅有一个节点发送数据时,该节点具有 Rbps 的吞吐量。
  2. 当有 M 个节点发送数据时,每个节点吞吐量为 R/M bps。
  3. 不会因为某个主节点故障而导致整个系统崩溃。
  4. 协议是简单的,使实现不昂贵。

信道划分协议

  • 时分多路复用(TDM)
  • 频分多路复用(FDM)
  • 码分多址(CDMA)

随机接入协议

时隙 ALOHA

略…

ALOHA

略…

载波侦听多路访问 —— CSMA
  • 传输前先侦听(载波侦听):当前节点的适配器侦听信道上是否有其它适配器的能量信号,若有,则先不发送,若无,则发送。
  • 和其它节点同时传输(碰撞检测):当一个节点在传输时一直侦听此信道,若检测到此信道上有其它节点的能量信号,即干扰正在传输的帧,它就停止传输,进入一段随机等待时间,然后在进行“侦听-当空闲时传输”。

载波侦听多路访问:CSMA
具有碰撞检测的 CSMA:CSMA/CD

发送碰撞时的图示:
image-20230411202754645

具有碰撞检测的载波侦听多路访问 —— CSMA/CD

从与广播信道的适配器(在节点中)的角度总结:

  1. 适配器从网络层得到数据报,接着在链路层封装该数据报,并将其放入到帧适配器缓存中。
  2. 若适配器侦听到信道空闲(即信号能量从信道进入适配器),此时它开始传输。若侦听到信道繁忙,它将等待,直到侦听到没有信号能量时才开始传输帧。
  3. 在传输过程中,适配器监视来自其他使用该广播信道的适配器的信号能量的存在。
  4. 若适配器传输整个帧的过程中未检测到来自其它适配器的信号能量,该适配器就完成了该帧的传输。若适配器在传输过程中检测到来自其它适配器的信号能量,它将中止传输。
  5. 中止传输后,适配器等待一个随机时间,然后返回步骤 2。

随机时间的长短:

  • 时间间隔大,碰撞节点数量小:在进入到“侦听-空闲时传输”步骤前,节点很可能等待较长时间(导致信道保持空闲)。
  • 时间间隔小,碰撞节点数量大:很可能各节点选择的时间相差较小,导致节点将再次碰撞。
    理想是:当碰撞节点数量少时,时间间隔较短;当节点碰撞数量较大时,时间间隔较长。

具体随机时间计算:当传输一个给定的帧时,假设该帧碰撞了 n n n 次,节点随机地从 0 , 1 , 2 , . . . , 2 n − 1 {0, 1, 2, ..., 2^n-1} 0,1,2,...,2n1 中选择要给 K K K 值。这便是二进制指数后退算法

CSMA/CD 效率

效率 = 1 1 + 5 d p r o p / d t r a n s 效率 = \frac{1}{1+5d_{prop}/d_{trans}} 效率=1+5dprop/dtrans1

轮流协议

略…

DOCSIS:用于电缆因特网接入的链路层协议

略…

交换局域网

链路层寻址和 ARP

MAC 地址

并不是主机或路由器具有链路层地址,而是它们的适配器(即网络接口)具有链路层地址。

注意,链路层交换机并不具有与它们的接口(这些接口是与主机和路由器相连的)相关联的链路层地址。因为链路层交换机的任务是在主机与路由器之间承载数据报。

链路层地址的各种称呼:LAN地址、物理地址、MAC 地址。

通常,MAC 地址长度为 6 字节,共有 2 48 2^{48} 248 个可能的 MAC 地址。MAC 地址每个地址都用十六进制表示。

MAC 地址是固定不变的,但用软件改变一块适配器的 MAC 地址现在是可能的。

MAC 地址出厂时确保 MAC 地址唯一,也就是说世界上没有两块适配器具有相同的 MAC 地址。这依靠 IEEE 来实现。

IEEE 负责管理 MAC 地址空间,当一个公司生产适配器时,需要向 IEEE 购买 2 24 2^{24} 224 个地址空间,
IEEE 分配这 2 24 2^{24} 224 个地址的方式是:固定一个 MAC 地址的前 24 位,让公司自己为每个适配器生成后 24 位的唯一组合。

MAC 地址是扁平结构(固定不变),IP 地址是层次结构(可以改变)。

当某适配器要向某些目的适配器发送一个帧时,发送适配器将目的适配器的 MAC 地址插入到该帧中,并将该帧发送到局域网上。

当适配器接收到一个帧时,将检测该帧中的 MAC 地址是否与自己的 MAC 地址相匹配:

  • 匹配:该适配器提取出封装的数据报,并将数据报沿着协议栈向上传递。
  • 不匹配:该适配器丢弃该帧,而不会向上传递该网络层数据报。

MAC 广播地址:对于 6 字节的 MAC 来说,就是 48 位 MAC 全为 1,以十六进制表示就是 FF-FF-FF-FF-FF-FF。

地址解析协议 —— ARP

以太网

以太网的帧结构

image-20230408090904944

字段字段大小(字节)说明
前同步码8该同步码的前 7 字节都是 10101010,最后一个字节是 10101011。前 7 字节用于“唤醒”接收适配器,并将它们的时钟和发送的时钟同步。为什么需要同步:因为发送和接收的速率并不一定一致,如发送方以1Gbps发送,接收方以10Mbps接收。
目的地址6包含一个目的适配器的 MAC 地址,当目的适配器接收到帧时,如匹配,则它将该帧的数据字段传递给网络层,否则丢弃。
源地址6发送端的 MAC 地址。
类型2主机除了能使用 IP 协议外,还可以使用其它的网络层协议。一台主机可以支持多种不同协议,因此当接收适配器收到了以太网帧后,该适配器需要知道它应该将数据字段的内容传递给哪个网络层协议(即分解)
数据46~1500该字段承载了 IP 数据报。IP 数据报若小于以太网的最大传输单元,则必须分片。若小于最小,则必须填充。
CRC4使得接收适配器检测帧中是否引入差错。

所有以太网技术都向网络层提供无连接服务。

所有以太网技术都向网络层提供不可靠服务。

若丢弃帧需要重传,是否重传全看应用是 UDP 还是 TCP,UDP 不重传,TCP 就重传。

以太网技术

链路层交换机

交换机转发和过滤

交换机中有一张交换机表,用于完成交换机转发功能。

image-20230408095755010

当发送方包含一个目的地 MAC 地址为 DD-DD-DD-DD-DD-DD 的帧,并且从交换机的 x x x 接口入帧时:

  • 若交换机没有该表项,则除了 x x x 接口外,交换机广播该帧。
  • 若表项与 x x x 接口匹配,则该帧无需转发到其它任何接口,因此该帧从包含该 MAC 地址的局域网网段中来,因此交换机丢弃该帧,即过滤该帧。
  • 若表项存在与一个 y y y 接口匹配,则该帧需要转发到 y y y 接口相连的局域网网段。
自学习

交换机是即插即用设备,不需要 网络管理员手动进行配置,只需要插上电就可以用了。

如何自学习:当交换机收到一个帧时,该交换机就进行存储。

表中的字段:

  • 地址:通向目的的 MAC 地址。
  • 接口:通向目的 MAC 地址的接口。
  • 时间:表项在表中保存的时间(过了这个时间后,该表项就会被删除,这是因为 MAC 所对应的 IP 会变)。

image-20230408095755010

链路层交换机的性质
  • 消除碰撞
  • 异质的链路
  • 管理
交换机 VS 路由器

如下图,交换机是链路层设备,路由器是网络层设备。交换机需要处理高至第二层的帧,路由需要处理高至第三层的数据报。

在交换机中,为了防止广播帧循环,交换网络会将拓扑限制为一颗生成树。交换机对广播风暴并不提供任何包含措施。

相反,路由器中,IP 用一个特殊的报文首部字段来限制循环,因此网络拓扑不会被限制为一颗生成树,分组也就不会被限制到一个生成树上,并且可以使用源和目的地之间的最优路径。

image-20230408102027214

image-20230408101855516

通常,由几百台主机组成的小网络通常有几个局域网网段,对于这些小网络,用交换机就够了。

对于由几千台主机组成的更大网络中,通常用交换机加路由器。

虚拟局域网 —— VLAN

IEEE 802.1Q

交换机依靠 IEEE 802.1Q 帧来区分各个 VLAN。

IEEE 802.1Q 帧对以太网的 MAC 帧格式进行了扩展,插入了 4 字节的 VLAN 标记。

image-20230408202514216

VLAN 标记的最后 12 比特称为 VLAN 标识符 VID,它唯一标志了以太网帧属于哪个 VLAN。

  • VID 的取值范围是 0~4095,即 0   2 12 − 1 0 ~ 2^{12}-1 0 2121
  • 用于表示 VLAN 的 VID 有效取值范围是 1~4096。

802.1Q 帧是由交换机来处理的,而不是用户主机来处理的。

  • 当交换机收到普通的以太网帧时,会将其插入 4 字节的 VLAN 标记转变为 802.1Q 帧,该行为称为“打标签”。
  • 当交换机转发 802.1Q 帧时,可能会删除其 4 字节 VLAN 标记转变为普通以太网帧,该行为称为“去标签”。
交换机的端口类型

Access

  • 一般用于连接用户计算机。
  • 只能属于一个 VLAN。
  • PVID 值与端口所属 VLAN 的 ID 相同,默认为 1。
  • 该端口接收时的处理方式:通常只接受“未打标签”的普通以太网 MAC 帧。接收完毕后,给该帧插入 PVID 字段,即 “打标签”,字段中的 VID 取值与端口的 PVID 值相等。
  • 该端口发送时的处理方式:若帧中的 VID 与端口的 PVID 相等,则 “去标签”,并转发该帧。否则不转发。

Trunk

  • 该端口一般用于交换机之间或交换机与路由器之间的互连。

  • 该端口可以属于多个 VLAN。

  • 用户可以设置 Trunk 端口的 PVID 值。默认 PVID 为 1。

  • 该端口接收时的处理方式:

    接收“未打标签”的帧时,根据接收帧的端口的 PVID 给帧 “打标签”,VID 取值和端口的 PVID 值相同。

    接收“打标签”的帧时,直接接收。

  • 该端口发送时的处理方式:

    对于 VID = PVID 的帧,先“去标签”,后转发。

    对于 VID != PVID 的帧,直接转发。

Hybrid

交换机各端口的缺省 VLAN ID

  • 在思科交换机上称为 Native VLAN,即本征 VLAN。
  • 在华为交换机上称为 Port VLAN ID,即端口 VLAN ID,简称 PVID。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值