MIT 6.829 -- L0 Background: Single-Link Communication

news2024/12/31 5:29:53

MIT 6.829 -- L0 Background: Single-Link Communication

  • 前言
  • Problem
  • Modulation(调制) & Demodulation(解调)
  • Framing
  • Error Detection
  • Error Recovery
    • ARQ
  • Shared Media Access
  • 总结


本课程为MIT 6.829 计网课程,课程对应官网链接: Computer Networks Lecture Notes

本节对应课程文档链接: Background: Single-Link Communication


前言

本节课,我们会考虑将两台计算机用相同的通讯介质连接起来并尝试在它们之间交换数据时,会出现的问题。我们会先从P2P连接开始介绍,在P2P连接中唯一出现的电脑就是线路两端的电脑。之后我们会介绍共享传输介质,例如以太网。这一篇的内容在传统的网络分层的中属于Layer 2,也就是链路层,但是,这篇笔记也会涉及Layer 1,也就是物理层。


Problem

我们先来看一个似乎很简单的场景:将两台计算机连在一起,并且使得它们彼此之间进行“交谈”。我们最终会发现这个场景并不是它看起来的那么简单。

接下来,我们会系统的将这个场景转换成五个问题,并一个一个的解决这些问题。

  1. 第一个问题:物理介质(例如电话线,线缆或者以太网)实际传输的是模拟信号,而不是比特位(也就是数字信号)。因此,我们需要有一种方法来在发送端将数字信号转换成模拟信号,这种行为通常被称为调制(modulation)。对应的,在接收端将模拟信号转换成数字信号的行为被称为解调(demodulation)。在网络的物理层完成的众多事情当中,调制解调是一个重要的步骤。

  2. 但是我们真正想做的事情是将一个大文件从一个计算机传递到另一个计算机。假设我们已经解决了调制解调的问题,也就是说我们知道如何在物理介质发送数字信号,我们还需要方法能够将文件拆分打包,并有效的发送出去。一种方式是将文件传输看成是bit流,并且持续不断的传输bit。另一种方法是将文件的内容拆分成更小的包,并且传输这些包。第二种方式就是分包(framing)问题。

  3. 物理上的定律使得在任何情况下都无法达到无噪音通讯。所以在很多场景下,我们都关心接收者是否完整精确的收到了发送者的数据。这意味着接收端需要机制来进行错误探测(error detection)。

  4. 在某些场景下,接收端可以探测出错误并且直接丢弃相应的数据块。然而,在很多场景下,仅仅是探测到错误是不够的,从错误中恢复也很重要。这就是错误修正或者错误恢复问题。

  5. 最后,很多物理介质,比如以太网,可以连接超过2台计算机。所以我们还需要考虑物理介质共享的问题。这是media access(注,MAC地址全称就是Media Access Control)或者channel access问题,它会决定在任何时刻,谁可以发送数据,以及当channel中发生竞争时,如何仲裁和解决。


Modulation(调制) & Demodulation(解调)

方案1-NRZ

  • 在最简单的调制方案中,bit “1”会被当做高电平发送,而bit “0”会被当做低电平发送。尽管名字“Non-Return to Zero”(NRZ)让人很不解,但是它就是这种方案的名字。NRZ的主要问题是,连续的相同bit(对应相同的电平),会使得接收端难以区分。举个例子,很难区分bit “0”和无信号(注,无信号的时候也是低电平);同样的,太多连续的bit “1”,会使得信号电平偏离真实的平均值。
  • 大多数的调制解调方案都有一个关键的需求,那就是可以很容易的实现clock recovery。因为发送端会将信息(也就是bit位)通过时钟周期的触发发送出来,clock recovery是指接收端能够推断(或者是恢复)发送端的时钟频率(这样就可以通过发送端的时钟频率判断是否有bit “0”,以及连续的bit “0”有几个)。直观上来看,如果有频繁的0-1和1-0的转变,clock recovery将会很容易。

在这里插入图片描述
方案2-NRZI

  • NRZI全称是Non-Return to Zero Inverted。这里发送端在发送bit “0”时,保持电平不变,发送bit “1”时会变化电平。当然,这里并没有解决连续bit “0”的问题,但是却解决了连续bit “1”的问题。

