chapter5-链路层

2019-07-15  本文已影响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 的广播信道,多路访问协议最好有下面的特性:

信道划分协议

信道划分协议有 3 种:

  1. 时分多路复用(TDM)
  2. 频分多路复用(FDM)
  3. 码分多址(CDMA)

随机接入协议

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

时隙 ALOHA

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

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

相比较于 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 地址

以太网

以太网的帧结构

链路层帧结构

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

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

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

猜你喜欢

热点阅读