如果是OSI七层模型的话,物理层是处于最底层的位置。对于TCP/IP四层模型,它是属于最底层的网络接口层。物理层的作用是
连接不同物理设备的介质,包括有线介质和无线介质,其中有线介质包括
双绞线、同轴电缆、光纤、比特流
一条通信线路,既发送又接收,如果引起了冲突会怎么办?
这个问题,其实物理层已经解决了。根据信道的不同,通信电路可以分成
单工通信信道
半双工通信信道
全双工通信信道
前边介绍到,如果两个计算机进行通信,那么在他们之间就会有一条通信线路,在这条通信电路中,可能用发送信道和接收信道。考虑一种情况,如果有很多的计算机,他们都需要连接,这个时候就有很多的发送信道和接收信道,并且在很多时候,他们也并不是处于活跃的状态。这就会导致信道的利用率不高。因此就提出了分用-复用的技术,用来提升信道的利用率
分用-复用技术是如何提高信道的利用率?
多个计算机连接复用器,另一侧的计算机连接分用器。通过复用器和分用器这两个设备就可以共享一条发送信道以及接收信道,这样就可以大大提升信道的利用率。
注意:如果有很多的计算机,很频繁的通过信道收发信息,会导致信道拥塞
对于物理层,主要是进行不同设备的连接,以及传输比特流。下边是对数据链路层进行介绍,首先数据链路层是位于OSI七层模型的倒数第二层,也就是物理层的上边一层,位于TCP/IP四层模型的网络接口层
数据链路层主要是解决了以下三个问题
下边是通过图示来理解封装成帧的过程
而数据帧在物理层表现的就是很多的0和1组成的比特流。上边的提到的帧首部和帧尾部,都是特定的控制字符(特定比特流)
帧首部的比特流是:SOH:00000001(SOH是控制字符)
帧尾部的比特流是:EOT:00000100
如果帧数据中也恰好有帧首部或帧尾部一样的比特流该怎么办
这个就需要透明传输
通过透明传输就可以解决上边提到的问题。在介绍透明传输之前,先了解一下什么是“透明”。“透明”在计算机领域是非常重要的一个术语。
比如我们平时在设计一个API的时候,我们会常说,你这个API设计的足够良好的话,那么底层的这个API的操作,对API的调用方是透明的。再比如说,数据链路层和物理层,对于数据链路层来说,物理层它所做的工作都是透明的,物理层只需要提供一些API给数据链路层去使用就可以了。说白了就是:一种实际存在的事务,却又看起来不存在一样。把透明这个概念使用在数据链路层就是,控制字符在帧数据中,但是要当做不存在的去处理
那么数据链路层是怎样做到,即使控制字符位于帧数据中,它还是可以装作不知道的去处理的呢?
假设此时帧数据中有一个帧尾部的控制字符,如果数据链路层没有使用透明传输,那么接收端很可能就把位于帧数据中的控制字符,看做是数据帧的尾部,从而识别出错误的帧。因此数据链路层就会对帧数据中的控制字符进行特殊处理
处理的方法就是在控制字符前边加转义字符,下边的ESC就是转义字符。这样的话,接收端在接收到数据帧之后,它就会先判断帧数据中的控制字符前边是否存在转义字符,如果存在,就不会把这个控制字符当做一个控制字符。那如果帧数据中也出现了转义字符怎么办?把转义字符重新转义一次即可
其实我们在平时的编程当中,“\”一般看做是转义字符。假设此时要输出“\”,那么在这两个反斜杠前边都加上转义字符即可,表示这两个都不是转义字符"\"
物理层只管传输比特流,无法控制是否出错(如果物理层传输比特流的过程中受到了一些干扰,比如闪电。就会影响比特流的传输,物理层是察觉不到的)
数据链路层负责起“差错检测”的工作,主要包含两个部分:
奇偶校验码是一种非常简单的检测比特流中是否有传输错误的方法。该方法是通过在比特流的尾部添加一位比特位来检测比特流是否有出错。假设测试要传输“00110010”这个8位的比特流
如果我们要传输“00111010”这个比特流,那么后边添加的比特位就应是“0”,因为这8位相加的结果是4,是个偶数。下边就看一下,如何通过这个奇偶检验码来检测错误。假设此时要传输“00110010”这个比特流,那么需要在尾部添加“1”这个比特位。假设在传输的过程中发生了错误,接收端收到的是“00010010”,此时接收端会通过奇偶校验码来进行校验,接收端计算的奇偶校验码是“0”,不等于“1”,说明这个比特流在传输的过程中出现了差错
相信聪明的你已经看出来,这里边有一个局限性,假设现在还是要传输“00110010”,在尾部添加的比特位是“1”。假设此时接收端接收到的是“00000010”,接收端经过运算之后,发现后边的奇偶校验位应该是“1”,而恰好此时,最后一位校验位就是“1”,就会认为数据没问题,而实际上数据是有问题的。所以当比特流出现两位错误,奇偶校验码就检测不到错误。
循环冗余校验码是一种广泛使用的差错检测的算法
CRC主要有三个步骤
下边直接例子
使用CRC计算“101001”的可校验位串
下边就根据上边提到的计算CRC的三步来计算
(1)首先是选定一个用于校验的多项式G(x),并在数据尾部添加r个0
什么是G(x)?
G(x)可能是下边这样的一个多项式
位串就是将多项式的常数项提取出来,得到了位串1101。在数据尾部添加r个0,其实就是在尾部添加最高阶个0。因此在“101001”后边添加3个0就得到了“101001000”
(2)将添加r个0后的数据,使用模“2”除法除以多项式的位串
经过上边的计算,得到余数为“001”,然后进行第三步
(3)将得到的余数填充在原数据r个0的位置,得到可校验的位串
也就是将原来的“101001000”填充为“101001001”,最后这个就是最终要发送的可校验位串,上边的过程都是在发送端完成的,发送端通过校验出可校验位串之后,它就可以将这个比特流发送给接收端。接收端在接收到这个比特流之后,它就可以进行校验。校验的过程也是一样,接收端将接收到的数据除以G(x)的位串,根据余数判断是否出错,如果没有出错,得到的余数应该是0,如果不是0,说明数据在传输过程中出错了
上边就是循环冗余校验码算法(CRC)的整个过程
数据链路层的数据帧不是无限大的(因此MTU描述的就是最大可传输的数据帧)
设置MTU的好处:数据帧过大或者过小都会影响传输的效率(常用的以太网的MTU一般为1500字节)
如果数据帧过大,总时延就会增大,这样就导致发送端和接收端处理信息的时间过长,如果过小的话也不行,假设每次发1个字节,那么1500个字节就需要发送1500次,虽然每个数据发送的总时延减少了,但是重复1500次,这个也会影响通信的效率,所以数据帧过大或过小都会影响数据传输效率
路径MTU
假设计算机A给计算机B传输数据,需要经过多个小型网络。假设计算机A给计算机B传输数据的话,那么路径的MTU由谁决定的呢?如下图
计算机和小型网络之间以及小型网络和小型网络之间的数字是MTU,那么整个路径的MTU就是受最小的MTU影响的,称之为木桶效应。所以整个路径的MTU就是1492
上边介绍了数据链路层中的数据封装成帧、透明传输、差错检测以及MTU。了解完这些,还不能让我们知道数据链路层是如何进行数据传输的,以太网协议是数据链路层非常常用的一种协议。在学习具体某一层的协议时,我们是希望可以屏蔽其它层的一些细节,比如我们在学习数据链路层的协议时,就不需要关注物理层是如何进行比特流的传输的,我们甚至可以认为比特流是由某一台机器的数据链路层直接传输到另一台机器的数据链路层的,以此来简化理解
假设有下边这么一个网络拓扑,图中有A、B、C三台计算机,这三个计算机通过一个路由器进行连接。假设此时A需要向C发送数据,数据是如何到达的C的?路由器怎么知道计算机A的数据要发送给谁?
以太网数据格式
主要由五个部分组成:
MAC地址表
MAC地址表是一个映射,会把MAC地址具体的映射到硬件接口。了解了MAC地址表,就可以解决最开始提到的那个问题了
当A要给C发送消息的时候,在路由器E中有一个MAC地址表,表中记录了每一个MAC地址映射到了哪一个接口。所以A给C发数据的整个过程就是:
对于比较复杂的网络拓扑,通过MAC地址表就不能解决跨设备的数据传输
因为通过MAC地址表只能进行相邻物理节点之前的数据传输,所以,如果A要给C发送数据,靠MAC地址表是完成不了的(E只能知道A、D、F的地址)。解决跨设备的数据传输就需要学习网络层的更多内容