方案3-Manchester编码:

  • Manchester编码中,发送方在发送bit “0”时,会将电平从低变高;发送bit “1”时,会将电平从高变低。这样就确保了每个bit位都有一次电平的变化,从而使得clock recovery可以实现。虽然它解决了上面提到的NRZ问题,但是它在某种程度上效率比较低(因为首先速率需要收发双方协商,其次最高只能按照接收端的内部时钟频率的一半来传输,这样接收端才能识别出每个bit的电平变化)。

在这里插入图片描述
方案4-4B/5B

  • 这个方案通过在传输数据中加入额外的bit,来阻止过多的连续bit “0”和连续bit “1”,从而解决了Manchester编码低效率的问题。你可以认为它为数据增加了一些冗余,从而使得clock recovery容易实现。具体来说,它将每4个连续的数据bit转换成了5个bit,以确保不会出现大于等于3个连续的bit “0”(注,4B编码不是简单的在4个数据bit之后增加一个bit,而是将4个数据bit映射成一个最多只有2个连续bit “0”的5bit数,详见参考),之后再通过NRZI将其编码,避免使用了Manchester编码,又解决了NRZI的问题(这就是为什么上面还要单独一部分介绍NRZI编码)。

Framing

Framing协议的一些例子是PPP(the Point to Point Protocol)和HDLC(High-level Data Link Control)。这里的思路是,发送端通过一个起始标志(HDLC协议中是一个众所周知的8bit 01111110)来分隔发送端的数据bit流。两个起始标志之间的数据bit被称为一个帧(Frame)。链路层之后会通过上面介绍的某一种调制方式,将Frame发送给接收端。在接收端,链路层需要接收这些Frame,并将它们传输给发送端应用程序想要交互的接收端应用程序。

上面提到的分包方式中,有一个问题是起始标志有可能出现在实际传输的数据中。如果不做处理的话,这会使得接收端在分包时出错。这个问题的解决方法是bit stuffing,这种方法非常像转义序列(escape sequence)。在HDLC和PPP的场景下,发送端会在数据中每5个连续的bit “1”后面加一个额外的bit “0”。在接收端,现在会使用如下的解码策略:如果看到了5个连续的bit “1”,那么再检查之后的一个bit。如果这个bit是0,那么这是被填充的bit,接收端会去除这个bit “0”并继续处理。如果这个bit是1,那么这是一个下一个frame的起始标志。

HDLC和PPP使用的分包方式被称为面向bit的分包。这种方法引入的另一个问题是,经过填充bit的frame长度是不固定的,它的具体长度取决于实际的数据内容。


Error Detection

在数据传输中有很多方法可以用来探测错误,按照复杂程度排序的话有:奇偶校验,校验和,和CRC。错误探测的挑战在于做好探测的同时,引入尽可能少的额外负担。


Error Recovery

在有噪音或者易丢失数据的通道里面,有两种形式的错误恢复:

  1. ARQ(Automatic Repeat reQuest):ARQ通过接收端的某种确认来进行重传。TCP就是一种ARQ的实现。

  2. FEC(Forward Error Correction):基于编码学来将一些冗余的数据加到传输数据中,从而使得接收端可以修正某些特定的常见错误。本课程中并不会学习特定的FEC方法。


ARQ

最简单的错误恢复方法就是通过确认重传。发送端发送一个包(或者帧),之后等待来自接收端的确认,收到确认之后再发送下一个包。如果在一定的时间内没有收到确认,那么发送端就假设包数据破损了或者包在传输中被丢弃了,并重传包。这种简单的方法被称为stop-and-wait。

你可能会认为,对于stop-and-wait方法,并不需要在包头部添加任何信息,因为任何时间点,最多只可能有一个包在传输。但这是错误的,因为发送端并不能确认一个自己认为丢失了的包是不是真的丢失(或者数据破损)了。数据包可能只是因为某种原因被阻塞超过了约定的超时时间。所以,ARQ需要在包头部添加一个序列号来使得接收端能区分重复的包。

通常来说,发送端和接收端在一个易于出错的网络中不能达成真正的同步。这是著名的“Two generals problem”,它是指在一个山谷的两端,分别有两位将军想要通过骑马的士兵在山谷内传递消息,来商定一个相同的时间以进攻位于同一个山谷内的敌人。这里的消息是易于丢失的,因为不走运的士兵会被山谷内的敌人消灭或者扣押。可以通过反证法来证明为什么不能达成真正的同步。假设存在一种协议通过最少次数通信可以达成真正的同步,那么这个协议中的最后一条消息其实是多余的,因为它是可能丢失的。如果这条消息是多余的,那么这与我们所做的最少次数通信的假设是矛盾的,因此假设不成立。

