美文网首页
chapter5-链路层

chapter5-链路层

作者: 程序员七哥 | 来源:发表于2019-07-15 00:45 被阅读0次

    本章接着前一章学习的网络层,更加深入来到下一层数据链路层。

    链路层概述


    首先来一张数据报传输过程的例子,帮助理解数据报是如何从发送端到达目的端的,中间发生了怎样的过程,来看下面这张图:

    公司网络

    如上图所示的公司网络中,思考从无线主机向服务器发送一个数据报,该数据报将实际通过6段链路:

    1. 发送主机与WIFI接入点之间的Wifi链路;
    2. 接入点与链路层交换机之间的以太网链路;
    3. 链路层交换机与路由器之间的链路;
    4. 两台路由器之间的链路;
    5. 路由器和服务器链路层交换机之间的链路;
    6. 交换机和服务器之间的以太网链路;

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

    链路层提供的服务

    1. 成帧
    2. 链路接入
    3. 可靠交付,链路层的可靠交付通过是通过确认和重传取得,这里应该联想传输层的TCP协议提供的可靠传输服务。
    4. 差错检测和纠正

    链路层在何处实现

    链路层的主体部分是在网络适配器中实现的,也就是我们说的网卡,它实现的服务有:成帧、链路接入、差错检测等。

    差错校验和纠技术


    链路层接到上层的应用数据后,加上自己的首部组成链路层数据报,放在链路中进行传播。传播中可能发生错误,因此需要有差错检测机制来发现链路层首部和应用数据的错误。差错检测可能并不能找到所有的错误,因此链路层可能向上层交付一个有差错的数据报,但是这种事情的发生概率比较低

    差错检测常用的 3 种技术分别是:奇偶校验、检验和方法、循环冗余检测

    1. 奇偶校验 方法是其中最简单的一种。如果要发送 d 比特的数据,在这些数据的最后附加一个比特,共 d+1 比特,附加的比特使得所有的比特位中的 1 的个数是偶数。这样,当接收方收到数据后,只需要检查 d+1 比特的数据中的 1 的个数是不是偶数,如果不是则必定在传输过程中发生了错误;但是如果是,也并不意味着一定没有发生错误,因为有可能在两个地方发生了比特翻转使得 1 的个数仍为偶数,当然这样的事情发生的概率是比较低的

    上面这样的奇偶校验方法是一维奇偶校验,后来还出现了 二维奇偶校验 方法。将所有的数据分为 i 行 j 列,对每一行附加一个比特,对每一列也附加一个比特,这样总共就附加了 i+j+1 比特。每一行和每一列的附加比特都让行和列的数字 1 的数量是偶数。当某一个比特数据发生错误后,我们发现在第 n 行和第 m 列的数字 1 的个数不是偶数,那么发生错误的数据就是 n 行 m 列的数据,这样我们就能把该比特数据翻转到另一个值,我们就纠正了数据错误,这种能力叫做 前向纠错。二维奇偶校验同样能发现多于一个比特的数据错误,但这种情况下就不能纠正错误了

    1. 英特网检验和(Internet checksum) 是另一种差错监测方法。从它的英文名称就可以看出,它是把二进制数据当做整数进行求和来检测差错的。比如,将数据按 16 比特分为多个整数,将所有整数求和,把和取反码就得到了检验和。把检验和附加在报文中。接收方收到数据和检验和后,同样按照 16 比特的分组把所有整数求和并取反码,如果得到的数全是 1 说明数据传输没有发生错误;而如果有一位是 0 就说明错误发生了

    之前学习运输层时我们知道运输层的协议多是用检验和法,而链路层协议通常会用下面介绍的 CRC 方法。检验和方法相对于 CRC 来说偏弱一些,而因为运输层协议通常是由软件实现,因此运输层选择了偏弱但是计算更加快速的检验和方法。而链路层因为更加贴近底层硬件,而硬件专门对 CRC 提供支持,因此链路层选用了更强的 CRC

    1. 循环冗余检测(Cyclic redundancy Check, CRC) 是链路层使用的差错检测技术。这个方法国语复杂,我也并没有看懂,这里就不详细记录了

    多路访问链路和协议


    多路访问问题 研究如何协调多个发送和接受节点对同一个共享广播信道的访问。当两个或多个节点在信道上同时发送数据时,他们的信号会彼此 碰撞(collide),发生碰撞后任何节点都不能从信道上接受数据。因此多路访问协议要决定谁在什么时候有发送数据的权力。目前有很多多路访问协议,可以分为以下三种:

    1. 信道划分协议
    2. 随机接入协议
    3. 轮流协议

    对于一个速率是 R bps 的广播信道,多路访问协议最好有下面的特性:

    • 当仅有一个节点在发送数据时,节点应有 R bps 的吞吐量
    • 当有 M 个节点在发送数据时,每个节点应有 R/M bps 的吞吐量。不一定要求每个节点在每个时间点都有 R/M bps 的吞吐量,而是在一个时间段内有这要的平均速率。这也要求每个节点都能平等的使用信道
    • 协议不会因为单个节点的故障而崩溃
    • 协议应是简单的,实现不昂贵

    信道划分协议

    信道划分协议有 3 种:

    1. 时分多路复用(TDM)
    2. 频分多路复用(FDM)
    3. 码分多址(CDMA)
    • 时分多路复用是把时间划分 时间帧(time frame),而一个时间帧划分为为多个 时隙(slot)。时隙会被分配给各个节点,每个节点有数据要发送时,只能等待直到自己的时隙到来才能发送。TDM 非常公平,但是当只有一个节点要发送数据时,这个节点的吞吐量被限制在 R/M bps,不能到达信道的全速

    • 频分多路复用把信道划分为不同的频段,频道的速率是 R/M bps,频段被分配给各个节点,各个节点可以同时发送数据而不会碰撞。FDM 与 TDM 一样公平但是当只有一个节点时不能全速发送

    • 码分多址技术给每个节点分配不同的编码,精心选择编码可以使得当多个节点同时发送数据而不发生干扰,接收方能正确接收发送方编码的数据比特(假设接收方知道发送方的编码),而不再乎其他发送方的干扰传输。

    随机接入协议

    随机接入协议中,每个节点总是以最大的速率发送数据,当有碰撞发生时,节点等待一个随机的时间后再次尝试发送数据。随机接入协议中比较常见的有 ALOHA 协议载波侦听多路访问协议(CSMA)

    时隙 ALOHA

    对时隙 ALOHA,我们做出下面的假设:

    • 所有帧由 L 比特组成
    • 时间被划分为 L/R 的时隙,正好每一个时隙发送一帧
    • 节点只在时隙的开始发送帧
    • 节点是同步的,每个节点都知道时隙何时开始
    • 如果在一个时隙中有两个或多个帧发生碰撞,节点会在时隙结束之前得知碰撞事件

    对于 ALOHA 协议中的操作如下:

    • 当节点有数据要发送时,等到下一个时隙开始立即传送数据
    • 如果没有碰撞,数据的发送就成功了。如果有新帧到来,立即发送
    • 如果有碰撞,那么有 p 的概率在下一个时隙中发送数据,直到数据没有碰撞的发送出去

    相比较于 TDM 和 FDM,ALOHA 协议同样公正,而且在只有一个节点有数据发送时,它能以全速发送数据。当有大量的节点存在时,节点间会因为碰撞而造成一些时隙被浪费。我们定义一个成功的时隙就是无碰撞的成功发送了数据的时隙,而效率就是成功的时隙占所有时隙的份额。通过计算表明,当有大量的节点有发送大量的数据时,ALOHA 协议的效率大约是 1/e = 37%,有 26% 的时隙发生了碰撞

    非时隙 ALOHA 协议

    时隙 ALOHA 协议中有一个假设:节点之间是同步的。但第一版的 ALOHA 协议是一个非同步协议,即节点可以在任意时间点开始发送数据。去掉节点间的必须同步的假设后,我们可以得到非时隙 ALOHA 协议的效率是 1/(2e) ,比时隙 ALOHA 协议还要小一些

    载波侦听多路访问协议

    在 ALOHA 协议中,节点决定是否发送数据与其他节点无关,这就导致当其他节点在发送数据时,另一个节点也开始发送数据就必定使得碰撞发生。而如果节点如果能够侦听到另一个节点正在发送数据,那么它决定在另一个节点结束发送数据后才发送自己的数据,这将避免碰撞的发生。这就是 载波侦听 原理

    除此之外还有一个重要的原理叫做 碰撞检测(collision detection),即节点在发送数据时同时也在侦听网络,一些发生另一个节点发送的信号与自己发送的信号相互干扰后就立即停止发送

    这两个规则被包含在 载波侦听多路访问协议(Carrier Sense Multiple Access, CSMA) 和 具有碰撞检测的 CSMA(CSMA with Collision Detection, CSMA/CD) 协议族中

    如果说节点具有载波侦听功能,那么为什么还会发生碰撞呢?这是因为信号在信道中传播的速度是有限的,当一个节点 A 开始传送数据后,另一个节点 B 可能需要过一段时间才能侦听到信号,如果 B 在侦听到信号之前也开始传送数据,那么此时碰撞就发生了

    在检测到碰撞后,节点会等待一个随机的时间后再次尝试发送数据。这个随机的时间量选择也是有一个算法的,叫做 二进制指数后退(binary exponential backoff)。即当节点连续发生 n 次碰撞后,它会从 {0, 1, 2, 4, ... , 2^n -1 } 的常数中随机选择一个值 K 。在以太网协议中,等待的时间是 K * 传送 512 比特所需要的时间,作为随机等待的时间。n 能取到的最大值一般是 10

    经过一系列复杂的计算,我们可以得到 CSMA/CD 的效率是 1 / (1 + 5 d1/d2) ,其中 d1 是信号在两个节点间传播所需要的最大时间,d2 是传递一个最大长度的以太网帧所需要的时间。当 d1 越小时,传播速率越接近于 1 ,即信号传播速度越快,碰撞越不可能发生

    轮流协议

    轮流协议(taking-turns protocol)也有很多种。

    第一种轮流协议是 轮询协议(polling protocol)。这个协议要求一个节点被指定为主节点,主节点轮询每个节点,告诉每个节点它能传送的帧的数量。比如主节点告诉节点 1 它能传送的帧的数量,当节点 1 传送完这些帧后,主节点告诉节点 2 能传送的帧的数量,依此类推。这个协议需要轮询每个节点,这就引入了轮询时延,导致效率有所降低。第二个缺点是当主节点出现故障,整个信道都不可用了。802.15 协议和蓝牙协议就使用了轮询协议

    第二种轮流协议是 令牌传递协议(token-passing protocol)。这个协议没有主节点,而是存在一个称为 令牌(token) 的特殊帧,令牌只有一个,在每个节点之间以固定的次序传输。如果一个节点有数据需要发送,它会尝试去获取令牌,只有当它拿到令牌后才会开始发送数据。如果节点拿到了令牌却没有数据需要发送,那么它会把令牌传递给下一个节点。下一个节点会根据自己有没有数据需要发送而决定是自己保留令牌还是传给另一个节点。令牌传送协议效率很高且分散,但是也有自己的缺点。如果一个节点发生故障,没有适时交出令牌,那么整个网络将会瘫痪,必须通过某种令牌恢复策略才能从瘫痪中恢复

    交换局域网


    • 主机除了具有英特网 IP 地址外,他们还有另外一种地址,即 MAC 地址。严格来说,是主机的网络适配器具有 MAC 地址。对于有多个接口的路由器,每一个接口都对应了一个 MAC 地址
    • MAC 地址总长度是 6 字节,因此共有 2^48 个可能的地址,大约是 200 万亿个,数字这么大以至于目前世界上没有两个网卡具有相同的 MAC 地址

    地址解析协议 ARP

    因为有网络层地址(IP 地址)和链路层地址(MAC 地址)的存在,就需要在两者之间进行转换,这个转换的协议就是 地址解析协议(Address Resolution Protocol,ARP)

    ARP 实际上与 DNS 协议特别像,即 DNS 将域名解析成 IP 地址,而 ARP 将 IP 地址解析成 MAC 地址。不过 DNS 能解析网络上任意一个位置的主机的域名,而 ARP 只能解析同一个子网下的 IP 地址的 MAC 地址

    在一个主机上会有一个叫做 ARP 表 的数据解构,里面保存着子网内的 IP 地址到 MAC 地址的映射,其中的每一个项目的过期时间通常是 20 分钟。当主机需要向一个 IP 地址发送数据时,会现在自己的 ARP 表中搜索这个地址的 MAC 地址。如果表中不存在这个映射关系,那么就需要借助 ARP 协议了。主机回想子网内广播一个 ARP 分组(ARP Packet)。这个分组包含发送方和接收方的 IP 地址和 MAC 地址,ARP 的响应分组和请求分组具有相同的结构

    在请求分组中,发送方将分组发向 MAC 地址是 FF-FF-FF-FF-FF-FF 的接受主机,这个地址实际上是广播地址,因此所有的主机在收到这个分组后,都会选择接受它。接受后,主机会检测请求分组中请求解析的 IP 地址是不是自身,如果不是,主机会把这个请求分组丢弃;而如果是,那么主机会构造一个相同的响应分组,不过这个分组不会是一个广播帧,而是发向请求的主机。请求主机收到后也就知道了自己想要的结果

    MAC 地址只能在子网内部使用,如果主机需要把数据发向子网以外的主机,那么该如何构造分组呢?实际上,这个分组的 IP 地址是实际接受主机的地址(即子网外的地址),而 MAC 地址是网关路由器的 MAC 地址。因此这个分组会在子网内部被传递给网关,网关收到这个分组后,读取发送的 IP 地址,重新构造一个链路层分组,把其中的 MAC 地址修改成下一个接受这个分组的路由器的 MAC 地址

    以太网

    以太网的帧结构

    链路层帧结构
    • 前同步码 (8 字节):前同步码的存在是为了让接收方的适配器与发送方的适配器在时钟上进行同步,虽然以太网链路层具有一个确定的速率,但是发送适配器可能相对于这个速率有一定的偏移,因此接受适配器需要一定的时间去确定发送方的速率。前同步码的前 7 个字节都是 10101010 这样的循环,最后一个字节是 10101011,最后的 11 就告诉了接收方重要的数据要来了

    • 目的地址(6 字节):接受适配器的 MAC 地址。接受适配器收到了目的地址与自己的 MAC 地址相同的以太网帧、或者目的地址是广播地址的帧,就会把帧的数据部分传递给网络层,否则丢弃这个帧

    • 源地址(6 字节):即发送方的网络适配器地址

    • 类型字段(2 字节):这个字段指明了这个帧的网络层使用了什么协议,比如 0x8086 是 ARP 分组

    • 数据字段(46 ~ 1500 字节):数据字段承载了 IP 数据报,以太网的最大传输单元 MTU 是 1500 字节,对于超过 1500 字节的 IP 数据报,以太网必须把数据报拆开成两个以太网帧。以太网的最小传输单元是 46 字节,所以对于小于 46 字节的数据,以太网会把数据填充到 46 字节。被填充的数据传送到接收方后,接收方的适配器会把 46 字节的数据交付给网络层,网络层读取 IP 数据报首部中的数据长度字段,并去除填充数据

    • CRC:CRC 的目的是让适配器能够检测以太网帧在传输过程中是否发生了错误

    以太网提供无连接、不可靠的服务

    在以前,以太网的链路是总线拓扑结构或者基于集线器的星型拓扑结构,因此是一条广播链路(一个接口收到比特将从其所有接口进行转发,如果同时两个接口收到比特将发生碰撞,生成该帧的结点必须重新传输)。

    但是现在,多数以太网是基于交换机的星型拓扑结构,这意味着一条链路上只有首尾两个交换机,交换机不会向一个接口上发送超过一个帧,而且首尾交换机是全双工的,表示两个交换机可以能够同时向链路上发送以太网帧而不会发生碰撞,因此现在没有必要使用 MAC 协议了

    Web 页面请求的里程


    Bob 拿着他的笔记本电脑到了图书馆内,连上图书馆的以太网,打开浏览器访问 www.google.com 。在这一过程中,他的电脑究竟发出了哪些请求呢?

    DHCP

    DHCP 发生在电脑连上了网线与浏览器请求 Web 页面之间。刚插上网线的时候,电脑此时还没有一个 IP 地址,因此必须先获得一个地址,这是通过 DHCP 协议完成的:

    1. Bob 的电脑先要构造一个 DHCP 请求报文。这是一个 UDP 报文,目的端口是 67(DHCP 服务端口),源端口是 68(DHCP 客户端口);目的地址是 255.255.255.255(广播地址),源地址是 0.0.0.0(本机地址)。因为电脑此时还不知道 DHCP 服务端的地址,而且自己也没有地址

    2. DHCP 请求报文的 IP 数据报被放入以太网帧中。以太网帧的目的 MAC 地址是 FF:FF:FF:FF:FF:FF,使该帧将被广播到与交换机连接的所有设备(如果顺利也包括DHCP服务器),源 MAC 地址是 Bob 电脑的 MAC 地址(假设是 00:16:D3:23:68:8A)

    3. 这个包含DHCP请求的广播以太网帧是第一个由Bob设备发送到以太网交换机的帧,以太网帧被发送到交换机的一个接口上,交换机把这个帧广播到它所有的输出接口上,包括连接到路由器的端口;

    4. 运行着 DHCP (应用层,使用UDP协议)服务的路由器在它的一个接口拥有MAC地址 00:22:6B:45:1F:1B 收到了这个以太网帧,分解出 UDP 报文后向上传递到 67 端口的进程上

    5. 我们假设 DHCP 服务能够以 CIDR 块 68.85.2.0/24 分配 IP 地址,因此它分配了地址 68.86.2.101 给 Bob 的电脑。DHCP 服务生成一个 DHCP ACK 报文,报文中包含 68.86.2.101 地址、DNS 服务器的 IP 地址(68.87.71.226)、默认网关路由器的 IP 地址(65.85.2.1)、子网块(68.85.2.0/24),这个报文被放入一个 UDP 报文,UDP报文段被放入一个IP数据报中,IP数据报再被放入一个以太网帧中。以太网帧的源 MAC 地址是路由器接收到请求的接口的地址(00:22:6B:45:1F:1B),目的 MAC 地址是 Bob 的电脑的 MAC 地址(00:16:D3:23:68:8A)

    6. 以太网帧被路由器发送到交换机上。交换机是自学习的,它知道 Bob 的 DHCP 请求报文是从自己的哪个接口收到的,因此会把这个以太网帧也发送到这个接口上

    7. Bob 接收到了 DHCP ACK 的以太网帧,从中抽取IP数据报,在从IP数据报中抽取UDP报文段,再从UDP报文段中抽取DCHP ACK报文,取出了分配的 IP 地址、DNS 服务器地址、默认网关地址、子网块等信息。Bob 的笔记本把所有目的地址是 68.85.2.0/24 之外的报文都发送给默认网关。到了这里,Bob 的电脑就算已经连上互联网了

    DNS 与 ARP

    这时 Bob 的电脑已经能连上网了,当他键入 www.google.com 时,并不知道这个域名对应的 IP 地址是什么,因此需要借助于 DNS 协议。但是在发送 DNS 请求之前,还需要解决一个问题:Bob 的电脑这时并不知道默认网关的 MAC 地址。在发送 DNS 请求之前,必须先发送 ARP 请求获得网关的 MAC 地址

    1. Bob 的电脑生成一个目的地址是 65.85.2.1 的 ARP 查询报文,目的 MAC 地址是 FF:FF:FF:FF:FF:FF 。这个以太网帧被发送给交换机后,交换机把这个帧发送给所有的设备,包括网关路由器

    2. 默认网关在收到 ARP 查询报文后,发现报文中的目的地址与自己的地址匹配,因此网关准备一个 ARP 回答,在其中包含了自己的 MAC 地址(00:22:6B:45:1F:1B),装入以太网帧中,目的地址是 00:16:D3:23:68:8A,交付给交换机,再由交换机交付给Bob

    3. 路由器接受到 ARP 回答报文后,交付给 Bob 的电脑,Bob 的电脑从中得知了网关的 MAC 地址

    4. Bob 的电脑此时终于能构造 DNS 报文查询域名的 IP 地址了。它构造的 DNS 报文的目的 IP 地址是 68.87.71.226,目的 MAC 地址是 00:22:6B:45:1F:1B(网关),交换机收到这个帧后把它发送给网关路由器

    开始 DNS 查询

    1. DNS 查询报文发送给了网关,网关根据 IP 数据包的目的地址,就这个报文重新封装,发送给了 DNS 服务器
    2. DNS 服务器收到了查询报文,在自己的 DNS 数据库中找到与 www.google.com 匹配的记录,将这条记录变成 DNS 回答报文,使用 UDP 协议发送给 Bob 的电脑
    3. Bob 的电脑收到了 DNS 回答报文后,终于知道了 www.google.com 的 IP 地址,可以开始发送 HTTP 请求了
    image.png image.png

    相关文章

      网友评论

          本文标题:chapter5-链路层

          本文链接:https://www.haomeiwen.com/subject/odfwkctx.html