计网学习笔记二 Link Layer Service
在上一周的计网学习了network和Internet的总论。在这一周开始的未来几讲将集中在链路层
link layer,并且会有相应的计网lab完成。在这一讲中,我们主要关注链路层提供的服务。课程资料地址:https://cs.nju.edu.cn/lwz/networks/CH2-Direct Link Networks-1.pdf
链路层简介
来学习链路层之前,我们先来学一些术语:
layer-2:即data link layer,一种简化的称呼。node:节点,包括hosts和routers。links:链路,连接相邻节点的通信信道(communication channel)。link的种类有point-to-point,multiple access和wireless link(WIFI)。frame:链路层帧,layer-2的数据包称呼,为datagram的封装(datagram即网络层数据报)。
网络层负责的是任意两台主机之间的通信服务,链路层则是负责端到端的通信服务。
链路层实现位置
链路层由harware,software和firmware联合实现,具体设备在host和router(switch)里面。链路层的实现主体部分是在network adaptor中(网络适配器,有时称为网络接口卡,即网卡),network adaptor的例子有NIC、Ethernet Card、 802.11 Card等。
首先我们来看实现链路层硬件部分的网络适配器。位于网络适配器核心的是链路层控制器(一个芯片,实现了framing,link access, error detection等服务)。
在发送端,控制器取得了上层网络层发下来的数据报后,根据协议对其封装,设置差错检测比特,并将帧传进链路。
在接收端,控制器接收整个帧,对其进行差错检测,抽取出网络层数据报(向上传是软件负责)。

上图即链路层的实现位置:网络适配器硬件和运行在CPU上的软件。
链路层的软件组件实现了高速链路层功能,如组装链路层的寻址信息和负责激活控制器硬件。链路层软件在接收端负责的工作有响应控制器中断,处理差错条件以及将adaptor抽出的数据报向网络层传递。
所以,链路层可是协议栈中硬件与软件交接的地方!
链路层提供的服务
概括
| 服务 | 功能 | 备注 | 
|---|---|---|
| framing | 将网络层数据报封装成链路层帧,由链路层协议决定帧的格式结构 | 不同种通信(有线和无线)加的头部信息都不一样 | 
| link access | 通过MAC协议来规定帧在链路上的传输规则,尤其协调多节点的传输 | 协调多址接入的媒介(coordinate);使用MAC来确定局部地址;Half-duplex and full-duplex 即半双工和全双工,收发同时进行 | 
| reliable delivery | 保证无差错经链路层移动每个网络层数据报 | 易于产生高差错率的链路会实现服务,如无线传输,反之光纤这样的可靠传输就很少实现这个服务;还有流控机制 | 
| error detection && correction | 差错检测服务给帧提供差错检测字段,让接收方可以检测帧中的比特差错;差错纠正则可以准确定位差错位置并进行纠正。 | 用来处理因噪声和信号衰减所造成的错误;发送信号用以重传或者把帧丢弃;这个服务实现不是必须的,但因为容易实现所以大多数都实现了 | 
Framing 成帧
framing比较好理解,就是发送端将网络层传下来的数据报进行封装,加上一些信息例如像差错检测比特,流控(flow control)字段等;接收端就接收完整个帧后,根据封装信息进行差错检测,流控设置等操作,再抽出数据报传到网络层。

Link access 链路接入
链路接入有两种方式:point-to-point点对点链路接入 和 broadcast广播链路接入。
点到点链路接入是一种专用接入(只有单个发送方和单个接收方),它广泛用于长距离缆线连接,以及大部分的以太网技术。
而广播链路接入能够让多个发送方和接收方共享相同的单一的广播信道,如传统的以太网和WLAN。这种接入方式会产生一个多路访问问题(Multiple access problem):
因为所有的节点都能传输帧,所以多个节点同时传输帧时,信道上的所有节点同时收到多个帧。此时就会在接收处发生帧的碰撞(即collisions)。这就导致碰撞的帧都丢失了,而且在碰撞时间间隔内信道也被浪费了。
这就需要协调多个节点对一个共享广播信道的访问。解决这个问题我们提出了MAC协议。它可以划分为三种类型:
Channel partitioning:信道划分协议。物理媒介角度上切片,均匀频率。Taking turns:轮流协议。时间角度上切,频率不均匀。Random access:随机接入协议。前面两种可能造成信道的浪费,这类协议允许冲突存在,并为冲突提供解决机制。
我们在这讲先不详细介绍,不然很难一下子消化。留到后面MAC的时候再写写。
Reliable delivery 可靠交付
对于这个服务的实现我们采用流控机制(flow control)。它可以确保我们的接收方不会被发送的帧给淹没,即预防接收方的buffer产生溢出。实现这个机制我们主要有两种协议:
1.Stop and Wait
这可以说是最早的链路层协议。它的实现很简单,对大的数据包传输的效率很不错(因为返回ACK信息的耗时和传输数据包的耗时相比不值一提),但ACK(“确定收到”信息)返回耗时对小包来说是耗不起的。它的过程就是你来我往一下一下,如下:

