数据链路层

有些部分内容也是相当的抽象,了解即可

重点部分

  • 数据链路层的互联设备

网络编程的主要研究在网络层中

封装成帧

给上一层交付的协议数据单元进行先添加帧尾和帧头使其成为帧

ppp帧(点对点信道的帧)

帧头帧尾作用之一是帧定界标志

透明传输

指的是对上层交付的传输数据没有任何限制,数据链路层的封装好像就是理所应当的,看不见的,不存在的(可以理解为你经常会忽视,你习以为常的事物)

面对字节的物理链路使用字节填充

在发送帧之前检测定界标志,检测到定界符flag或者转义字符就前插入一个esc转义字符

如图所示:

注意转义字符只有一个字节,10进制为27,是一个控制字符

面向比特的物理链路使用比特填充

对数据部分进行每五个连续的比特1添加一个比特0,确保帧定界的标志成为唯一的值

在接收方时按照改规则去除比特0即可

注意

提高帧的传输效率,应当使数据部分的长度更大一些

但是考虑到差错控制等多种因素,每一种数据链路层的协议都规定的帧的数据部分的最大上限

我们称其为最大传送单元MTU(Maximum Transfer Unit)

mac帧是没有定界符的,取代而之的是物理层加入一个前导码,有着相同的作用

差错检测

比特差错,也是我们常说的误码

0变成1,1变成0 ,想到了一些怪东西,不要深究

在一定时间内,产生的错误在传输过程中占比,被称为误码率

这个时候我们就需要进行校验

奇偶检验

顾名思义,检测比特1是否为奇数或偶数

通信的双方指定一个校验方式

漏检率较高,计网用不着

循环冗余校验

CRC (Cyclic Redundancy Check)

双方生成多项式G(X)

发送方:根据发送数据和生成的多项式计算出差错检测码(冗余码),将其添加到带传输数据的后面一起传输

简单冗余码的计算过程

首先我们需要得知待发送的信息的比特串

1
假设为:101001

生成一个多项式(随机假设的)

通过多项式的系数构造一个被除数

1
得到:1101

注意 使用的是模2除法,不是我们常用的十进制除法(进行的是异或运算)

通过组合计算出来的余数就可以发送了

1
2
发送的数据:101001  001
余数

接受方:根据发送数据和生成的多项式计算,检查余数是否为0,若不为0,说明为产生误码

直接上图:

image-20220718095630773

注意:咱这只是差错检测,纠错是不行的,想要纠错,可以使用冗余信息更多的纠错码进行向前纠错。但是纠错码开销较大,计算机很少用

那么纠错该怎么实现呢,检错重传方式来纠正传输中的差错,或者是直接丢弃错误的帧,这都取决于数据链路层向上提供的是啥协议TCPor UDP可靠或者不可靠的 传输服务了

CRC有很好的检错能力,计算也不复杂,而且易于硬件实现,所以广泛应用于数据链路层

可靠传输基本概念

基本概念:使用了差错检测后,出现了误码

不可靠传输服务:仅仅丢弃有误码的帧,啥也不做

可靠传输服务:发送端发到什么,接收端收什么

注意:可靠传输服务,不仅仅存在于数据链路层,在各层中都可以实现

差错也有很多种:

比特差错
以下差错一般出现在数据链路层的上层

分组丢失

分组失序

分组重复

再次作证了可靠传输服务不仅仅存在于数据链路层在各层中都可以实现

可靠传输的实现的机制

停止等待协议(SW)

A方发送DATA分组给B方

B方检测DATA分组没有错误,返回发送一个ACK分组(表示接受成功)

A方接收到了ACK分组,OK,A方就可以呢继续发送下一个DATA分组

当B方检测这个DATA分组有错误,丢掉,返回一个NAK分组(表示没有成功姐接受)

A方呢,重新再把这个DATA分组数据啊,再发送一次,直到呢B方返回一个ACK分组

图解:

诶那你就会有疑问了,如果出现A方发送的DATA数据丢失了呢,不就会出现B方什么也没收到,就什么也不返回,A方也不知道到底接没接收到,就一直处于等待接收方返回ACK/NAK的状态么。

出现这种情况,发送方内部启动个计时器,设定计时器的时间

超时没收到返回分组,那我就重传原来的数据分组,这就是超时重传的概念

这个计时器的时间,一般大于发送往返的时间:图解如下

然而呢,假设还有两种种情况:

就是出现:

  • A方发送过去了,就是有点久超过了设定计时器定时 B方才接收到 或者 ACK回晚了

  • 返回的ACK丢失了

