TCP/IP协议-链路层

风尘

文章目录

  1. 1. 概述
  2. 2. 差错检测
    1. 2.1. 奇偶校验
    2. 2.2. 检验和
    3. 2.3. 循环冗余检测
  3. 3. 以太网
    1. 3.1. 帧结构
  4. 4. SLIP
    1. 4.1. 帧结构
    2. 4.2. 缺陷
    3. 4.3. 压缩
  5. 5. PPP
    1. 5.1. 帧结构
    2. 5.2. 优点
  6. 6. 环回接口
    1. 6.1. 创建原因
  7. 7. MTU

[TOC]

概述

节点 链路层协议的任何设备都叫做节点。

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

在通过特定的链路时,传输节点将数据报封装在 链路层帧 中,并将该帧传送的到链路中。

链路层提供的服务

  • 成帧 网络层数据报经过链路传送之前,链路层协议会将其用链路层帧封装起来。一个帧由一个数据字段(存储网络层数据报)和若干字段组成,不同协议帧的结构不同。
  • 链路接入 媒体访问控制(Medium Access Control,MAC) 协议规定了帧在链路上的传输规则。对于链路仅有一个发送方和一个接收方的点对点链路,MAC协议规定无论何时链路空闲,发送方都能发送帧。当多个节点共享单个广播链路时,即所谓多路访问问题,MAC协议用于协调多个节点帧传输。
  • 可靠交付 与运输层可靠交付类似,链路层的可靠交付通常是通过确认和重传取得的。通常用于容易产生高差错率的链路(如无线链路),其目的是在差错发生的链路上纠正,而不是通过运输层或应用层协议迫使进行端到端的数据重传。对于低比特差错的链路(如光纤、双绞铜线、同轴电缆),可靠交付会被认为是一种不必要的的开销,因此许多线路层协议不提供可靠交付服务。
  • 差错检测和纠正 当帧中的一个比特作为1传输时,接收方节点的链路层硬件可能不正确的将其判断成为0,反之亦然。这是由于信号衰减和电磁噪声导致的,因为没必要转发一个有差错的数据报,所以许多链路层协议提供一种机制来检测这样的比特差错。运输层和网络层也提供相应的检验,即检验和。链路层的检验机制通常更为复杂,并且用硬件实现。纠正与差错检测类似,区别在于其不但可以检测差错,而且能确定差错出现的位置,并纠正这些差错。

链路层主体是在 网络适配器(network adapter) 中实现的,网络适配器也叫 网络接口卡(Network Interface Card,NIC) 。位于网络适配器核心的是链路层控制器,该控制器通常是实现了成帧、链路接入、差错检测等服务的芯片。

部分链路层服务(如封装链路层寻址信息、激活控制器硬件、向网络层传递数据报等)运行在主机CPU上的软件中实现。

因此,链路层是硬件与软件的结合体,即此处是协议栈中硬件与软件交接的部分。

差错检测

差错检测的准确措词是 “是否检测到差错,而非是否出了差错”,所以即使用不用差错检测比特,也还是可能有 未检出比特差错 。因此,要选择一个差错检测方案,使得这种事件发生的概率很小。然而差错检测和纠正技术越复杂(即未检出比特差错概率较小的技术),开销就越大,也就意味着需要更多的计算量。

奇偶校验

差错检测最简单的方式就是 单个奇偶校验位(parity bit) 。如下图,要发送的信息Dd比特,在偶校验方案中只需要包一个校验比特,选择它的值使得d+1比特中1的总数是偶数个,如下图中的d的比特1的个数是9个,因此校验比特填入1使得发送数据比特1的个数为10个满足比特偶校验。反之,则为奇数校验。

比特偶校验比特偶校验

采用偶校验方案中,接收方如果发现了奇数个1比特,说明至少出现了一个比特差错,或者说出现了奇数个比特差错;如果出现了偶数个比特差错,这将导致一个 未检出比特差错

如果比特差错的概率小,且比特间的差错可以被看作是独立发生的,在一个分组中多个比特同时出错的概率极小的情况下,单个奇偶校验位 可能就足够了。然而,测量表明差错经常以“突发”方式聚集在一起,而不是独立发生的。

检验和

检验和方法需要相对较小的开销,如TCPUDP中的检验和只用了16bit。与常用于链路层的CRC相比,它们提供相对软弱的差错保护。

因为运输层差错检测用软件实现,采用简单快速的检验和方法进行差错检测的方案是很重要的。而链路层的差错检测在适配器中用硬件实现,它能够更快速的执行更复杂的CRC操作。

更多检验和原理请参考[IP首部检验和计算步骤]

循环冗余检测

循环冗余检测(Cyclic Redundancy Check,CRC)

以太网