2.Sliding Window
我们直译是滑动窗口。相比于stop&wait协议的一次一包,滑动窗口协议每次传输都是一次发一批。
在这个协议中,有几个要点:
- 帧上有一个k位的字段,k的范围是0-8,用来做帧的序号2^k(0-255);
 - 接收方有一个buffer,即
window,它的大小为win个帧,win <= 2^k; - 发送端可以在没收到ACK的时候最多发送win个帧。
 - ACK后面的数字表示:发送端你可以发n号帧了;
 
我们来看看滑动窗口是怎么操作的:


然后滑动窗口对数据丢失的处理又细分为两种协议:
GO-BACK-N:回退N协议。绝大多数硬件采用了这种实现(因为它的算法非常符合硬件,移位操作)Selective Reject:选择重传协议。少用,接收方需保有较大的足够的buffer。
我们可以来看这两篇文章:
[What is a Sliding Window Protocol in Computer Network ](https://www.tutorialspoint.com/what-is-a-sliding-window-protocol-in-computer-network#:~:text=A sliding window is also known as windowing.,Layer (OSI model) or Transmission Control Protocol (TCP).)
数据链路层-Data Link Layer:拆分比特流的成帧方法/滑动窗口协议/回退N协议/选择重传协议
Error detection and correction 差错检测和纠正
我们在链路层中实现的差错检测为比特级差错检测。一般在framing过程中我们把EDC字段加到数据报的末尾,它的检测逻辑如下:

可以说EDC越大,它给予的检测效果就越可靠。我们有两种主要的方法:
Parity Checking
奇偶检验。这差不多是最简单的检测方法,如果采用的是单个奇偶校验位,位的值取决于数据中1的数目是否为奇数/偶素。而二维奇偶检测的鲁棒性比一维的更高,它将数据划分为行列分布,并且按照行列来设置校验位,这可以让接收方根据行列位置进行对差错bit的修正。

Cyclic Redundancy Check
即CRC,循环冗余检测编码。详细操作如下:


这一讲就先写这么多,不然回看的时候没法消化……(第一讲写得太烂了)
计网学习笔记二 Link Layer Service的更多相关文章
- AJax 学习笔记二(onreadystatechange的作用)
		
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
 - [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
		
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
 - Django学习笔记二
		
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
 - Typescript 学习笔记二:数据类型
		
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
 - ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
		
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
 - python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
		
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
 - Linux学习笔记(二) 文件管理
		
了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...
 - amazeui学习笔记二(进阶开发4)--JavaScript规范Rules
		
amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...
 - amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules
		
amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules 一.总结 1.am:以 am 为命名空间 2.模块状态: {命名空间}-{模块名}-{状态描述} 3.子模块: {命名空间}- ...
 - amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
		
amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...
 
随机推荐
- android nativate  动态注册  静态注册
			
说明:在java函数的入口比较容易分析, 把activity的生命周期或者关键函数通过放在so层,分析起来就困难多了 1.在MainActivity中 package com.demo.nativat ...
 - ArcObjects SDK开发 013 MapFrame
			
1.如何获取MapFrame 打开一个Mxd文件,可能包含一个或多个Map,每个Map都会放到一个MapFrame中,加载到PageLayout上.我们可以通过PageLayout继承的IGraphi ...
 - 图解B树及C#实现(1)
			
目录 前言 索引原理 局部性(Locality) 数据的局部性 内存存储和磁盘存储 磁盘存储适合的索引结构 B树简介 定义 B树中数据的有序性 用C#定义数据结构 插入数据的过程 分裂:新节点诞生的唯 ...
 - uniapp开发微信小程序
			
uni-app介绍(官网) uni-app是一个使用Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.H5.以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉 ...
 - if多条件判断
			
在一个if语句中,括号里面包含多个条件时.条件是否被执行要看if语句里面各个条件是"与"的关系还是"或"的关系. #include<stdio.h> ...
 - python进阶之路6之 for循环方法
			
while循环补充说明 1.死循环 真正的死循环是一旦执行 CPU功耗会极速上升 直到系统采取紧急措施 尽量不要让CPU长时间不间断运算 2.嵌套及全局标志位 强调:一个break只能结束它所在的那一 ...
 - 《深度探索C++对象模型》第六章 执行期语意学
			
new运算符和delete运算符 运算符new看似是一个简单的运算,比如: int *pi=new int(5); 但是它实际由两个步骤完成: 1.通过适当的new运算符函数实体,配置所需的内存: / ...
 - [C++]default constructor默认构造函数
			
例子: class A{ public: int a; char b; } A temp; cout<<temp.a<<endl; 问题1:什么时候会合成出一个default ...
 - windows安装wordcloud遇到的坑汇总
			
pip install wordcloud报错,缺少visual studio包 不要偷懒,一定要从报错的地方去下载完整版本 然后安装c++ 重启后就不会报错了
 - 腾讯微信开源数据库PhxSQL简单部署记录
			
1.建立文件夹与互信关系 [root@mysql-100 ~]# mkdir -p /app/soft/phxsql [root@mysql-100 phxsql]# ssh-keygen -t rs ...