stop-and-wait的主要缺点是:它只允许在一个RTT(Round Trip Time)内发送一个包,这使得最大的传输速率是包长度除以RTT。也就是说,它并不能填满发送端和接收端之间的通信通道。

那么发送端和接收端之间的通道最多能有多少数据呢?假设我们知道通道的带宽是B,RTT是d,对应的数据量是P。当通道被填满时,B会被完全利用;并且,当通道内的未被确认的字节数是P时,没有数据丢失,所以接收端可以观察到的吞吐是P/d。因此,如果带宽和RTT不变的话,通道的容量是P=Bd。这个数字通常会被称为发送端和接收端之间的网络带宽时延积(Bandwidth-delay product)。理想情况下,发送端会确保有Bd的数据存在于通道中,而不是等待每个packet的确认再发送下一个包(除非B*d < S,S是一个包的大小,也就是通道里面容纳不下一个包)。

这里可以通过一个基于窗口的协议来完成。直观上来看,理想的窗口大小是B*d,因为这时可以达到最大的链路利用率。实际实现中,我们不能先发送一个窗口大小的包,等待确认,再发送下一个窗口的包,我们需要使用滑动窗口协议。

滑动窗口协议的工作方式是:接收端确认它收到的每个包,当发送端收到确认之后,将其窗口向右滑动一个packet。之后,发送端再发送一个新的包以确保正在发送的且未被确认的包的大小总和等于窗口的大小。在大多数实际的协议中,这个窗口是受限的,会通过流控(flow control)来确保接收端的缓存不会被发送端发送过多的数据而撑满。

尽管我这里是在链路层介绍的ARQ,但是使用滑动窗口和确认重传也可以应用在其他地方。之后在这门课程,我们会看到TCP使用了相同的思路。


Shared Media Access

通常情况下,我们可以在同一个物理介质(链路)中挂载多个节点,典型的例子就是流行的以太网技术。像以太网这样的技术被称为共享的介质,并且它带出了另一个重要的问题:Media Access。这是指在共享的通道中,多个终端之间的竞争抢占的问题。解决这个问题的协议被称为MAC(Media Access Control)协议。

通常来说,MAC协议分为好几类。中心化的协议依赖网络上中心化的控制器来决定,在任何时候谁才能拥有共享通道上的权限。分布式的协议并没有一个专门的节点来完成这个任务,而是依赖一些去中心化的机制以确定共享通道的访问权限。以太网中使用的协议,就一个非常有趣的分布式协议的例子,它被称为CSMA/CD(Carrier Sense Multiple Access/Collision Detect),它非常的成功。

它的具体实现是,当一个终端想要传输数据时,它会首先通过探测线路上的电压,来判断当前通道是否正在被使用。如果电压高于基线,那么说明通道正在被使用。如果电压小于等于基线,那么它会继续发送网络包。之后它会等待一个特定的时间(在10M以太网中这个值是51.2us),然后再发送另一个包。这里的等待使得其他终端在等待间隔的时间内可以有机会发送包。

如果终端探测到了当前通道正在被使用,它会等待通道空闲再传输网络包。当然,两个终端可能会在同一个时间传输数据,这就会引起冲突(collision)。以太网终端支持冲突探测(collision detection,CSMA/CD中的CD部分)。每当一个终端探测到了冲突,它会假设发生冲突的包已经破损且无法恢复。它会等一段时间再重试。这里等待的时间被称为回退(backoff)时间。有很多种方式可以用来选择回退时间,以太网使用的是指数级回退的方法。这里的思路是,每次探测到了冲突,回退时间的上限都会加倍,回退时间会从0和上限之间随机选择。随机可以帮助避免终端之间的同步(以相同的节奏回退,会导致始终冲突),而指数级回退提高了系统的稳定性,因为它减少了冲突的可能性。

实际上,如果终端数量是无限的,指数级回退也不能带来稳定性。幸运的是,我们不用在实际中处理无限终端。

