最近,我重新翻开了大学《计算机网络》的课本,本来想重新温习一下tcp/ip协议的内容,对vpn的原理进行探究的。但是,很久没有翻过这本书的我,突然被链路层的知识吸引了,感觉当初学习的时候怎么什么都没有学会,出现的ppp协议都完全想不起来有哪些的内容(啊,我好菜啊)。所以接着“渴望”知识的状态,做一下链路层的笔记。
1 基本介绍
链路层作为网络层的下一层,主要的任务就是将网络层中的数据封装打包,常见的有我们熟知的ip数据包,也可以成为分组,或者包。
通常,最广为人知的,或者说最基础的就是点对点信道(ppp),传输协议的数据单元叫做“帧”。这里的“点”,是两个结点的意思,比如说,两个网线互联的电脑,它们之间的通信就是点对点的,如果两个电脑是出于同一个局域网中的(比如使用在同一个路由器连接下,或者是交换机),它们之间就不是点对点了,因为在它们之中还有其他的设备(结点)。可以说,这个时候电脑到路由器(交换机)就是点对点的,这样点对点的一个通道,就叫做链路。而另一个概念——数据链路,则不是真正意义上的点对点链路,中间还有实现协议的物理设备,可以说是逻辑链路。
2 链路层的基本问题
链路层的帧,作为封装传输上层数据的一个基本单位,自然面临一定的问题来处理自己层所面对的问题。主要包括封装成帧,透明传输和差错检测。
2.1 封装成帧
我们知道,在下载一般文件的时候,服务器都不是直接将这个文件的数据解析出来,直接发送过来的(当然,不排除你下载的这个文件足够小),一定意义上,这是一种空分复用的思想。一个文件在传输的过程中,客户端怎么识别出来这些零散的数据呢。链路层就是负责识别这些分组数据的,而重组是发生在ip层的。
链路层在将上层的数据封装成帧的时候,就会在首部和尾部添加一些数据用来帧定界,这样,结点在收到数据的时候,就能将每一个帧隔离开来,这样的数据叫做帧定界符,首部尾部分别用SOH,EOT(表示定界符的名称,实质是一个二进制)定界。
很显然,在首部和尾部之间的数据就是封装的上一层的数据信息,有了首部和尾部的设计,还有之间规定的最大传输单元的限定,这样的话,就可以根据帧定界符的有无,来区分不同的帧,丢弃无效的帧。帧的结构如下图所示
2.2 透明传输
透明传输名词的简单理解就是将数据”隐蔽”得传输,不让目标对象”发现”。而在链路层,需要隐蔽传输的数据,就是封装成帧中数据部分的“帧定界符”,为的是不让结点“发现”(误认为)是帧定界。为什么这样说呢,前面说到,帧定界符也是一个二进制,只是数据中不常见的而已,但是难免数据部分中会出现和它一样的符号,这个时候需要避免结点把它识别成SOH,EOT。
这个设计的思路跟我们平时写代码遇到字符输出或者正则表达式时使用“\”转义一样的意思,就是在不想被误识别的二进制前面再加一个二进制,以此反复,这种行为叫做字符填充。
差错检测
网络上的环境是“千变万化”的,这就难免帧在传输的过程中发生错误,同tcp一样,数据链路层也对帧进行了差错检测。但是,因为链路层涉及到的链路没有tcp复杂,所以它仅仅进行检测,有误的直接丢弃,确认重传的事情由tcp完成(不绝对)——即大部分情况来说,数据链路层是不可靠传输的。
链路层进行的差错检测只是对一个帧里的比特差错检测,对于帧重复,帧丢失,帧失序这些它是不关心的。实际上这些都是tcp在完成。差错检测广泛使用的是循环冗余检测(CRC) 算法。下面直接看课本中的描述:
这里不对这个算法作过多的描述,大概的思路就是,M后面补充0的个数是P位数n少一位,这样做的目的一是商永远可以用n位数表示,其次补上余数的FCS不会改变原来M的数据。
3 ppp协议
ppp协议作为链路层中最基础的协议,在链路层中的“大定义”上(比如上面的三个基本问题设计),有着自己更为细致的规则。
3.1 组成
从上面的学习我们知道,数据链路层基本的数据传输单元是帧,实际上帧的构成是由01组成的,ppp协议可以对帧进行分组发送,这就是异步传输,而整个帧一起发送成为同步传输
链路控制协议(LCP),用来建立、配置和测试数据链路的协商。
一套网络控制协议(NCP),用来支持不用的网络层协议。
这三个部分组成了ppp协议的内容,它们通常是相辅相成的,异步传输主要用于对时序要求不高的传输(比如零散异步的消息)。
3.2 填充方式
因为ppp协议拥有异步传输和同步传输两种方式,对于这两种方式需要作区分。异步传输中将帧分组的区分采用了上述透明传输的思想——使用字节填充的方式。而同步传输是为了避免结点将字节填充中使用的字符误认为是定界符,一般采用出现5个连续1填充0的零比特填充方式填充。