出现这两种就会出现第二种解法:超时重传,但是啊,搞清楚了,B方式已经默认收到DATA 的,有A方又传了一个相同的DATA分组,这就是出现了分组重复的情况

这种情况需要发送方A在发送事给每个分组带上一个序号,接受方B接收该数据DATA0,检测该序号,与上一个DATA0分组序号相同就丢弃顺便返回一个ACK0(针对的DATA0的数据分组,注意啊:ACK也是需要编号的,否则依然会出现ACK重复混淆 的这种情况) ,A方就可以取消该DATA0分组的重传

继续发下一个DATA1(此时变为了1)返回的ACK1(也变为了1)

再下一个层就是为ACK0和DATA0,至此呢所有情况,都有了相应的应对方案。

上图:

值得一提的是:在PPP(点对点的信道物理链路层)中,发送时间,往返时间都是固定的,所以呢不用担心超时重传的问题,设不设定计时器重传时间,编不编号都无伤大雅,除非有老鼠掐准点把你家电路吃了,不过为了这个传输协议的鲁棒性,健壮型,加编号未尝不可

但是在(实际的ISO协议)运输层中,这这额外的情况就很可能发生,设定往返超时的判断时间(重传时间)是需要谨慎确定的问题

注意:编号一个比特表示0/1就够了,停等协议是这样的

SW协议的的信道利用率

短距离,数据帧的长度低,信道利用率的能稍微高点

但实际上SW协议的新到利用率相当的低,有图可证

可以用公式来计算:

RTT是往返时间,出现重传U还要降低

为此,如此低的信道利用率太浪费资源,就有了GBN和SR协议的解决方法

SW协议也被称为 自动请求重传协议ARQ(Automatic Repeat reQuest)

回退N帧协议(GBN)

那么,为了解决SW协议的信道利用率,就提出了回退N帧协议

那SW协议就就连续发多个分组,跟流水线一样

但是需要做出限制,限定了一个发送窗口,记为$W_T$

当取值等于1时,等于SW协议

取值等$1<W_T<=2^n-1$

n为采用几个比特给分组编号

(如$W_T$大于上限,就会出现分组重复的差错)

我们也需要给接收方设定一个接受窗口$W_R$=1

接收方只能按序接收数据分组,当发送方每收到一个ACK就往前移动一个序号的发送窗口

图如下

如果每一个序号的分组都进行发送确认ACK,开销有点大,

可以只发送序号最大的ACK4(假设发送窗口为5,采用3比特进行编号)那么发送方就知道0~4的信号接收方已接受。

那么出现差错怎么办呢

image-20220719100449425

就会将所有的发送全部丢弃,每丢弃一个数据分组,就发送一个ACK4,表示我只接受到了0到4的数据分组,之前的所有数据都没有成功接收,全部需要重发。

由此可见,在网络波动大时,新到的利用率跟SW协议差不了多少。

总结:

image-20220719101040194

我们可以看下题解析,巩固一下理解

同样是一种ARQ协议,当通信线路8太行时,信道利用率和SW协议差不多

选择重传协议(SR)

是GBN的改进,本质呢依然是GBN,但是更改了接收方的接收窗口的尺寸$W_r$

发送窗口与接受窗口相等,依然是按序滑动窗口(不是算法的滑动窗口,但也差不多)

出现误码,两方的窗口都不会进行滑动,直到所有数据分组确认接受,

两者的尺寸问题:

发送窗口:1<$W_t$<=$2^{n-1}$

接受窗口:1<$W_r$<=$W_t$

n为编号所使用的比特数

总结:

总的来说:只要理解SW(停止-等待)协议,可以发现GBN和SR都是基于SW的基础上加以改进的,理解起来都非常的容易

点对点协议

点对点(ppp)协议:是目前使用最广泛的数据链路层协议,

也同时广泛应用于广域网之间的公用线路

对各种协议数据报的封装方法(封装成帧)

链路控制协议LCP:

用于建立,配置以及测试数据链路的链接

一套网络控制协议NCPs :

其中的每一个协议支持不同的网络层协议

帧格式

透明传输的实现

面对字节的异步传输链路:

面对比特的同步传输链路:

差错检测

工作状态

静止状态,检测到载波(物理层提供的服务)建立物理层的链接,跳转到建立状态

建立状态,开始进行LCP配置

鉴别状态,根据LCP配置的鉴别协议选择是否鉴别,成功跳转到网络的NCP配置阶段,失败即终止

网络状态。进行NCP配置,链路两端互相发发送特定NCP分组,根据使用的控制协议比如 IP-CP协议,就发送IPCP 的配置模块(作用是分配IP地址),成功后跳转到打开状态

打开状态,表明可以进行数据通信,如果出现故障或者终止请求,跳转至终止状态

终止状态,检测到载波停止时回到静止状态。

广播信道的数据链路层

共享式以太网

接入控制与碰撞检测协议

共享信道,需要协调多个发送接受站点对一个传输媒体的占用

这里我们引入媒体接入控制的概念

image-20220720105614322

我们需要大概了解静态划分信道与动态接入控制中的随机接入

静态划分信道:

信道复用实现:

频分复用FDM

按照频率不同区分信道,复用器与分用器 是并行通信

时分复用TDM:

划分时间,设定不同的时隙,串行通信

波分复用WDM:

可以理解为光波的频分复用,光复用器与光分用器

码分复用CDM:

在同时同频带进行并行通信,根据的不同码型区分信道

我觉得挺有意思的,是歪比巴卜加密通信,其中有个概念叫码片(chip):每一个比特时间再划分的M个端间隔间隔

应用举例:

注意多址(MA)与复用的关系

多址用与在动态的信道分配,固定的地址例如无线电则不需要多址,多址可以看成复用的应用

随机接入协议:

CSMA/CD协议:

载波监听(Check_Sign): 监听信道否有载波

多址接入(Mutli Address):多个连接占在一条总线上,随机时间发送帧

碰撞检测(C D):遇到碰撞,退避随机时间重新发送,强化碰撞(发送干扰信号,相当于放大碰撞)

关键概念:

争用期:争用期时间指的是,不会超过端到端往返时间时延的时间。

注意:共享式以太网不能链接太多的主机,使用的总线也不能太长。

最小帧长:以太网规定最喜小帧长为64字节,即521比特(512比特时间为争用期)

作用是保证能在帧发送完成之前能检测到是否发生碰撞。

最大帧长:
以太网V2的MAC帧最大长度1518字节加上帧头与帧尾

帧的发送流程:

802.11局域网(Wlan)

CSMA/CA协议:

应用于无线局域网的多址碰撞检测

CA(碰撞避免)

是重点,也是核心,无线信道,想要检测道碰撞,成本太高了

所以呢提出了新的概念,也就是CA;