使用回退机制的背后思想是,每一个终端都尝试预估通道当前有多拥挤,如果竞争越激烈,那么终端的回退时间就越长。(因为协议的分布式特性,没有一个终端能够知道在任何时间到底有多少个其他活跃的终端)。终端并不会无限尝试,它们会在固定的尝试之后放弃(通常是16次)。发送端的逻辑(也是协议的大部分实现逻辑)被总结在了图1。

在这里插入图片描述

图1:总结了以太网的MAC协议。函数CalcBackoff会从0和当前的回退间隔中随机一个数。每次失败的传输,都会使得回退间隔加倍。

有关以太网协议的理论和实际性能是过去很多年的研究主题。当包的大小足够小,终端足够多的时候(也就是最差情况下),不难算出线路的利用率只有1/e(37%)。然而,在大多数实际的情况下,以太网工作的非常好,通常能达到高达90%的利用率。一些在以太网上简单的获取高利用率的方法有:

  • 去除长的线路(以太网线路可以长达1.5km,但是实际中没有必要拉这么长的线)
  • 承接更少的终端
  • 使用大于最低64字节的包大小

总结

从上面的内容我们可以看到,对于一个你可以想到的最小尺寸的网络,我们仍然有很多棘手的问题。下一章,也是课程的第一节课,我们会考虑packet switching的问题,以及多条同种类型的链路是如何连接起来以形成一些更大的网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统——虚拟内存管理

文章目录 一、虚拟内存中的几种地址1、逻辑地址2、线性地址3、逻辑地址转线性地址4、线性地址转物理地址 二、进程与内存1、内核空间和用户空间2、内存映射3、进程内存分配与回收 早期程序直接运行在物理内存上&#xff0c;直接操作物理内存&#xff0c;这种方式存在几个问题&a…

【Python】selenium项目实战:从12306网站获取特定时间段二等座有票的车次

文章目录 一、项目背景二、页面查找1、查询条件2、定位有二等座的元素3、定位有二等座的车次信息4、CtrlF检验xpath查找的车次 三、代码实现 一、项目背景 工具&#xff1a; pythonpycharmselenium 12306网址&#xff1a; https://kyfw.12306.cn/otn/leftTicket/init?linktyp…

【GESP】2023年06月图形化四级 -- 密码合规检测

密码合规检测 【题目描述】 网站注册需要有用户名和密码,默认小猫角色和白色背景,编写程序以检查用户输入密码的有效性。 (1)合法的密码只能由a-z之间26个字母(字母不区分大小写)、0-9之间10个数字以及!@#$四个特殊字母构成。 (2)密码最短长度:6个字符,密码最大长…

通用技术 自动化测试与持续集成方案

目录 前言&#xff1a; 传统接口测试 接口测试自动化 接口自动化的持续集成 前言&#xff1a; 在现代软件开发中&#xff0c;自动化测试和持续集成是两个不可或缺的环节。自动化测试可以提高测试效率、减少人工错误&#xff0c;并确保软件的质量。持续集成则可以帮助开发团…

18.JavaWeb-JWT(登录、鉴权)

1.CSRF跨站请求伪造 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;通常缩写为 CSRF 或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的…

SOCKET编程基本原理

测试模拟环境 python 3.8—对应Pycharm 专业版 for linux 本文采用的环境是vmware + ubantu_64 先简单配置一下netstat工具 sudo apt-get install net-tools netstate基本用法 sudo netstat -at | grep 1234 // |管道函数 grep匹配正则表达式移除端口用Kill就可以了 SOCK…

Calendar类中的字段常量有哪些?

一、Calendar类介绍 Calender类是Java中用于处理日期和时间的类之一。它提供了一组方法&#xff0c;可以对日期和时间进行各种操作&#xff0c;如获取当前日期和时间、计算日期间的差值、设置特定日期和时间等。 Calendar类是一个抽象类&#xff0c;不能直接实例化&#xff0…

MySQL基础管理

目录 ​编辑 一、数据库管理 1.1语言分类 1.2、DDL 二、MySQL相关文件 三、MySQL相关命令 3.2.1创建表的流程 1.创建新的数据库 2.查看创建的数据库 3.进入text库中&#xff0c;创建表 4.查看text下的所有表 5.查看表的属性 6.向表中添加数据 7.查看表中的数据 1.3查看…

