热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DataLinkLayer(数据链路层)

DataLinkLayer(数据链路层)TheReferenceModel(参考模型)layername5Applicationlayer4TransPortlayer3NetWo

DataLinkLayer(数据链路层)

The Reference Model(参考模型)































layername
5Application layer
4TransPort layer
3NetWork layer
2data link layer
1physical layer

Main Functionality(主要功能)



  • 提供网络层的接口

  • 通过单向连接传输数据帧

    • 处理传输过程中发生的错误

    • 控制数据流,防止快速的发送方淹没慢速的接受方




Frames(帧)

1.数据链路层从网路层接受接受数据包

2.数据链路层会在将其发送到物理层之前,将这些数据包封装成包

每一帧包括一个帧头、一个帧尾、和一个有效荷载域(用于存放分组)


Relationship between packets and frames(包和帧的关系)

1.一个来自网络层数据包变成数据链路层中的有效荷载域

2.数据链路层通过给这个包加上帧头和帧尾,把这个包放到对应的帧中


1.一个WAN(广域网)子网包含了好多路由器,它们通过租用点到点的电话线连接起来。

2.某一帧到达一个路由器的时候,硬件会首先检查它是否有错误,然后将该帧传递给数据链路层软件

3.数据链路层软件检查这一帧,看是否有自己期望的帧,如果有,就把包含有效载荷域中的分组交给路由软件,接着路由软件选择正确的输出线路,并且把分组向下传递给数据链路层软件,然后数据链路层软件把它发送出去,进过两个路由器的数据流情况如图。

4.路由代码总是希望所有的工作都能正确的完成,也就是说,在每一条点到点线路上建立起可靠、有序的连接。它并不希望老是陷入到分组丢失的境地。如图总虚线框所示,数据链路层使得不可靠的通信看起来更加完美,至少比原来更好,另一方面,尽管我们在每一个路由器中显示了多份数据链路层软件的版本,但是实际上,只有一份数据链路层软件,它负责处理所有的线路,每条线路有不同的表和数据结构。


Possible Services(为网络层提供的服务)

可能提供的服务

1.无确认的无连接服务

帧在无连接的情况下被传送或者在错误恢复的情况下被传送

例如: 以太网

无确认的无连接服务是指源机器向目标机器发送独立的帧,目标机器并不对这些帧进行确认,事先并不建立逻辑连接,事后也不释放逻辑连接,若由于线路上有噪声导致某一帧丢失,则数据链路层不会检测这种丢帧现象,也不会恢复,当错误率很低的时候,这一类服务是十分合适的比如语音传递,这种实时通信中数据迟到比数据损坏更不好,绝大多数LAN(局域网)在数据链路层上都是使用的无确认的无连接服务。

2.有确认的无连接服务

在必要的情况下,帧在重传的情况下被传送

例如:802.11

为了提供可靠性,引入了有确认的无连接服务,当提供这种服务的时候,仍然没有使用逻辑连接,但是所发送的每一帧都需要单独确认,这样,发送发就知道每一帧是否已经正确的到达,如果有一帧在指定的时间内没有到达的话,则发送方将再次发送该帧,这类服务尤其适合不可靠的新道,比如无线系统。

3.有确认的面向连接的服务

在帧被传送之前,连接就已经建立起来了

这种服务是源机器和目标机器在传输之前首先建立一个连接,该连接上发送的每一帧都会被编号,数据链路层保证每一帧被真正接受到,而且它保证每一帧只被接受一次,并且所有的帧按正确的顺序接收,相反,在无连接服务中,如果报文丢失了,则一个分组可能会发送多次,因而也会接受多次。于此相反,面向连接服务相当于为网络层进程提供了一个可靠的位流。


Framing Methods(成帧方法)


Byte Count(字节计数法)

这种成帧方法利用头部一个域来指定帧中的字节数。当目标端的数据链路层看到这个字符值的时候,它世道后面跟着多少字符,也就是知道该帧的结束在哪里。

但是这种方法的问题是,你前面错了的话,你后面都错,所以现在用的少了。


Flag bytes with byte stuffing(含字节填充的分界符法)

这种成帧方法考虑了错误之后同步的问题,它的做法是让每一帧都用一些特殊的字节作为开始和结束,在过去,起始和结束字节是不同的,但是现在绝大多数的协议倾向于使用相同的字节,作为标志字节

但是这种方法也有一种很严重的问题,当标志字节的位模式出现在数据中,这个问题很容易发生,这种位模式往往会干扰帧的分界。解决这种问题的办法是,发送方在这种偶尔出现的每个标志字符前面插入一个特殊的转义字节ESC,接受端的数据链路层在将数据送给网络层之前会删除掉这种转义字节。这种技术叫做字节填充技术

但是如果转义字符也在数据中间怎么办?答案是同样用转义字节来填充


Flag bits with bit stuffing(含位填充的分界标志法)

每一帧的开始和结束都有一个特殊的位模式,01111110实际上就是一个标志字节,当发送方的数据链路层碰到数据中5个连续的位1的时候,它自动在输出流中填充一个位0,这种位填充机制与字节填充机制非常的相似,在字节填充机制中,当发送方看到数据中的标志字节的时候,它就在其前面填充一个转义字符,然后传送到输出字节中。

当接收方看到5个连续输入位1,并且后面是位0,它自动去掉该0位,就好像字节填充过程对于两方计算机中的网络完全透明一样,位填充的过程也对网络层完全透明。如果用户数据包含了标志模式01111110,则该标志当做011111010来传输,但是存储在接收方内存中的是0111110.

在为填充机制中,通过标志模式可以明确的识别出两帧之间的边界。因此如果接受方失去了帧同步,它只需要在输入流中扫描标志序列即可,因为标志序列只可能出现在帧边界上,永远不可能出现在数据中。


Physical layer coding violations(物理层编码违例法)

适用于物理介质上的编码方法中包含冗余信息的网络,LAN中用两个物理位来编码1位数据,通常1位是高-低电平对,0是低-高电平对,每一位数据位都有一个中间电平的越变,这使得接受方容易定位到边界上。



推荐阅读
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
author-avatar
真实的嘻嘻哈哈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有