• 注册
  • Android博客 Android博客 关注:0 内容:1370

    因特网协议栈:链路层概览

  • 查看作者
  • 打赏作者
  • 当前位置: 职业司 > Android开发 > Android博客 > 正文
    • Android博客
    • 什么是链路层

      如果你给远方朋友写了一封信,并最终交付到朋友手中经历了怎样的过程?首先,你会把信装好投递到邮局,邮局将把信从寄信地址发往收信地址。然后,驾驶运载着你的信的司机将按照实际情况规划路线,穿梭过各个城市、高速路到达目的地。最后目的地邮局将分派信件到朋友手中。

      以此类比,把信内容当成要传播的信息,网络的意义是为了将信息从一个地方传输到另一个地方。那么,为了各种必要的目的与职责,因特网协议栈将网络抽象成了五个层次结构,分别是应用层运输层网络层链路层物理层。每一层与之对应的职能为:

      • 应用层:寄信与收信的个人,是信息的最终处理者。因此,应用层的受众是独立主机中的各个应用程序,它规定了有物理距离的程序之间怎样交换信息。如同写信按一定的规则填写内容并写上必要的收信人信息。
      • 运输层:将信件收集起来的邮局。对应的,运输层的受众是主机,主机负责收集应用程序要发往网络的信息,进行必要的处理再将其发送。那么,运输层规定了主机之间如何交换信息,如同邮局有共通的工作方式才能知道信件最终交给谁。
      • 网络层:规划路径的使能人,可以使邮局也可以是司机,目的是规划并行驶的路径,途中可能因为某段路的拥堵而改变路径。因此,网络层的受众是执行规划路径的功能设备或单元,它规定了为了获得可行的有效率的路径,各个功能设备或单元如何相互交换信息。
      • 链路层:正常在道路上行驶所要掌握的信息与载具。它的受众是判断一段链路是否可以以及如何发送数据的功能单元,它规定了为了最终传输信息,单元如何交换信息或要遵守的规则。如同为了正常行驶,需要使用载具、有行驶技能、能识别前方路口左转、限速40等信息。
      • 物理层:成为"道路"的物理介质。它的受众是传输信息的物理媒介。实际上,无论何种信息都要通过物理媒介承载,如同信件、司机要道路承载才能到达目的地。

      因特网协议栈:链路层概览

      可以引出,链路层规定了如何在物理层上传输数据,并避免直面物理介质的种种特性。换句话说,链路层提供了载具,行驶在物理层连接起来的道路上。

      理解链路层运作

      自然地,以某种方式连接的两个设备,无论是以电缆、广播等媒介,设备间的通信信道(连接路径)在链路层中视为链路,这种设备均可以称为节点

      链路层帧

      链路层将数据封装成链路层帧,然后通过链路在两个节点间交换帧数据。帧数据表示特定的数据结构,并以此索引承载的信息。以电信号为例,一串比特流要被转译成特定的电信号来输出,发送方要转译,接收方要解译。

      一个简要的帧格式起码包括:

      | 帧头部 | 数据信息 |
      复制代码

      那么,为了表明一个帧的开始和结束,会在每一帧的开始和结束地方加入特定的字符,如0X7E,即 “0111 1110”。那么当发送端发送数据时,每当发现连续的5个1则立即填充一个0;接收端每发现5个连续的1则立刻删除后面的0。如此的方式得以让接收端知道每一帧何时结束。

      链路层协议

      链路层协议存在的目的,是为了规范传输行为以达到有效率。试想一下若是没有交通规则整个交通将糟糕成什么样子。为了达到目的,一个链路层协议包括:

      • 成帧:网络层数据经由链路层分装成帧发出,并能按特定的规则解释。
      • 链路接入:无论何时链路空闲,发送方都能够发送帧。
      • 可靠交付:因为传输媒介的物理特性,一些信息可能发生错误,则一些链路层协议将确保交付正确的帧,而另一链路层协议则认为运输层或应用层已做处理而不做可靠交付导致的不必要开销。
      • 差错检验和纠正:由于物理介质而导致的数据错误,在数据发送前通过某种方式为数据计算出一个值,随着数据一起装入帧,接收方收到帧后,通过同样方式比较计算出的值来判定数据是否有误,甚至做以纠正。检验方式包括奇偶校验检验和方法循环冗余检测等,总之,越复杂的方法开销越大,但检测到错误的概率越大,取之平衡、不做拓展。

      多路访问链路

      对于所涉及的链路,可以粗略地分为两种类型,点对点链路广播链路。前者表示链路两端仅对应单个接收方和单个发送方组成;后者表示多个发送方和多个接收方都连接到共享的链路上。

      因特网协议栈:链路层概览

      对于广播链路将不可避免地带来碰撞问题,由于物理介质特性,如果多个发送方同时发送信号,将相互干扰,没有一个接收方能收到有效的信息。因此如何协调发送方访问共享链路,以尽可能地避免碰撞,有效地将数据交给接收方称为多路访问问题

      针对于不同的链路类型,对应而设计的协议类型为点对点协议多路访问协议

      进一步地,多路访问协议根据访问链路方式特点不同,可分为信道划分协议随机接入协议轮流协议。对于每一种协议,当处于速率为R的链路上,我们希望:

      • 当只有一个节点访问链路时,达到R速率的吞吐量。
      • 当有M个节点访问链路时,每个节点吞吐量在何时的周期内有 R/M 的吞吐量。
      • 协议是分散的,不会因为某个节点的故障而使停转。
      • 协议是简单的,实现不昂贵。

      信道划分协议

      因特网协议栈:链路层概览

      FDM,频分多路复用

      在FDM技术下,信道将按照频谱被分成若干段,每个节点使用不同的频段上传送数据。缺点为,频段没被使用时因闲置而浪费,速率达不到R。

      TDM,时分多路复用

      在TDM技术下,将时间分成某种单位,称为时间帧,进一步的,把时间帧分为多个时隙。每个节点能分配到时隙,在周期的时隙上传播数据。TDM下每个节点的速率将被限制在 R/M 以内。

      CMDA,Code Division Multiple Access,码分多址

      节点不能同时发送信息的原因在于,相互叠加的信号令接收方难以解释。在CMDA下,会分配给每一个节点特殊的编码,节点使用这些编码对数据加工再发出去,只要精心选择,接收端就能从叠加的信息中过滤出自己的有效信息。

      其原理可以粗略的理解为如图上,一个叠加信息 “BCDEMTUA” 在经编码处理后,接收端过滤出了自己要的信息“CDMA”。 CDMA抗干扰能力特别强,与无线信道息息相关。

      随机接入协议

      随机接入协议的核心为:一个节点总是以信道的速率R发送数据,当发生碰撞时,按照某种规则重新发送帧

      时隙ALOHA

      一个最简单的随机接入协议为时隙ALOHA协议,它的运作方式可以描述为:

      • 所有帧由特定的固定长度组成
      • 时间最终分割成时隙,每个时隙里能完成一个帧的传输
      • 节点是同步的,每个节点都知道每个时隙什么时候开始,并且只在时隙开始时传输数据
      • 如果在一个时隙中发生碰撞,则所有节点在时隙结束前能检测到碰撞。发生碰撞后节点按照一个概率p,在之后的每个时隙决定要不要重传,直到重传成功。

      因特网协议栈:链路层概览

      与信道划分不同的是,在时隙ALOHA中,如果只有一个节点在传输数据,它工作良好并能达到吞吐量R。但它的效率受发生碰撞发生的几率影响。效率指在一段时间内,成功传输的时隙占总时隙的比例。通过概率容易推导在N个节点持续不断有数据要传输的情况下,一个节点成功传输的概率为 p(1-p)^N-1, 任意节点成功传输的概率为 Np(1-p)^n-1, 因此效率为 Np(1-p)^n-1。 在N趋近无穷求极限得 1/e = 0.37 。

      那么,在繁忙时,一个R吞吐量的信道实际的吞吐量仅有 37%。

      具有碰撞协议的载波侦听多路访问(CSMA/CD)

      在时隙ALOHA中,各个节点在仅考虑自己的情况下使用信道。对于CSMA/CD而言,做法更绅士:

      • 在传输前,总是先监听信道,是否有其他节点正在使用信道,这种行为称为载波监听。如果信道正在被使用,则等待直到信道空闲,然后开始传输。
      • 在传输过程中,持续地监听信道,如果检测到发生碰撞,那么节点知道此次传输必定无效率而停止传输。随机等待一段时间,如果信道空闲则传输,否则继续随机等待一段时间,重复这个过程直到传输成功。

      在载波侦听的条件下,还能发生碰撞的原因在于,传播有时延。T时刻,A在信道上的广播传输需要时间,同一时刻,B还没有监听到广播通过,向同一信道广播;在Tk时刻,AB的广播信息相遇,AB检测到碰撞。因此,传播时延越长,节点不能监听到另一个节点正在使用信道而导致的碰撞的几率越大。

      CSMA/CD 的效率(推导过程复杂,直接使用近似式) = 1 / (1 + 5(dprop / dtrans)) ,dprop 表示广播信号在任意两个节点间传播的最大时间,dtrans表示传输一个最大长度帧所需的时间。

      轮流协议

      轮流协议有很多种,并有很多变种。一个最简单的轮训协议为:选取一个主节点,轮流询问其他节点有没有数据要传输,如果有则通知允许节点传输一些帧,并观察信道上是否缺乏信号来判断节点是否完成传输,进而继续询问下一节点。

      轮流协议的好处显而易见,消除了随机接入协议的碰撞和空时隙。缺点也明显,即是一个节点不需要传输也需要询问,询问与通知引起了时延,那么就算只有一个节点需要传输也达不到信道最大吞吐量;如果主节点故障,则停转。

      基于此,一个加强的轮训协议为令牌传递协议。在这个协议中没有主节点,而是将一个称为令牌的小的特殊帧,以特定的次序在节点间传递,只有拿到这个令牌的节点才会使用信道传输数据。当节点发送了一些帧或者没有帧要发送时,将令牌交给下一个节点。令牌传递协议也可能因为一些节点的故障或者节点没有释放令牌而停转,因此又有其他变种。无论哪一种,都要面对一些棘手的问题。

      寻址

      数据总有来处与去向,为了得知具体位置,需要以某种形式来构建地址。虽然在网络层中,已有IP地址来描述主机在网络中的位置,但是链路层却不能使用IP地址来构建位置信息。链路层使用了MAC地址来说明对应的接口位置(也可用LAN地址、物理地址)。两者地址关系与应用场景不同,就如MAC地址对应于人的身份证,IP地址对应于人的居住地址,MAC不会改变。

      硬件设备在生产时,由厂商为其分配MAC地址,而厂商需要与IEEE申请可以分配的地址范围,因此MAC地址是唯一的。当然,有极小概率有同样的MAC地址,但只要他们不处于同一个子网中,就能正常工作。

      MAC地址占6字节大小,由地址解析协议(Address Resolution Protocol, ARP)来规定MAC如何寻址。

      因特网协议栈:链路层概览

      在每台主机或路由器中,都可能存在一份ARP表来映射IP地址与MAC地址的管理,并且每个表项都有一个存活时间(TTL)值。ARP表如:

      IP地址 MAC地址 TTL
      111.111.111.111 AA-AA-AA-AA-AA-A1 11:08:00
      111.111.111.112 AA-AA-AA-AA-AA-A2 11:09:03

      当一个主机要发送一个数据报时,如果ARP表项有符合的映射关系,就将目的MAC地址设置对应的地址值。如果没有符合的映射关系,则通过ARP模块来获取对应的MAC地址。其工作过程为:

      • ARP作用于同一子网才有意义。
      • 发送方利用ARP协议构建称为ARP分组的特殊分组,包含发送方IP地址、接收方IP地址、发送方MAC地址。
      • 发送方广播ARP分组,其目的MAC地址设置为FF-FF-FF-FF-FF-FF的广播地址,如同在子网中询问“谁知道IP地址为A的MAC地址”。
      • 某个能处理ARP分组的主机或者路由器将对发送方回复ARP响应分组。
      • 发送方收到响应后,更新ARP表项,然后把数据报的MAC地址设为对应值,把数据报发送出去。

      如上图,构成了子网地址为 111.111.111/24 和 222.222.222/24 的两个子网,如果IP地址为111.111.111.111的主机向IP地址为222.222.222.222的主机发送数据报,会发生什么呢?

      IP地址为222.222.222.222的主机的MAC地址为BB-BB-BB-BB-BB-B2,但是发送方主机不能直接将MAC地址设置为BB-BB-BB-BB-BB-B2,因为子网222.222.222/24中并没有任何设备有用此MAC地址的接口,此分组将最终被丢地。

      注意到,路由器能处理 111.111.111/24 与 222.222.222/24 内的数据报。一开始,发送方没有IP地址222.222.222.222对应的ARP表项,通过ARP分组向子网询问。路由器收到ARP后发现自己能处理222.222.222/24内的地址,回复ARP,你把它发给我吧我能处理吧,我的MAC地址为 AA-AA-AA-AA-AA-AA。紧接着,发送方将数据报发送给路由器。

      路由器通过转发表,知道IP地址为222.222.222.220的接口能处理子网 222.222.222/24,将数据报转发到此接口。

      路由器在子网 222.222.222/24 通过ARP询问谁知道IP地址为222.222.222.222的主机的MAC地址,然后收到目的主机的ARP回复——MAC地址为BB-BB-BB-BB-BB-B2。最后,适配器封装成一个目的MAC地址为BB-BB-BB-BB-BB-B2的帧,最终数据交到IP地址为222.222.222.222的主机。

      交换机

      交换机的目的是接收链路层帧并转发到另一个节点,而寻址的内容中,并没有提到交换机。这也是交换机要达到的效果——对于主机或路由器是透明的。

      当交换机接受到一个帧时,将被过滤,可以是转发到某一个接口,或是将它丢弃。这取决于交换机所拥有的交换机表。交换机表包含了某局域网上某些主机和路由器的表项,每个表项包含MAC地址、MAC地址对应的交换机接口、表项放置在表中的时间。如:

      地址 接口 时间
      AA-AA-AA-AA-AA-A1 1 11:00:00
      AA-AA-AA-AA-AA-AA 3 11:07:00

      由此也能看出,交换机是通过MAC地址工作而不是IP地址。每个表项将维持一段时间后过期。现在,假设Y接口收到一个目的MAC地址为X的帧,依靠现有的交换机表情况,可能会进行的处理为:

      • 表中没有关于X的表项,那么,交换机将会向除了Y接口外的所有接口广播这个帧。
      • 表中有关于X的表项,关联的接口为Y,那么交换机不会转发此帧,丢弃以达到过滤目的。
      • 表中有关于X的表项,关联的接口为Z,那么交换机将这个帧转发到接口Z。

      那么交换机表是怎样得来的呢?

      自学习

      交换机表的获取简单却有效,是自动的、动态的及自治地建立的:

      • 在一开始,交换机表为空
      • 当交换机的某个接口收到一个帧时,帧中有源MAC地址,那么,就可以建立表项,将MAC地址与接口关联起来
      • 如果在一段时间后没有收到某表项中来自于所记录的MAC地址的帧,则这个表项将被删除

      随着时间流动,交换机将拥有近期内活跃的MAC地址信息及对应的接口。因此对于以交换机锁构建的局域网来说,不必人为配置交换机表。

      交换机的特点

      • 消除碰撞:在以交换机构建的局域网中,没有因碰撞而浪费的带宽,交换机不会同时传播多个帧。
      • 异质的链路:与交换机连接的链路彼此隔离,因此不同的链路能够以不同的速率运行。
      • 管理:交换机易于管理网络,如某个节点可能因故障持续地发送帧,交换机可以直接检测到问题并与之断开。

      以太网

      现如今,最广泛的构建有线局域网技术毫无疑问为以太网。想想我们所使用的家庭网络,连接入网的方式几乎为以太网。

      在一开始,以太网上的所有节点与总线连接,是以总线拓扑的广播局域网,所有要传输的帧都能被与总线连接的所有节点接收到。

      到了20世纪90年代末期,以太网演变成了基于集线器的星形拓扑广播局域网,主机与路由器直接用双绞对铜线连接。集线器只是放大信号强度,如果同时从不同接口收到了帧,将产生一次碰撞,那么生成这些帧的节点必须重传。

      因特网协议栈:链路层概览

      现在,绝大部分的以太网是基于交换机的星型拓扑局域网。由交换机的特点可以知道,不会产生碰撞问题。对于一些需要广播的场景,各节点也能通过CSMA/CD加以解决。

      在以太网中,以以太网帧作为传输单位帧:

      | 前同步码 | 目的地址 | 源地址 | 类型 | 数据 | CRC |
      复制代码
      • 前同步码:8字节的前同步吗,前7个字节都是10101010,最后一个字节是10101011。前同步码的作用是协调发送方和接收方的时钟同步。以太局域网支持各种传输速率,各节点速率难免有飘逸,因此前同步码基于接收方足够的调整时期以接收以太网帧。
      • 类型:指明上一层所使用的协议,以让节点区分处理。

      其他的帧属性于前面所诉无太大差异。

      以太网支持了各种速率,那么各种命名也就不奇怪了。如10BASE-T、10BASE-2、100BASE-T、1000BASE-LX、10GBBASE-T等。规律为,前面数字部分表示速率,如10Mbps、10GB等、BASE指基带以太网,最后的缩写表示物理媒介本身。

      总结

      链路层的目的,在于承载数据,以合适的方式与时机使用物理层,将数据传输目的地。

      • 由于物理媒介上传播信息方式的固有特性,传播过程可能因衰弱、干扰、叠加等因素导致信息出错,因此需要如CRC的检验方式,在接收方校验数据。
      • 对于传播,多个节点同时传播,必然没有接收节点得到有效帧,就需要链路层协议来控制传播节奏,即哪个节点应该在什么时候传播。因此有了信道划分协议、随机访问协议、轮流协议三大协议种类来面对多路访问问题
      • 当要识别一个帧归属,就有了MAC地址确定物理设备身份,无论处于任何物理位置,其身份不会改变。
      • 对于以有线形式构建的局域网来说,交换机的出现能有效控制传输节奏,通过自学习的方式得知不同的MAC地址所对应的接口。交换机接收各种帧,并且保证不会同时传播帧,由此避免了碰撞问题。

      文章大部分内容来自《计算机网络——自顶向下方法》第七版,第6章。

      因特网协议栈各层文章传送门

      因特网协议栈:应用层协议在做些什么

      因特网协议栈:运输层如何交付数据

      因特网协议栈:网络层之数据平面

      因特网协议栈:网络层之控制平面

      因特网协议栈:链路层概览

      参考

      《计算机网络——自顶向下方法》第七版,第6章

      【计算机网络】你真的理解数据链路层吗?

      码分多址(CDMA)的本质-正交之美

      请登录之后再进行评论

      登录

      手机阅读天地(APP)

      • 微信公众号
      • 微信小程序
      • 安卓APP
      手机浏览,惊喜多多
      匿名树洞,说我想说!
      问答悬赏,VIP可见!
      密码可见,回复可见!
      即时聊天、群聊互动!
      宠物孵化,赠送礼物!
      动态像框,专属头衔!
      挑战/抽奖,金币送不停!
      赶紧体会下,不会让你失望!
    • 实时动态
    • 签到
    • 做任务
    • 发表内容
    • 偏好设置
    • 到底部
    • 帖子间隔 侧栏位置:
    • 还没有账号?点这里立即注册