| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机网络第三章 数据链路层重点复习(点对点) -> 正文阅读 |
|
[网络协议]计算机网络第三章 数据链路层重点复习(点对点) |
目录 前言
系列文章目录第三章 数据链路层(点对点) 数据链路层属于计算机网络的网络边缘。 数据链路层使用的信道主要有以下两种类型:
3.1 使用点对点通信的数据链路层链路(link):从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换结点,又称为物理链路。链路只是一条路径的组成部分。 数据链路(data link):把实现这些协议的硬件和软件加到链路上,就构成了数据链路,又称为逻辑链路。 现在最常用的方法是使用网络适配器(既有硬件,也包括软件)来实现这些协议。 一般的适配器都包括了数据链路层和物理层这两层的功能。 在数据链路层,规程和协议是同义语。 点对点信道的数据链路层的协议数据单元是帧。 数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。 3.1.1 点对点通信的主要步骤点对点信道的数据链路层在进行通信时的主要步骤如下: 图3.1.1 使用点对点信道的数据链路层
数据链路层不必考虑物理层如何实现比特传输的细节。 3.1.2 三个基本问题数据链路层协议有许多种,但有三个基本问题则是共同的。 (1)封装成帧 封装成帧(framing:):在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。 一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。 此外,首部和尾部还包括许多必要的控制信息。在发送帧时,是从帧首部开始发送的。各种数据链路层协议都对帧首部和帧尾部的格式有明确的规定。每一种链路层协议都规定了所能传送的帧的数据部分长度上限——最大传送单元MTU(Maximum Transfer Unit)。图3.1.2给出了帧的首部和尾部的位置,以及帧的数据部分与MTU的关系。 MTU是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度。 3.1.2 用帧首部和帧尾部封装成帧 控制字符SOH(Start Of Header)放在一帧的最前面,表示帧的首部开始。十六进制编码为01.(二进制是00000001) 控制字符EOT?(End OfTransmission)表示帧的结束。十六进制编码为04(二进制是00000100)。 当数据在传输中出现差错时,由于使用了帧定界符,接收端就知道前面收到的数据是个不完整的帧(只有首部开始符SOH而没有传输结束符EOT),必须丢弃。而后面收到的数据有明确的帧定界符(SOH和 EOT),因此这是一个完整的帧,应当收下。 (2)透明传输 透明传输:当帧的数据部分出现像SOH或EOT这样的帧定界控制字符时(当数据部分是非 ASCII 码的文本文件时,如二进制代码的计算机程序或图像等),能不将其看作控制字符,保证数据链路层收下的是完整的数据。 为了解决透明传输问题,具体的方法是,字节填充(byte stuffing)或字符填充(character stuffing):发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B,二进制是00011011)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。 如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。 (3)差错检测 比特差错:比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。比特差错是传输差错中的一种。 在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。例如,误码率为10-10时,表示平均每传送1010个比特就会出现一个比特的差错。误码率与信噪比有很大的关系。如果设法提高信噪比,就可以使误码率减小。 实际的通信链路并非是理想的,它不可能使误码率下降到零。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的检错技术。 为了进行检错而添加的冗余码常称为帧检验序列FCS (Frame Check Sequence)。 循环冗余检验CRC 和帧检验序列FCS 并不是同一个概念。CRC是一种检错方法,而FCS是添加在数据后面的冗余码,在检错方法上可以选用CRC,但也可不选用CRC。 在接收端对收到的每一帧经过CRC检验后,有以下两种情况:
应当明确:“无比特差错”与“无传输差错”并不是同样的概念。在数据链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。 现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。因此,现在互联网就采取了区别对待的方法: 对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,运输层的TCP协议)来完成。 对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务。 3.2 点对点协议PPP在通信线路质量较差的年代,能实现可靠传输的高级数据链路控制HDLC?(High-level Data Link Control)就成为当时比较流行的数据链路层协议。但现在 HDLC已很少使用了。对于点对点的链路,简单得多的点对点协议PPP(Point-to-Point Protocol)则是目前使用得最广泛的数据链路层协议。 3.2.1 PPP协议的特点我们知道,互联网用户通常都要连接到某个ISP才能接入到互联网。PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议。 图3.2.1 用户到ISP的链路使用的PPP协议 IETF认为,在设计PPP协议时必须考虑以下多方面的需求[RFC 1547]: (1)简单。IETF在设计互联网体系结构时把其中最复杂的部分放在TCP 协议中,而网际协议IP则相对比较简单,它提供的是不可靠的数据报服务。在这种情况下,数据链路层没有必要提供比IP协议更多的功能。因此,对数据链路层的帧,不需要纠错,不需要序号,也不需要流量控制。IETF把“简单”作为首要的需求。 简单还可使协议在实现时不容易出错,从而使不同厂商在协议的不同实现上的互操作性提高了。协议标准化的一个主要目的就是提高协议的互操作性。 这种数据链路层的协议非常简单:接收方每收到一个帧,就进行CRC检验。如CRC检验正确,就收下这个帧;反之,就丢弃这个帧,其他什么也不做。 (2)封装成帧。PPP协议必须规定特殊的字符作为帧定界符(即标志一个帧的开始和结束的字符),以便使接收端从收到的比特流中能准确地找出帧的开始和结束位置。 (3)透明性。PPP协议必须保证数据传输的透明性。这就是上面说到的透明传输。 (4)多种网络层协议。PPP协议必须能够在在同一条物理链路上同时支持多种网络层协议(如P和IPX等〉的运行。 (5)多种类型链路。PPP还必须能够在多种类型的链路上运行。例如,串行、并行、同步、异步、低速、高速、电、光、交换(动态)、非交换(静态)的点对点链路。 这里特别要提到的是在1999年公布的在以太网上运行的PPP,即 PPP over Ethernet,简称为PPPoE?[RFC 2516],这是PPP协议能够适应多种类型链路的一个典型例子。 (6)差错检测(error detection)。PPP协议必须能够对接收端收到的帧进行检测,并立即丢弃有差错的帧。 (7)检测连接状态。PPP协议必须具有一种机制能够及时(不超过几分钟)自动检测出链路是否处于正常工作状态。 (8)最大传送单元。PPP协议必须对每一种类型的点对点链路设置最大传送单元MTU的标准默认值R。 (9)网络层地址协商。PPP协议必须提供一种机制使通信的两个网络层(例如,两个IP层)的实体能够通过协商知道或能够配置彼此的网络层地址。 (10)数据压缩协商。PPP协议必须提供一种方法来协商使用数据压缩算法。但 PPP协议并不要求将数据压缩算法进行标准化。 在TCP/IP 协议族中,可靠传输由运输层的TCP协议负责,因此数据链路层的 PPP协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。PPP协议不支持多点线路(即一个主站轮流和链路上的多个从站进行通信),而只支持点对点的链路通信。此外,PPP协议只支持全双工链路。 PPP协议有三个组成部分: (1)一个将ⅣP数据报封装到串行链路的方法。PPP既支持异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报在 PPP帧中就是其信息部分。这个信息部分的长度受最大传送单元MTU的限制。 (2)一个用来建立、配置和测试数据链路连接的链路控制协议LCP (Link ControlProtocol)。通信的双方可协商一些选项。在RFC 1661中定义了11种类型的LCP分组。 (3)一套网络控制协议NCP?(Network Control Protocol)R,其中的每一个协议支持不同的网络层协议,如IP、OSI的网络层、DECnet,以及AppleTalk等。 3.2.2?PPP协议的帧格式1. PPP协议的帧格式各字段的意义 PPP帧的首部和尾部分别为四个字段和两个字段。 首部的第一个字段和尾部的第二个字段都是标志字段F (Flag),规定为0x7E(符号“0x”表示它后面的字符是用十六进制表示的。十六进制的 7E的二进制表示是01111110)。标志字段表示一个帧的开始或结束。因此标志字段就是PPP帧的定界符。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃。 ? 3.2.2 PPP的帧格式 首部中的地址字段A规定为0xFF(即11111111),控制字段C规定为 0x03(即00000011)。最初曾考虑以后再对这两个字段的值进行其他定义,但至今也没有给出。可见这两个字段实际上并没有携带PPP帧的信息。 PPP首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。若为 0xCO21,则信息字段是 PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据。 信息字段的长度是可变的,不超过1500字节。 尾部中的第一个字段(2字节)是使用CRC的帧检验序列FCS。
当PPP使用异步传输时,它把转义符定义为0x7D,即 01111101,并使用字节填充,RFC 1662规定了如下所述的填充方法: (1)把信息字段中出现的每一个0xTE字节转变成为2字节序列(0x7D,0x5E)。 (2)若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D,0x5D)。 (3)若信息字段中出现ASCII码的控制字符(即数值小于Ox20的字符),则在该字符前面要加入一个0xTD字节,同时将该字符的编码加以改变。 3. 零比特填充 PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)。在这种情况下,PPP 协议采用零比特填充方法来实现透明传输。 零比特填充的具体做法是:在发送端,先扫描整个信息字段(通常用硬件实现)。只要发现有5个连续1,则立即填入一个0。因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现6个连续1。接收端在收到一个帧时,先找到标志字段F以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就把这5个连续1后的一个0删除,以还原成原来的信息比特流。这样就保证了透明传输:在所传送的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的错误判断。 3.2.3 零比特的填充与删除 3.2.3 PPP协议的工作状态PPP链路的起始和终止状态永远是“链路静止”(Link Dead)状态,这时在用户个人电脑和ISP的路由器之间并不存在物理层的连接。 当用户个人电脑通过调制解调器呼叫路由器时(通常是在屏幕上用鼠标点击一个连接按钮),路由器就能够检测到调制解调器发出的载波信号。在双方建立了物理层连接后,PPP就进入“链路建立”(Link Establish)状态,其目的是建立链路层的LCP连接。 这时LCP开始协商一些配置选项,即发送LCP的配置请求帧(Configure-Request)=)。这是个PPP帧,其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种: (1)配置确认帧(Configure-Ack)——所有选项都接受。 (2)配置否认帧(Configure-Nak)——所有选项都理解但不能接受。 (3)配置拒绝帧(Configure-Reject)——选项有的无法识别或不能接受,需要协商。 LCP配置选项包括链路上的最大帧长、所使用的鉴别协议(authentication protocol)的规约(如果有的话),以及不使用PPP帧中的地址和控制字段(因为这两个字段的值是固定的,没有任何信息量,可以在 PPP帧的首部中省略这两个字节)。 协商结束后双方就建立了LCP链路,接着就进入“鉴别”(Authenticate)状态。在这一状态,只允许传送LCP协议的分组、鉴别协议的分组以及监测链路质量的分组。若使用口令鉴别协议PAP?(Password Authentication Protocol),则需要发起通信的一方发送身份标识符和口令。系统可允许用户重试若干次。如果需要有更好的安全性,则可使用更加复杂的口令握手鉴别协议CHAP(Challenge-Handshake Authentication Protocol)。若鉴别身份失败,则转到“链路终止”(Link Terminate)状态。若鉴别成功,则进入“网络层协议”(Network-LayerProtocol)状态。 在“网络层协议”状态,PPP链路的两端的网络控制协议NCP。根据网络层的不同协议互相交换网络层特定的网络控制分组。这个步骤是很重要的,因为现在的路由器都能够同时支持多种网络层协议。总之,PPP协议两端的网络层可以运行不同的网络层协议,但仍然可使用同一个PPP协议进行通信。 当网络层配置完毕后,链路就进入可进行数据通信的“链路打开”(Link Open)状态。链路的两个 PPP端点可以彼此向对方发送分组。两个PPP端点还可发送回送请求LCP分组(Echo-Request)和回送回答LCP分组(Echo-Reply),以检查链路的状态。 数据传输结束后,可以由链路的一端发出终止请求LCP分组(Terminate-Request)请求终止链路连接,在收到对方发来的终止确认LCP分组(Terminate-Ack)后,转到“链路终止”状态。如果链路出现故障,也会从“链路打开”状态转到“链路终止”状态。当调制解调器的载波停止后,则回到“链路静止”状态。 PPP 协议不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容。 整个过程可以用下图解释: 图3.2.4 PPP协议的状态图 最后的话第三章 数据链路层的本章重点概念在下一篇“计算机网络第三章 数据链路层重点复习(广播)”中列出。 我整理笔记一直都是整理到Word文档后复制到这里来的——我没有找到实现文档导入的按钮,有没有人知道啊?复制过来有好多格式的问题要改啊。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 11:43:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |