计算机网络学习--数据链路层
第一章 概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层
第三章 数据链路层
数据链路层使用的信道主要有以下两种类型:
- 点对点信道。这种信道使用一对一的点对点通信方式。
- 广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发
3.1、点对点信道的数据链路层
3.1.1、数据链路和帧
- 链路(link)是一条无源的点到点的物理线路段,中间没有任何其他的交换结点。
- 一条链路只是一条通路的一个组成部分。
- 数据链路(data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
数据链路层传送的是帧
3.1.2、三个基本问题
- 封装成帧 封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。确定帧的界限
- 透明传输
字节填充
在数据中可能存在帧开始字符或帧结束字符,这时为了透明传输就需要转义,类似于编程语言中的如
n
- 差错检测
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate)
在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术 模2除即为非进位除法或异或
帧检验序列 FCS
- 在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。
- n循环冗余检验 CRC 和帧检验序列 FCS并不等同。
- CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
- FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。
校验:
- 若得出的余数 R = 0,则判定这个帧没有差错,就接受(accept)。
- 若余数 R ¹ 0,则判定这个帧有差错,就丢弃。
3.2、点对点协议 PPP
3.2.1、PPP 协议的特点
用户使用拨号电话线接入因特网时,一般都是使用 PPP 协议。
3.2.2、PPP 协议组成
- 一个将 IP 数据报封装到串行链路的方法。
- 链路控制协议 LCP (Link Control Protocol)。
- 网络控制协议 NCP (Network Control Protocol)。
3.2.3、PPP帧格式
- 标志字段 F = 0x7E (符号“0x”表示后面的字符是用十六进制表示。十六进制的 7E 的二进制表示是 01111110)。
- 地址字段 A 只置为 0xFF。地址字段实际上并不起作用。
- 控制字段 C 通常置为 0x03。
- PPP 是面向字节的,所有的 PPP 帧的长度都是整数字节。
- PPP 有一个 2 个字节的协议字段。
- 当协议字段为 0x0021 时,PPP 帧的信息字段就是IP 数据报。
- 若为 0xC021, 则信息字段是 PPP 链路控制数据。
- 若为 0x8021,则表示这是网络控制数据。
透明传输
- 当 PPP 用在异步传输时,就使用一种特殊的字符填充法。
- 将信息字段中出现的每一个 0x7E 字节转变成为 2 字节序列(0x7D, 0x5E)。
- 若信息字段中出现一个 0x7D 的字节, 则将其转变成为 2 字节序列(0x7D, 0x5D)。
- 若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符),则在该字符前面要加入一个 0x7D 字节,同时将该字符的编码加以改变。
- 零比特填充
- 在发送端,只要发现有 5 个连续 1,则立即填入一个 0。
- 接收端对帧中的比特流进行扫描。每当发现 5 个连续1时,就把这 5 个连续 1 后的一个 0 删除
2.3.4、PPP协议工作状态
3.3、使用广播信道的数据链路层
3.3.1、局域网的数据链路层
媒体共享技术
- 静态划分信道
- 频分复用
- 时分复用
- 波分复用
- 码分复用
- 动态媒体接入控制(多点接入)
- 随机接入(常用)
- 受控接入 ,如多点线路探询(polling),或轮询。
为了使数据链路层能更好地适应多种局域网标准,802 委员会就将局域网的数据链路层拆成两个子层:
- 逻辑链路控制 LLC (Logical Link Control)子层(一般不存在)
- 媒体接入控制 MAC (Medium Access Control)子层。
3.3.2、CSMA/CD协议
载波监听多点接入/碰撞检测
- “多点接入”表示许多计算机以多点接入的方式连接在一根总线上。
- “载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。
- “碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小
- 当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞
- 碰撞的结果是两个帧都变得无用
使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信)
争用期
最先发送数据帧的站,在发送数据帧后至多经过时间 2t (两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。 以太网的端到端往返时延 2t 称为争用期,或碰撞窗口
二进制指数类型退避算法
- 发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。
- 确定基本退避时间,一般是取为争用期 2t。
- 定义重传次数 k ,k £ 10,即 k = Min[重传次数, 10]
- 从整数集合[0,1,…, (2k -1)]中随机地取出一个数,记为 r。重传所需的时延就是 r 倍的基本退避时间。
- 当重传达 16 次仍不能成功时即丢弃该帧,并向高层报告。
以太网在发送数据时,若前 64 字节没有发生冲突,则后续的数据就不会发生冲突
以太网规定了最短有效帧长为 64 字节,凡长度小于 64 字节的帧都是由于冲突而异常中止的无效帧
强化碰撞
- 当发送数据的站一旦发现发生了碰撞时:
- 立即停止发送数据;
- 再继续发送若干比特的人为干扰信号(jamming signal),以便让所有用户都知道现在已经发生了碰撞
3.4、使用广播信道的以太网
3.4.1、使用集线器的星形拓扑
这种以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫做集线器(hub)
使用集线器的以太网在逻辑上仍是一个总线网,各工作站使用的还是 CSMA/CD 协议,并共享逻辑上的总线
集线器很像一个多接口的转发器,工作在物理层(没有处理能力,收到什么发什么)
集线器示意图
3.4.2、以太网的信道利用率
帧长为 L (bit),数据发送速率为 C (b/s),因而帧的发送时间为 L/C = T0 (s)。
- 当数据率一定时,以太网的连线的长度受到限制,否则 t 的数值会太大。
- 以太网的帧长不能太短,否则
的值会太小,使 a 值太大
3.4.3 、以太网的 MAC 层
- 在局域网中,硬件地址又称为物理地址,或 MAC 地址。
- MAC地址共48位,前24为IEEE注册管理机构分配给厂家,后24厂家自行安排
- 最常用的 MAC 帧是以太网 V2 的格式。
适配器检查MAC地址
收到帧之后进行检测,如果是发往本站就接受,否则就丢弃。
发往本站的帧:
- 单播(unicast)帧(一对一)
- 广播(broadcast)帧(一对全体)
- 多播(multicast)帧(一对多)
MAC帧格式
3.5 在数据链路层扩展局域网
在数据链路层扩展局域网是使用网桥
网桥只适合于用户数不太多(不超过几百个)和通信量不太大的局域网,否则有时还会因传播过多的广播信息而产生网络拥塞。这就是所谓的广播风暴
集线器和网桥的不同
- 集线器在转发帧时,不对传输媒体进行检测。
- 网桥在转发帧之前必须执行 CSMA/CD 算法。
- 若在发送过程中出现碰撞,就必须停止发送和进行退避。
3.6、以太网交换机
交换式集线器常称为以太网交换机(switch)或第二层交换机(表明此交换机工作在数据链路层)
3.7、虚拟局域网(VLAN)
虚拟局域网协议允许在以太网的帧格式中插入一个 4 字节的标识符,称为 VLAN 标记(tag)
帧格式:
- JavaWeb项目之电话本,两个版本,以及总结反思
- 工作中问题记录
- Java导出数据生成Excel表格
- Layui常见问题
- layui动态设置下拉框数据,根据后台数据设置选中
- BCryptPasswordEncoder加密及判断密码是否相同
- 两个HTML,CSS布局实例
- cors解决Web跨域访问问题
- Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口
- IIS中实现HTTPS的自动跳转
- Windows Server下IIS安装PHP+MySql环境
- Python玩机器学习简易教程
- 腾讯云服务器搭建个人博客教程
- Ubuntu下安装Nginx+PHP+MySql环境
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- K8S 生态周报| Helm v2 进入维护期倒计时
- Halcon实例转OpenCV:计算回形针方向
- OpenCV检测轮廓极点(Python C++)
- 「Python 正则」使用专题总结
- 如何真正理解好一个「设计模式」?
- 10 行实现最短路算法
- 深度学习Pytorch检测实战 - Notes - 第6章 单阶经典检测器:YOLO
- 从图片裁剪来聊聊前端二进制
- 【投稿】刀哥:Rust学习笔记 2
- 【每周一库】- JWT的Rust实现
- 【Rust日报】2020-08-15 Rust Nightly 标准库文档已涵盖了每个关键字
- 【Rust日报】2020-08-16 Cranelift现在可以编译rustc,比LLVM的编译速度快7倍!
- 【Rust日报】2020-08-17 浏览器之外的 WebAssembly
- 前沿技术探讨:Rust语言真的安全吗?
- Java、Go和Rust间的比较