1. 基本问题

数据链路层使用物理层提供的服务在通信信道上发送和接收比特。数据链路层解决的主要问题包括:

  • 封装成帧
  • 透明传输
  • 差错控制
  • 流量控制

1.1 封装成帧

封装成帧(帧同步)就是在将网络层的IP数据报的前后分别添加首部和尾部。不同数据链路层协议的帧首部和尾部包含的信息有明确规定,帧的首部和尾部有帧开始符和帧结束符,称之为帧界定符。每一种数据链路层协议都规定了所能够传输的帧的数据部分的上限,即MTU(Maximum Transmission Unit),以太网的MTU为1500字节。

MTU大小

1500字节是考虑到传输效率以及传输时间而折中选择的一个值

1.2 透明传输

透明表示一个实际存在的事物看起来好像不存在一样,该层上传输的数据的内容、格式及编码没有限制,也没有必要解释信息结构的意义

比如使用SOH(Start Of Header)—0x01和EOT(End Of Transmission)—0x04来表示,这样数据链路层就可以识别出帧的开始和结束。如果数据部分出现SOH或EOT,则采用字节填充的方式,比如在SOH和EOT前面分别插入一个转义字符ESC—0x1B,在接收端的数据链路层将数据交递给网络层之前删除这个插入的转义字符。

1.3 差错控制

现实的通信链路并不是理想的,比特在传输过程中可能会产生差错(1变0,0变1),这就叫做比特差错。为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的差错检验技术来判定一帧是否在传输过程中发生了错误,一旦发生错误就可以采用反馈重传的方法来纠正。发送数据前先计算帧的数据部分得出FCS添加在数据部分后,接收端收到数据后进行同样的CRC计算与接收到的FCS字段进行比较,判断数据有无差错。

1.4 流量控制

数据链路层的流量控制采用和TCP中滑动窗口类似的机制,将数据区分为已发送并接收到确认的帧、已发送未接收到确认的帧、在窗口大小允许范围内可以继续发送的帧。

2. 点到点信道的数据链路

点到点信道指的是一条链路上就一个发送端和接收端的信道,通常用在广域网链路。点到点的信道不会发生碰撞,因此比较简单,使用PPP协议控制。

2.1 组成部分

PPP协议主要分成三个部分:

  • 高级数据链路控制协议(HDLC):将IP数据报封装到串行链路,支持同步传输和异步传输。因为计算机内的I/O通信是并行的,而链路传输则是按比特流的串行,因此需要协议的封装转换,一般由网络适配器完成。
  • 链路控制协议(LCP):建立、配置和测试链路连接,用来协商一些选项。
  • 网络控制协议(NCP):用于支持上层的不同的网络协议。

同步传输与异步传输

同步传输(Synchronous Transmission)以数据帧为单位传输数据,可采用字符形式或位组合形式的帧同步信号,在短距离的高速传输中,该时钟信号可由专门的时钟线路传输,由发送端或接收端提供专用于同步的时钟信号。计算机网络采用同步传输方式时,常将时钟同步信号(前同步码)植入数据信号帧中,以实现接收端与发送端的时钟同步。异步传输(Asynchronous Transmission)以字符为单位传输数据,发送端和接收端具有相互独立的时钟(频率相差不能太多),并且两者中任一方都不向对方提供时钟同步信号。

2.2 工作过程

  1. 用户的PC机通过调制解调器呼叫路由器,路由器就能够检测到调制解调器发出的载波信号,在双方建立了物理层的连接之后,PPP协议就进入“链路建立”状态,其目的是建立链路层的LCP连接。
  2. LCP开始发送配置请求帧,进行协商一些配置选项,包括链路上的最大帧长、所使用的鉴别协议,以及不适用的PPP帧中的地址和控制字段等。LCP的配置请求帧依旧是一个PPP帧,其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种:(一)配置确认帧:所有选项都接受;(二)配置否认帧:所有选项都理解但不能接受;(三)配置拒绝帧:选项有的无法识别或不能接受,需要协商
  3. 协商结束后双方建立了LCP链路,接着就进入鉴别阶段,在这一状态下,只允许传送LCP协议的分组、鉴别协议的分组以及监测链路质量的分组。若鉴别失败,则转到“链路终止”状态,成功则进入“网络层协议”状态。
  4. 在“网络层协议”状态,PPP链路两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组,总之也许PPP协议两端的网络层可能运行不同的网络层协议,但是都可以使用一个PPP协议进行通信。

2.3 PPP协议帧格式

  • F:PPP协议帧界定符0x7E
  • A:地址字段0xFF,点到点信道PPP帧中的地址字段形同虚设,可以看到没有源地址和目标地址
  • C:字段的值为0x03,无实际意义
  • 协议:数据中的协议类型,0x0021-IP数据报;0xC021-LCP数据;0x8021-NCP数据等

为了实现透明传输,还需要对PPP协议进行帧填充,同步传输和异步传输由于机制不同,采用的填充方法也不同。

  • 同步传输。数据以帧为单位,PPP协议采用零比特填充。PPP协议的帧界定符0x7E对应的二进制为01111110,即有6个连续的1。为了避免在数据字段出现帧界定符,因此在每当发送方的数据链路层在数据中遇到连续的5个1,便自动在插入一个比特0,接收方将5个连续1后面的0自动去除。011011111111111010转换为01101111101111101010->还原为011011111111111010
  • 异步传输:数据传输以字节为单位,使用0x7D作为PPP帧的转义符,并使用字节填充。把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D,0x5E),每一个0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D,0x5D)。

3. 广播信道

广播信道是指一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议。现在以太网已经成为了事实的局域网标准,采用CSMA/CD协议。

CSMA/CD(Carrier Sense Multiple Access/Collision Detection,载波多重访问/碰撞检测)工作原理:

  1. 【开始】如果线路空闲,则启动传输,否则跳转到第4步。
  2. 【发送】如果检测到冲突,继续发送数据直到达到最小回报时间(min echo receive interval)以确保所有其他转发器和终端检测到冲突,而后跳转到第4步。
  3. 【成功传输】向更高层的网络协议报告发送成功,退出传输模式。
  4. 【线路繁忙】持续等待直到线路空闲。
  5. 【线路空闲】在尚未达到最大尝试次数之前,每隔一段随机时间转到第1步重新尝试。
  6. 【超过最大尝试传输次数】向更高层的网络协议报告发送失败,退出传输模式。

以太网为什么不采用信道复用

主要还是为了降低成本。通常局域网的物理层的传输主要是基于基带传输,CSMA/CD其实可以某种程度上认为是时分复用的技术,而频分复用则需要考虑频谱带宽问题,需要用到调制解调器。如今的以太网其实已经不怎么需要CSMA/CD协议了,交换机的出现取代了集线器。集线器中每一个端口都在同一个冲突域,所有数据包都跑在一条物理链路上,因此需要CSMA/CD协调,而交换机可以隔离冲突域(路由器可以隔离广播域),每一个端口都是独立的冲突域,现在的交换机都采用双绞线作为媒介,发送信道和接收信道独立,工作在全双工模式下,因此不会出现冲突。

4. MAC子层和LLC子层

由于广域网采用点对点通信方式,不存在介质冲突问题,而局域网是共享介质的,因此局域网内的数据链路层需要分为MAC(Media Access Control,媒体访问控制)子层和LLC(Logic Link Control,逻辑链路控制)子层。其中MAC子层的一项重要功能就是仲裁介质的使用权(CSMA/CD)。

4.1 MAC子层

MAC子层是局域网中数据链路层的下层部分,主要功能有:

  • 提供定址及媒体访问的控制方式,使得不同设备或网络上的节点可以在多点的网络上通信,而不会互相冲突
  • 数据帧的封装/解封装,帧的寻址和识别,帧的接收与发送,链路的管理,帧的差错控制等。MAC子层的存在屏蔽了不同物理链路种类的差异性。MAC子层作为LLC子层及物理层之间沟通的介质,提供了一种寻址的方法,即MAC地址。MAC地址是唯一的,每个网络适配器的MAC地址都不一样,因此可以在同一子网中发送数据包到特定的目的设备。

MAC地址

Mac地址是数据链路层地址,长度为6字节(48)位,用于唯一标识网络适配器。一台主机拥有多少个网络适配器就有多少个Mac地址。Mac地址通常使用6组,每组2位16进制数表示,每组之间冒号隔开。如82:17:0d:2d:9d:00

MAC帧格式

我们发现MAC帧没有帧开始界定符,那么我们如何区分不同帧呢。其实以太网发送的数据使用了物理层编码违禁法,利用曼彻斯特编码(从高到低跳变表示“1”,从低到高跳变表示“0”),每个码元正中间一定有一次电压转换,当发送方把一个以太网帧发送完毕后,就不在发送其他码元了,因此发送方网络适配器的接口上的电压也就不再变换了。这样接收方就可以知道以太网帧的结束位置了。

4.2 LLC子层

逻辑链路控制子层是局域网中数据链路层的上层部分,用户的数据链路服务通过LLC子层为网络层提供统一的接口。该子层通过在IP包上加了8位的源服务存取点和目的服务存取点(用于标识以太网帧所携带的上层数据类型)来保证在不同网络类型中传输。另外,有一个8或16位的控制字段用于像流控制的辅助功能。

LLC子层提供了两种无连接和一种面向连接的操作方式:

  • 无回复的无连接方式:它允许发送帧时:给单一的目的地址(单点传输)、给相同网络中的多个目的地址(多点传输)、给网络中的所有地址(广播传输)。多点和广播传输在同一信息需要发送到整个网络的情况下可以减少网络流量。单点传输不能保证接收端收到帧的次序和发送时的次序相同。发送端甚至无法确定接收端是否收到了帧。
  • 面向连接的操作方式。给每个帧进行编号,接收端就能保证它们按发送的次序接收,并且没有帧丢失。利用滑动窗口控制协议可以让快的发送端也能流到慢的接收端。
  • 有回复的无连接方式。它仅限于点到点通信。