第 2 层或者数据链路层(Data Link layer):
名字:数据链路层
作用:使局域网中的机器互相连接
辅助作用:侦测传输错误
相关设备:交换机(也就是常说的 Switch)
第二层的语言:协议
协议:protocol,规定了机器之间交换的信息的格式的一种语言。使用最多的协议是以太网(Ethernet)。
由于每台机器所安装的操作系统各式各样(Windows、Linux、macOS等等),所以需要协议来定义统一的信息交换格式。
在网络中传输的二进制信息至少要包含:发送方地址、接收方地址、信息的实际内容。
像这样的一个信息单元,称为帧(Frame),或数据帧(Data Frame)。
在OSI第二层中,信息以帧为单元,按照协议规定的格式在网线中进行传输。一个帧就是按照协议中规定的格式形成的二进制串。
按照以太网协议的规定,一个帧的形式:接受方的MAC地址放在前,后面跟着发送方的MAC地址。
以太网帧:[接收方MAC] + [发送方MAC] + [后面的信息]
由于在OSI七层结构中,发送方在发送信息时,需要从上到下依次穿过OSI的各层,
而在接收方,接收方的机器的第2层首先检验MAC目标地址,如果和自己的MAC地址一样,
那么接收方的机器的第2层需要将信息发送到第3层的对应协议。因此,以太网帧变成这样:
以太网帧:[接收方MAC] + [发送方MAC] + [第3层使用的协议] + [后面的信息]
另外,还需要包含:要发送的信息本身、错误检测。
错误检测使用CRC,CRC是循环冗余校验(Cyclic Redundancy Check)的缩写。
CRC是一个数学的值,发送方通过公式计算出要发送的数据的CRC值,
接收方对接收到的数据进行相同的计算,得到另一个CRC值,然后比较两个CRC值,如果一致,
则说明数据在发送的过程中没有出错。如果不一致,则说明发送中出现了差错,
接收方会要求发送方重新发送该数据。于是,完整的一帧如下:
以太网帧:[接收方MAC] + [发送方MAC] + [第3层使用的协议] + [要发送的信息] + [CRC]
帧的大小
帧头:在一帧中,大小不变的一些元素的集合称为帧头。
帧头里的数据:接收方MAC、发送方MAC、第3层使用的协议、CRC
帧头的格式是固定的,因此可以定义其大小:
接收方和发送方的 MAC 地址分别占用 6 个字节;
第 3 层的协议用 2 个字节编码;
CRC 用 4 个字节编码。
6 x 2 + 2 + 4 = 18。因此以太网的帧头一共有 18 个字节。
有一种分法是将一帧分为帧头、数据部分、帧尾三部分。
接收方和发送方的 MAC 地址和第 3 层使用的协议作为帧头,而 CRC 作为帧尾。
一帧有最小尺寸和最大尺寸,
至于为什么有最小尺寸,原理比较复杂,就不详述了。以太网帧的最小尺寸是 64 字节。
规定帧的最大尺寸的目的:假如没有限制,那么有可能一台机器发送了很大一串数据,占据了网络的所有带宽,其他的机器就会发送不了数据。
以太网帧的最大尺寸是 1518 字节。
1518 字节中有 18 个字节是帧头,因此我们最多可以在一帧中放入 1500 个字节大小的数据。
小结一下,在机器 A 和机器 B 之间交换数据的过程如下:
机器 A 上的一个应用(application,在 OSI 的第 7 层应用层)发送数据到机器 B 的应用上;
在 机器 A 发送方这端,数据从上到下穿过 OSI 的各层;
发送方的第 3 层告知第 2 层所使用的协议是什么;
第 2 层就用这些信息,包装成一个帧,通过网络传输;
机器 B 收到了机器 A 发送的这个帧,首先检查帧头部的第一个元素:接收方的 MAC 地址;
如果等于机器 B 的 MAC 地址,那么机器 B 读取帧中接下来的信息;
依据帧中的协议部分,接收方(机器 B)的第 2 层就把数据正确地发送给第 3 层;
数据在接收方就从下到上,直达机器 B 的应用了。
太棒了,我们已经知道局域网中机器之间如何通信了!