TinyKv调用流程梳理二

addNode生成peer func (c *client) heartbeatStreamLoop() {defer c.wg.Done()for {select {case <-c.ctx.Done():returndefault:}ctx, cancel : context.WithCancel(c.ctx)c.connMu.RLock()stream, err : c.leaderClient().RegionHeartbeat(ctx)c.connMu.RUnlock()if err !…

golang waitgroup

案例 WaitGroup 可以解决一个 goroutine 等待多个 goroutine 同时结束的场景&#xff0c;这个比较常见的场景就是例如 后端 worker 启动了多个消费者干活&#xff0c;还有爬虫并发爬取数据&#xff0c;多线程下载等等。 我们这里模拟一个 worker 的例子 package mainimport (…

Redis实现skipList(跳表) 代码有详解

Redis实现skipList(跳表) 项目介绍 非关系型数据库redis&#xff0c;以及levedb&#xff0c;rockdb其核心存储引擎的数据结构就是跳表。 本项目就是基于跳表实现的轻量级键值型存储引擎&#xff0c;使用C实现。插入数据、删除数据、查询数据、数据展示、数据落盘、文件加载数…

Java-API简析_java.lang.Runtime类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131714695 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

【GESP】2023年06月图形化四级 -- 按身高排序

按身高排序 【题目描述】 默认小猫角色和白色背景。有两个列表,第一个列表“names”存储名字,第二个列表“heights”存储这组名字对应的身高,这些身高由互不相同的正整数组成。 请按身高由大到小排序,同时能够得到对应名字的列表“names”。 例如: 名字列表:names = …

变压器试验交流耐压

试验目的 交流耐压试验是鉴定电力设备绝缘强度最有效和最直接的方法。 电力设备在运行中&#xff0c; 绝缘长期受着电场、 温度和机械振动的作用会逐渐发生劣化&#xff0c; 其中包括整体劣化和部分劣化&#xff0c;形成缺陷&#xff0c; 例如由于局部地方电场比较集中或者局部…

unity 调用C++ dll 操作升级套娃函数调用

之前一直以为C生成dll&#xff0c;在unity中调用时要把传出去的值设置在主函数中&#xff0c;以参数或反回值的形式。 当然在DLL工程中可以说没有主函数&#xff0c;那个可以运行一个函数&#xff0c;其会调用其他函数从而一直调其他相关函数。 那问题是在层级是二或三------…

Android CoroutineScope Dispatchers.Main主线程delay,kotlin

Android CoroutineScope Dispatchers.Main主线程delay&#xff0c;kotlin import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.View import android.view.View.OnClickListener import android.widget.Bu…

【sgWaterfall】Vue实现图文瀑布流布局模式,图片预加载显示占位区域阴影,加载完成后向上浮动动画出现,支持不同浏览器尺寸宽度下自适应显示列数

特性&#xff1a; 自动计算每个图片最佳坐标位置&#xff0c;以达到最新加在图片占据位置尽量让整体更加协调图片预加载显示占位区域阴影加载完成后向上浮动动画出现支持不同浏览器尺寸宽度下自适应显示列数 Vue实现图文瀑布流布局模式&#xff0c;图片预加载显示占位区域阴影&…

SQL语法与数据库快速入门(2)

目录&#xff1a; 多表简介SQL 约束-外键约束多表关系简介多表查询多表查询-内连接查询多表查询-外连接查询子查询简介子查询实战数据库进阶redis 内存数据库mongodb nosql 数据库neo4j 图数据库 1.多表简介 多表及使用场景介绍&#xff1a; 多表顾名思义就是在数据库设计中…

【NacosSync】注册中心同步组件使用教程ZooKeeper迁移到Nacos

目录 介绍系统模块架构获取安装包数据库配置启动服务器控制台添加注册中心集群信息添加同步任务注意事项 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范,支持多种数据源存储,默认使用Hibernate…

【论文阅读】《Distilling the Knowledge in a Neural Network》

【论文阅读】《Distilling the Knowledge in a Neural Network》 推荐指数&#xff1a; 1. 动机 &#xff08;1&#xff09;虽然一个ensemble的模型可以提升模型的效果&#xff0c;但是在效率方面实在难以接受&#xff0c;尤其是在每个模型都是一个大型的网络模型的时候。 &…