它是数字设备公司因特尔公司Xerox公司1982年联合发布的一个标准,命名为 以太网(Ethernet Version 2) ,它是当今TCP/IP采用的主要的局域网技术。它采用一种 带冲突检测的载波侦听多路接入(Carrier Sense, Multiple Access with Collision Detection,CSMA/CD) 速率为10Mb/s,地址为48bit

几年后, 电气与电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE) 802委员会公布了一个稍有不同的标准集:

  • 802.3 标准 针对整个CSMA/CD网络

  • 802.4标准 针对令牌总线网络

  • 802.5标准 针对令牌环网络

  • 802.2标准 定义上面三个标准共同特性,如逻辑链路控制(LLC)

其中802.2标准802.3标准定义了一个与以太网不同的帧格式。详见下图:

帧结构

以太网帧结构以太网帧结构
  • 802标准帧格式

    • 目的地址源地址 字段,即硬件地址(MAC地址),大小为 48bit(6字节)802.3允许使用16bit的地址)。
    • 长度 字段,指它后续的数据的字节长度,不包括CRC
    • 目的服务访问点( Destination Service Access Point,DSAP)源服务访问点(Source Service Access Point,SSAP) 的值都设为0xaa
    • Ctrl 字段,值为3
    • org code 字段,值为0
    • 类型 字段,由后续 子网接入协议(Sub-network Access Protocol,SNAP) 的首部给出。
    • 数据字段 字段,标准定义了该字段的最小长度为38字节,长度不够时需要在不足空间插入PAD填充字节。
    • CRC 字段,帧内差错的循环冗余检测码。
  • 以太网帧格式

    • 目的地址源地址 字段,即硬件地址(MAC地址),大小为 48bit(6字节)
    • 类型 字段,与802标准格式相同,但是有效长度值与802标准不一样,因此可以根据此来区分两种帧,即大于1500就是以太网,否则为802.3
    • 数据字段 字段,标准定义了该字段的最小长度为46字节,长度不够时需要在不足空间插入PAD填充字节。
    • CRC 字段,帧内差错的循环冗余检测码。

    前同步码 ,以太网帧以一个8字节的前同步码(Preamble)字段开始。前7字节值都是10101010,用于“唤醒”接收适配器,并且将它们的时钟和发送方的时钟同步。

    为什么要同步时钟呢?因为发送适配器不会以精确的速率传输帧,总会有一些漂移,但是局域网上的其他适配器不会预先知道这种漂移,因此,接收适配器只需要通过锁定前同步码前7字节比特,就能够锁定发送适配器时钟

    最后一个字节值为10101011,最后两比特11是警告适配器“重要的内容”就要到来了。

SLIP

串行线路 IP(Serial Line IP,SLIP),是一种在串行线路上对IP数据报进行简单封装的方法,适用于家庭中每台计算机几乎都有的RS-232串行端口和高速调制解调器接入Internet。它是一种广泛使用的协议。

帧结构

SLIP帧结构SLIP帧结构
  • IP数据报以一个称作END(0xc0)的特殊字符结束。同时,为了防止数据报到来前的线路噪声被当成数据报内容,大多数实现的开始处也传入一个END字符(这样前一个错误报文交给上层后,发现内容毫无意义而被丢弃)。
  • 如果IP报文中的某个字符为END,那么就要连续传输两个字节0xdb0xdc来取代它。0xdb字符被称作是SLIPESC字符,它的值与ASCII中的ESC(0x1b)字符不同。
  • 如果IP报文中某个字符为SLIPESC字符,那么就要连续传输两个字节0xdb0xdd来取代它。

缺陷

  • 每一端必须知道对方的IP地址,没办法把本端的地址通知给另一端。
  • 数据帧中没有类型字段,如果一条串行线路用于SLIP,那么它不能同时使用其他协议。
  • 没有在数据帧上加检验和,如果发生错误只能通过上层协议来发现(新型调制解调器可以发现和纠正错误报文)。

压缩

由于串行线路的速率通常较低(19200b/s或更低),而且通信经常是交互式的(如Telnet),因此SLIP线路上有许多小的TCP分组进行交换。通常为了传输1个字节的数据需要20个字节IP首部和20个字节的TCP首部,总数超过40个字节。

基于上面性能上的缺陷,提出了一个压缩的SLIP协议,即CSLIP。它一般能把上面40个字节压缩到35个字节,大大缩短了交互响应时间。

大多数SLIP产品都支持CSLIP

SLIP接口标志

  • LINK0表示一个允许压缩的SLIP数据
  • LINK1表示如果从另一端收到一份压缩报文就允许使用CSLIP
  • LINK2所有外出的ICMP报文都被丢弃。

PPP

点对点协议(Point to Point Protocol,PPP) ,修改了SLIP协议中所有的缺陷。PPP包括以下三个部分:

  • 在串行链路上封装IP数据报的方法。
  • 建立、配置及测试数据链路的 链路控制协议(Link Control Protocol,LCP) 它允许双方进行协商,以确定不同选项。
  • 针对不同网络层协议的 网络控制协议(Network Control Protocol,NCP) 体系。如IP NCP允许双方协商是否对报文首部进行压缩,类似于CSLIP

