程序员必须要懂网络中的数据链路层

学过计算机网络的朋友们应该都知道OSI七层模型,今天要聊的数据链路层是属于七层模型中的第二层。所以应该算是计算机网络体系中的底层了。

数据链路层使用的信道主要有两种类型:

  1. 点对点信道:也就是字面意思,点对点得通信方式。
  2. 广播信道:这种信道是一对多的方式,所以整个过程也比较复杂。必须使用一些信道协议来协调网络中的主机数据发送。


我们先来通过一个例子数据链路层所处的位置。下图展示的是典型的网络图。




主机1主机2发送数据,下图展示的数据真正流动的路径(画的有点丑,意思到了就行了):



当我们专门研究链路层的时候,我们只需要关心链路层即可。于是,主机1主机2发送数据时,我们可以认为是从左到右的数据传递。如下图:




链路层的意义

物理层的线路有传输介质与通信设备组成,比特流在传输介质上传输时肯定会存在误差的。这样就引入了数据链路层在物理层之上,采用差错检测、差错控制和流量控制等方法,向网络层提供高质量的数据传输服务。

对于网络层,由于链路层的存在,而不需要关心物理层具体采用了那种传输介质和通信设备。

那链路层的功能有哪些呢?需要完成哪些事情呢?

  1. 链路管理,帧同步
  2. 流量控制,差错控制
  3. 数据和控制信息分开
  4. 透明传输和寻址


怎么组帧的呢?

其实就是在帧的前后添加首部和尾部,这样就能界定帧的边界了。一帧多大呢?MTU就是帧的数据部分的最大长度,也就是IP数据报的最大长度。如下图:



怎样进行帧的界定呢?

答案就是在帧的开始和结束的地方加上特定的字符,一般是0X7E,如下图:



怎样透明传输呢?

答案就是如果帧内部的数据出现了0x7e,则要转义,转义的方法如下:

(1) 字符填充

因为0x7E=0111 1110,字符填充是在这两个字节中,填充进0xD5。变为(0x7D,0x5E)的组合。

即0111 1101 1001 1110

(2)零比特填充

因为0x7E=0111 1110,带有连续的6个1.因此发送端发送帧数据时,每当发现有连续的5个1,立即填充一个0发送。接收端对帧中的比特流扫描,每当发现5个连续的1,就把后面的1个0删除

eg:0111 1110变成0111 1101 0进行传输

差错的产生的原因

差错是不可避免的。而且不同的传输介质的差错程度也是不同的。链路层的任务就是分析差错产生的原因,检查差错,然后纠正差错。下面的图展示了差错的来源



当数据信号从发送端发送到物理线路时,由于物理线路存在噪声,因此数据信号经过物理线路的噪声,到达接收端时,已经是数据+噪声的叠加。这就是差错的来源。


怎样进行差错控制呢?

差错控制分为两种不同的策略:

纠错码:每个传输的分组带上足够的冗余信息,接收端能发现并自动纠正差错。

检测吗:分组包含能够发现差错的冗余信息,接收端能够发现差错。

由于纠错码实现比较复杂,检测码虽然不能纠错,但是足够简单,能够检测出差错,配合重传机制即可。所以广泛采用检测码。

检测码有循环冗余编码(CRC)等方式,工作原理就暂且略过,讲起来很费篇幅。


数据链路的工作过程到底是怎样的?

数据链路层的工作过程分为三个阶段:建立数据链路,帧传输,释放数据链路;结合数据链路和物理层的流程如下图:




滑动窗口协议

前面提到了用检错码来检测帧传输过程中是否发生了差错,如果发生了错误,就需要滑动窗口协议来解决。滑动窗口协议分为两种类型:



单帧停止等待协议:发送端发送1帧之后,需要等待接受端返回确认帧,如果接收到ack,表示OK,发送下一帧;如果接收到nak,表示传输错误,重新发送该帧。如下图所示(字反了见谅):




多帧发送协议:分为两种类型,后退N帧(GBN)拉回重发方式和选择重发(SR)方式。前者是只要有一帧发送失败,则当前发送的全部帧都重新发送,这样就会导致重发很多帧,流量控制不佳。后者是当前发送的帧中有差错,在下次发送的时候只是重新发送错误的帧就行了。

滑动窗口机制?

在GBN和SR中,发送端可以连续发送多个数据帧,从流量控制的角度出发,发送端连续发送数据帧的数量必然会收到限制:

1. 接收端的缓冲区可以用于接受新的帧的容量

2. 接收端处理数据帧的速度

3. 接收端需要等待重传的帧的数量

引入滑动窗口的目的:对可以连续发出的最多帧数(已发出但未确认的帧)作限制


图片来源网络


发送窗口(Ws):表示在收到对方确认的信息之前,以连续发出的最多数据帧数

接受窗口(Wr):可以连续接收的最多数据帧数(只有序号在窗口内的帧才可以接收,否则丢弃)

觉得不错,记得转发收藏“在看”

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();