本文是《计算机网络》的自学课程,视频地址为:https://www.bilibili.com/video/av47486689。仅做个人学习使用,如有侵权,请联系删除
第三章:数据链路层
概述
数据链路层的基本概念:
数据发送模型
从层次上来看数据的流动
路由器检查数据链路层看是不是给自己的,如果是的话再看网络层决定走哪个口发出去。然后到数据链路层进行重新封装以比特流传递。
我们这一章只看数据链路层
数据链路层的信道模型
链路与数据链路
链路指的是物理的线路
网卡+链路=数据链路
帧
数据链路层传输的是帧
在数据链路层加上开始和结束,进入物理层进行传输。到了对方节点的数据链路层再把开始和结束去掉
数据链路层像一个数据管道
三个要解决的基本问题
封装成帧
MTU:最大传输单元,以太网中不能超过1500字节
接收端如果没有接收到帧开始符或者结束符,就会把这个帧扔掉,因为这不是一个完整的帧。
透明传输
如果传输的数据不是仅由“可打印字符”组成时(在传输二进制文件的时候常常发生),就会出现问题
解决方法:转义
最后处理数据的话需要再去掉
差错控制
判断错误的方法:
计算公式如下:
加n位0
除一个(n+1)位数,这个数随意选
做模二除法(每一位做异或运算,注意这不是二进制除法!)
最后传递的是:原本的数据+余数
接收方收到后用这个数再对那个(n+1)位数做除法,如果余数是0,就说明数据没出错。如果不是0,说明在传输的过程中有错误,就扔掉了。
这个除数和位数是在数据链路层网卡自己协商出来的
这里有对这个方法更详细的介绍:
来源:https://colobu.com/2014/10/22/CRC-introduction/
CRC为校验和的一种,是两个字节数据流采用二进制除法(没有借位和进位,使用异或来代替减法)相除所得到的余数。其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为(n+1)的预定义二进制数,通常用多项式的系数来表示。在做除法之前,要在信息数据之后先加上n个0. 冗余码的位数是n位。
冗余码的计算方法是,先将信息码后面补0,补0的个数是生成多项式最高次幂;将补零之后的信息码用模二除法(非二进制除法)除以G(X)对应的2进制码,注意除法过程中所用的减法是模2减法,即没有借位的减法,也就是异或运算。当被除数逐位除完时,得到比除数少一位的余数。此余数即为冗余位,将其添加在信息位后便构成CRC码字。例如,假设信息码字为
11100011
,生成多项式G(X)=X^5+X^4+X+1,计算CRC码字。G(X) = X^5+X^4+X+1,也就是110011
,因为最高次是5,所以,在信息码字后补5个0,变为1110001100000。用1110001100000模二除法除以110011,余数为11010
,即为所求的冗余位。
因此发送出去的CRC码字为原始码字11100011末尾加上冗余位11010,即1110001111010
。接收端收到码字后,采用同样的方法验证,即将收到的码字用模二除法除以110011(是G(X)对应的二进制生成码),发现余数是0,则认为码字在传输过程中没有出错。尽管在错误检测中非常有用,CRC并不能可靠地校验数据完整性(即数据没有发生任何变化),这是因为CRC多项式是线性结构,可以非常容易地故意改变量据而维持CRC不变。
对于有错误的帧,直接丢掉:
CRC只是FCS的方法之一
接受终端会要求传输终端再重新传一遍数据包,也就是“重传”这一行为的请求是由上层的应用程序发起的
用余数判断是有概率失败的,因为比特正确不代表数据正确。但是信息码越长,判断错误的概率越小
PPP协议(点到点协议)
PPP协议有身份验证的功能,有账号密码,记账,家庭宽带一般就是这种
可以看到PPP协议满足了我们上面所说的三个基本问题
PPP协议可以承载多种应用层协议(TCP/IP等)
多种类型链路指的是无论是光纤、同轴电缆、双绞线等等都可以用
检测连接状态:可以汇报多种状态(常见的就是我们电脑拨号上网时如何有错,返回的状态码)
数据压缩协商:在传输之前就在数据链路层压缩数据
PPP协议的组成
PPP协议细分可以分为以下几部分:
链路控制协议负责身份验证
PPP协议的帧格式
7E开始,7E结束
FF:目标地址,但是在点对点传输中没什么用,所以就写死为FF了
C:C部分也写死为03了,也不起什么作用
FCS:帧检验序列,也包括在PPP协议传输的数据中了
协议部分:标识信息部分的类型是什么
特殊字符处理:
注意,根据第一条拆分产生的7D不需要再根据第二条再拆分了
但如果传输的是比特流而不是字节怎么办?
如果有连续五个1,就立即填入一个0,接受端接受后再将0删除,这样做是为了避免信息出现和表示开始和结束的7E
PPP不使用序号和确认机制:
PPP协议的工作状态
PPP封装的实际使用
家用宽带的带宽是通过时钟频率控制的,定义了时钟频率就定义了发信息的速度
路由器的口。最右面两个是以太网口,中间两个是广域网口,左面两个是光纤接口
下面是设计的网络:
将左一的路由器协议改成PPP,中间的路由器还是使用默认的协议HDLC,这时候两个路由器之间就ping不通了,因为协议不一样了。但是依然显示的是绿灯,因为绿灯只能表示物理层没问题,数据链路层是否正确不能表示。
IPCP和CDPCP都是OPEN的,体现了PPP协议可以支撑多个网络层协议
以太网(广播信道)
总线型的网两端有电阻,用来吸收信号,不能让信号再反射回来
现在的局域网基本上都是星型结构的
局域网
局域网覆盖范围和终端设备数量有限,但是带宽有保证。
广域网是花钱租用别人的线路和带宽,例如家庭宽带,公网ip都是动态的,是ISP从ip池找到的,断线重连Ip也会变,甚至这个ip还会和小区邻居共享
例如我们连接在同一个无线路由器下的设备就都是在一个局域网中了,可以使用内网ip相互通信
要为局域网中的设备划分信道(因为来去只有一路)
现在主要用动态媒体接入控制的随机接入,不用静态划分信道的方式了
认识以太网
传统的线性结构
优点:简单,不需要划分信道
缺点:同时只能有一个会话;安全性不好,容易被抓包
以太网(广播信道)的协议:CSMA/CD
碰撞是怎么发生的呢?
在A给B发送数据、但是还没有到的时候,B就给A发送数据了,这样就会造成冲突,会造成信号叠加。等到A和B收到信号时就能发现产生了冲突
载波监听和碰撞检测一起作用,用来减小冲突的影响
过了争用期,才能确定没有发生冲突,信息被完整地传递了
通常取51.2μs为争用期长度(因为网线的最大距离是有限的,所以可以估计)
所以在发送数据的时候,如果前64个字节没有冲突,那么后面就一定没有冲突了。
规定最短的有效帧长度为64字节,小于这个数字的都视为无效帧,因为小于这个长度就没办法检测冲突了。如果发送的数据量小于64字节,计算机会加0补上
二进制指数类型退避算法
这个算法是由CSMA/CD协议实现的,和用户没关系
它是用来设计发生冲突时推迟时间的
基本退避时间设为争用期,这是保证时间至少够一方传输完的
也就是说,重传次数越多,两台计算机选择的重传范围也就越大,碰撞的概率就越小
这里为什么这么纠结,就是因为冲突的两房没办法通信来协商如何传输、谁先谁后,只能使用这种随机的方法、希望可能相互避开
总结:
- 使用CSMA/CD协议的以太网不能全双工,只能半双工
- 冲突主要发生在每个站发送数据的一小段时间内
这种以太网的通信效率太低了
以太局域网
数据链路层的两个子层:
现在一般简化不谈LLC协议了
这也是刚才二进制指数类型退避算法谈到的
对丢失数据的校验是由两端的计算机的高层实现的,中间的设备不管,中间只管扔掉有问题的帧
星型拓扑
集线器现在已经很少见了
集线器
集线器的示意图:
一个设备发送数据,所有设备都能收到
注意,集线器是工作在物理层的!它其实就是网线的plus版,没有任何智能性的活动,就是对网线的简单模拟而已!
以太局域网的分类:
以太网的信道利用率
发送一帧的平均时间:
注意,不要忘了最后有τ时间用来恢复信道,T0+τ是开始发送+传输+接受完成的完整时间
为了最大化信道利用率,也就是最小化a:
理论信道利用率=发送时间/(发送时间+传输时间)
以太网MAC地址
每个网卡有全球唯一的MAC地址,计算机上有几个网卡就有几个MAC地址
网卡可以收到怎样的数据帧?
MAC地址冲突:一般是由于有人不使用网卡的MAC地址,而是修改了传输时候的MAC地址造成的,会造成网络问题、连不通
广播时候MAC地址是全1(用十六进制表示就是FFFFFFFFFFFF)的,所有设备收到这样的数据都接收处理
MAC帧格式
目标MAC地址和源MAC地址都占6个字节(注意上面那一行,其实就和我们上面说的PPP协议的帧格式很像,但是目标地址和原地址、FCS的长度不一样。下面再把PPP的帧格式拿出来对比下:)
PPP协议的帧格式
以太网要求数据帧最小为64字节,目标地址、原地址、类型和FCS就占了18个字节,所以信息部分最小是46字节,最大是1500字节
为什么MAC帧的信息部分最长1500字节?
来源:https://zhuanlan.zhihu.com/p/21318925
以太网帧:Ethernet Frame
标准的以太网帧,我们经常说的以太网帧长度是从图中 Destination MAC开始,FCS结束。网卡对网络层数据的操作是加以太网帧头、以太网帧尾FCS,很显然上层需要提供目的MAC地址,否则接口无从完成以太网帧的封装。这需要IP层需要事先完成和ARP的交互,解析出目的IP对应的目的MAC,这显然不能由网卡来完成。
网卡对物理层接收到的二进制流成帧处理,校验FCS,去掉以太网帧头,把载荷Payload 放在接收缓存,等待网络层取走。
标准的以太网帧最大可以发送长度1518字节,指的就是这个。去掉以太网头14个字节,再去掉尾部的校验和FCS 4个字节,留给上层协议也就是(1518-14-4)=1500个字节,这个就是MTU的由来。上层协议加黑的原因是要引起大家的注意,这个上层协议如果是IP,那么就是IP MTU,如果是MPLS,就是MPLS MTU,如果是IPv6,那就是IPv6 MTU。
MAC帧没有结束字符:以太网使用曼彻斯特编码,看的是数据变化而不是值,只需要头部即可,只要没有数据传输了就是结束了。:
曼彻斯特编码
抓包实验
用抓包工具可以排除网络故障,这里用的是Ethereal
案例分析1
这里的案例是局域网中一台电脑不断发广播包来询问其他设备的MAC地址,使得占满了局域网,最后发现是104设备有病毒,会不断发广播包,病毒占满设备内存的时候就重启,网络就通一会,不重启的时候网络就中断:
案例分析2
抓包工具将传输的数据(未加密)抓出来了
无效的MAC帧
帧间最小间隔
扩展以太网
在物理层考虑
扩展以太网的最大长度:
扩展设备数量:
将集线器连起来就可以跨局域网访问:
大的冲突域效率其实是降低的:用集线器连接的网络不宜超过30台机器,否则效率就太低了
在数据链路层考虑
集线器表现不佳,网桥出现了
当发现表上没有记录的未知设备时对所有端口发送广播,当发现在表上时,如果源地址和目标地址都在网桥的同一个端口上,那么数据包就不会发往其他端口;只有在不同的端口时才会往不同端口发数据包——网桥隔断冲突域
网桥只会从数据包的来源记录设备所在的端口,不会根据目标做记录
例如上图,B1左侧的端口对应A和B的MAC地址,而右侧对应的是C、D、E、F四台设备的MAC地址
拓展:广播风暴
来源:https://www.zhihu.com/question/51715471
>
>
>
透明网桥
透明网桥不影响计算机通信
透明网桥使用了生成树算法,以避免环的产生:
生成树上每一个节点都有一个优先级,默认优先级都一样
选择一个交换机做树根(一般是优先级数值小或者MAC地址小的),和树根相连的设备的、离更最近的端口叫根端口
再根据带宽选择指定端口(比较复杂),没选上的就是非指定端口,就不再使用了。这样就能去掉原有的环状结构。
在交换机开机时都要生成这样的树才能判断哪些端口是在使用中的
交换机
交换机其实就是高速的网桥。上面说的网桥一般是和集线器相连的,但如果用网桥直接和设备连接,其实就是交换机。交换机可以使得设备之间两两建立数据链路,将冲突域控制在了最小范围,也防止了被抓包(设备之间两两通信,其他设备不参与,得不到数据包)
交换机的端口有“排队”机制,如果一个端口正在发送数据,其他的数据包先排队等候
交换机说的带宽值得是单个端口的交换带宽,总的带宽是单个端口带宽*端口数(带宽独享),这样就大大提高了最大带宽
虚拟局域网
使用虚拟局域网(VLAN)的原因:
原本按物理位置划分网段,一个交换机对应一个网段,但是现在由于业务需要,要跨网段组建新的网段,所以就要用到虚拟局域网。
这种虽然不是课程的重点,但是其实是实际生产中用到的最多的情况。
从最简单的角度去理解:
相当于将每一个交换机分成不能直接相通的多个(相互不能直接查看共享资源),冲突域再一次变小
注意这是交换机所具有的功能,不需要额外的硬件。
可以看到,默认情况所有的端口都是在一个vlan里面的
创建一个新vlan并将端口放入新的vlan:
之后,再将要组建vlan的交换机之间连起来:
但实际上,交换机之间用一根线连起来就可以,一根线可以跑多个vlan的数据(干道接口),在数据包上加一个标记就可以做到——这就是统计时分复用,标记是在原有数据包上加的,传输到目标设备时标记已经去掉了:
ISL是思科使用的技术
高速以太网
100BASE-T不使用CDMA/CD协议:有冲突就在交换机排队。但是帧的格式是一样的。**帧间时间间隔小了10倍*
如果通信的两台设备速率不一样,就没办法通信,虽然这时候显示已连接。所以一般都设置为自动检测
“百兆到桌面,千兆到主干”
局域网建网三层模型
汇聚层对大楼的流量进行汇聚
案例分析
又讲了一个有意思的案例:企业对网络设备进行升级,但是千兆的交换机实际使用只有百兆,最后发现是老旧的光纤不支持千兆、自动协商为百兆了。解决方案就是重新布光纤。“本来是数据链路层的项目,最后做到物理层了”--学以致用。
交换机上的数据安全
在交换机上我们可以实现:
- 只让特定MAC地址的设备接入端口
- 只允许特定数量的设备接入端口中
这称为“数据链路层安全”