CA中利用了SW协议,在尽量避免碰撞,又提出了虚拟载波监听(数据帧中也携带通信的需要时间),与信道预约(RTS与CTS帧(这两个帧携带通信需要时间)

看到这是不是觉得非常敷衍,是的,我开始摆烂了,记几个概念得了,再深入,就不止是考研的范畴了。

数据链路层的互连设备

前置概念:

首先在研究互联设备之前,我们需要清楚三个概念:

MAC地址

MAC是以太网的MAC子层所使用的地址(物理链路层)

以太网帧的结构

ppp信道不需要使用地址(因为只有两者)

帧里必须携带发送朱局和接收主机的地址,由于这类地址是通榆媒体介入控制

,因此这类地址被称为MAC地址

MAC 地址一般放在网卡的EEPROM中,也被称为硬件(物理)地址

注意(并非叫物理就是物理层的内容)

各种硬件接口都有MAC地址,所以

严格来讲:MAC 地址是网络上各接口的唯一标识,而不是对网络上各设备的唯一标识

48个字节,好像有几百亿的地址,起码用到2080年才用得完

我们通过MAC地址了解厂商信息;

也可以了解到MAC也有四种:

  • 全球:

    • 单播地址
    • 多播地址
  • 本地(优先级最高)

    • 单播地址
    • 多播地址

单播地址 应用于1对1设备

多播地址 应用于是以1 对多设备

IP地址(网络层)

IP是TCP/IP体系结构网际层所使用的地址:

应用:因特网上的主机和路由器所使用的地址

注意这只是大概应用图:(具体实现在网络层中)

ARP协议(网络层)

ARP协议是属于TCP/IP的东西,能将IP地址解析下一个路由或者设备的相应MAC地址并在数据链路中重新封装

ARP(Address 解析 协议)高速缓存表:

用来存储的东西

注意一下arp报文都是封装在MAC帧当中的

在数据链路层,向所有主机发送ARP请求报文

根据其中请求的ARP请求报文检验啊,是否是来请求自己的,如果不是,就丢掉

如果是,交给上层网络层ARP进程 解析 先记录请求报文的主机IP与MAC 地址于自己的ARP高速缓存表中:

然后向下 数据链路层 再向发送请求的主机,一个ARP响应报文,其中包含自己的MAC 与ip地址,

收到了ARP响应报文,网络层的ARP进程进行解析,然后记录到自身的ARP告诉缓存表

注意不能跨网络使用

注意了:

ARP还有其他报文,比如,免费报文(用来检测IP是否冲突)

ARP协议没有安全验证机制,有写人就会利用ARP进行攻击,ARP欺骗等问题

集线器

  • 物理层中工作
  • 仍是一个总线网,各站点共享总线资源,使用的还是CSMA/CD协议
  • 又少量的容错和网络管理
  • 集线器在物理层扩展以太网

以太网交换机

  • 其中的存储转发:就是交换机内的数据链路层的帧号的缓存存储,再根据表转发
  • 而直通交换,不需要检测 就是帧容易出错

总结集线器与交换机双方对比:

一张图足矣

所以,碰撞这一块。。。CSMA/CD /CA 协议

我之前如果只学交换机是不是完全不需要考虑总线碰撞的问题呢?MD,白学了

以太网交换机自学习和转发帧的流程

总结:

登记遍历,无泛洪,有转发

生成树协议

为了在给交换机增加冗余链路 ,增加可靠性的同时,不会出现网络环路(类似C++的头文件循环包含问题),网络环路带来的问题就是容易出现广播风暴(广播帧会多次转发,导致交换机堵塞,瘫痪)

需要用到一个算法协议STP生成树协议,这玩意,能将拓扑结构网络中不需要转发的窗口阻塞禁用,从而阻止广播风暴的问题

具体就是使用STP协议请移步这篇文章

VLAN(虚拟局域网)

由于网络中会频繁出现广播信息,然而纯交换机组成的以太网会组成一个非常大的广播域,如果在这个广播域中,出现广播风暴,那是相当浪费网络资源和CPU的。

就是又STP协议也不顶用啊

所以,就需要有一个能够将广播域分割的方法

这就不得不拿出路由器了

可是,这玩意的成本很高(相对于集线器与交换机而言),虽然也不是很高了现在,但也不能每两交换机之间就用一个罢,咱有钱也不能这么造不是?

这时,为了省钱呢,虚拟局域网VLAN诞生啦

这玩意概念上是

将一个局域网内的设备划分成与物理位置无关的逻辑组的技术,这些逻辑组具有某些共同的需求

实现方式

IEEE 802.1Q帧(Dot One Q帧)

是交换机在收到普通帧时的在扩展,插入了一个4字节的VLAN标记

  • VLAN标记的最后12比特 成为VLAN标识符VID ,唯一地标志了以太网帧属于哪一个VLAN
    • VID取值范围是0~4095( 0~$2^{12}-1$)
    • 0和4095不表示VLAN,因此用于表示VLAN的VID取值也就是1~4094
  • 注意这个帧是交换机来处理的,不是用户主机处理:
    • 当交换机收到普通的以太网帧时,会将其插入4字节的VLAN标记,俗称打标签
    • 转发的时候,按需求取掉或者保留标签转发

以上是

交换机各端口的缺省VLAN ID

  • 在思科交换机称为Native VLAN,即本征VLAN
  • 在华为交换机上称为Port VLAN ID ,即端口VLAN ID ,简记为PVID(唯一的)。

注意:接下来我们讨论的是PVID

交换机端口类型

  • Access
    • 一般用于连接用户计算机
    • 只能属于一个VLAN
    • PVID值与端口所属的VLAN的ID相同(默认为1)

接收:一般只接受未打标签的普通帧,再根据接受真的端口的PVID给帧打标签,字段中的VID 取值与PVID取值相等。

转发:检查帧中的VID与端口的PVID相等,则去标签,转发,否则就不转发。

  • Trunk
    • 交换机之间或者交换机与路由器的互联
    • 可以属于多个VLAN
    • 用户可以设置端口的PVID值,默认为1.

发送第一种情况:检测VID与PVID相等的帧,打标签,再转发

接受第一种情况:接受到一个未打标签的帧,根据接收帧的端口PVID给帧打标签

发送第二种情况:接受一有标签但是PVID不等VID的帧,直接转发

接受第二种情况:接受到一个打标签的帧,我直接带着标签转发

  • Hybrid(思科没有)

同时具有Access与Trunk的特性:

端口可以互连:用户主机与交换机,交换机交换机,用户与用户

不同的地方在于:端口多了个 去标签白名单

至此,数据链路层的内容结束