帧结构

PPP帧结构PPP帧结构
  • 每一帧都以0x7e开始和结束。
  • 地址 字段,值始终为0xff
  • 控制 字段,值始终为0x03
  • 协议 字段,类似以太网中类型字符功能。
  • CRC 字段,循环冗余检验码。

当标志字符0x7e出现在 信息 字段时,需要对它进行转义。在同步链路中通过一种称作 比特填充(bit stuffing) 的硬件技术实现;

在异步链路中,特殊字符0x7d用作转义字符,后面紧接着的字符的第6比特要取其补码(注意:此处的补码为 “求补” ["补码"跟"求补"不总是一回事,求补,求余,全集的补是空集,空集的补是全集,1的补是0,0的补是1]---解释来源网络):

  • 当遇到0x7e时,需要连续传递两个字符0x7d0x7e,然后将0x7e的第6比特转换成其补码,即1111110转为1011110,所以最终传递的两个字符为0x7d0x5e

  • 当遇到0x7d时,也需要进行转义,原理同上,即最终传递两个字符为0x7d0x5d

  • 默认情况下,需要对ASCII32个控制字符(排除空格控制字符)进行转义。如0x01,这时将其第6个比特取补码后变为1,即000001转换为100001,所以最终传递两个字符为0x7d0x21

    这样做的原因是防止它们出现在双方主机的串行接口驱动程序或调制解调器中,因为有时它们会把这些控制字符解释成特殊的含义。

SLIP类似,PPP也常用于低速的串行链路,因此可以利用链路控制协议,大多数产品通过协商可以省略标志符和地址字段,并且把协议字段由2个字节减少到1个字节。

使用IP网络控制协议,大多数可以通过协商采用Van Jacobson报文首部压缩方法(对应CSLIP)减小IPTCP首部长度。

优点

  • 支持在单根串行线路上运行多种协议,不只是IP协议。
  • 每一帧都有循环冗余检测。
  • 使用IP网络控制协议,通信双方可以进行IP地址的动态协商。
  • CSLIP类似,对TCPIP报文首部进行压缩。
  • 链路控制协议可以对多个数据链路选项进行设置。

实现这些优点的代价是在每一帧的首部增加 3个字节,当建立链路时要发送几帧协商数据,以及更为复杂的实现。

环回接口

环回接口(Loopback Interface,lo) ,是路由器上的一个逻辑虚拟接口。大多数产品都支持环回接口,以允许运行在同一台主机的客户和服务程序进行TCP/IP通信。

A类网络号127就是为其预留的,通常把IP地址127.0.0.1分配给这个接口,子网掩码一般建议设为255.255.255.255,并命名为localhost。一个传给环回接口的IP数据报不能在任何网络上出现。

当传输层检测到目的地端的地址是环回地址,可以省略传输层和网络层的所有逻辑操作。但大多数产品还是照样完成传输层和网络层的所有过程,只是当IP数据报离开网络层时把它返回自己;

当目的地址是广播地址或多播地址时,IP数据报会复制一份传给环回地址,然后发送到以太网上。

创建原因

  • 环回接口有一个特性,除非设备瘫痪,否则其状态一直是up。基于这个特性,用来建立比物理接口更稳定的路由邻居来保证邻居关系不会中断。
  • 用来作为Router-ID,相当于一台路由器的身份证号,在一个指定的范围内只能标识一台设备,不能有重复。稳定可靠,可以节省地址。
  • 用于网络连通性测试创建并配置好环回接口之后,它的地址是能被pingtelnet的,这就可以被用来测试网络的连通性。
  • 用于虚拟隧道连接在建立IPSecGRE之类的虚拟隧道时,使用loopback接口可以保证整个隧道的稳定性。

BSD系统定义了变量useloopback,并初始化为1。如果值为0,以太网驱动程序就会把本地分组送到网络,而不是送到环回接口上。它能否工作取决于所使用的以太网口卡和设备驱动程序。

MTU

以太网和802.3对数据帧的长度最大限制为15001492字节,链路层的这个特性称作, 最大传输单元(MTU)

如果IP层传输的数据报长度超过MTU,那么IP层就需要进行切片分组成若干片,并且每片都小于MTU

当两台主机通信需要经过多个网络时,那么每个网络的链路层可能有不同的MTU。此时重要的不是两台主机的MTU,而是路径中的最小MTU,它被称作 路径MTU

两台主机之间的路径MTU不一定是个常数。它取决于当时所选择的路由。而选路不一定是对称的(从AB的路由可能与从BA的路由不同),因此路径MTU在两个方向上不一定是一致的。