title | created_at | tag | toc | displayed_on_home | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
[计算机网络] 02 [Layer] Data Link |
2019-09-22 01:12:00 -0700 |
|
true |
true |
上一篇的遗留问题说到物理层仅仅提供01
bit流是远远不够的,需要进行更高层的抽象。结合开篇中提到的计算机网络的核心设计理念分组&交换,这一层的用途就是分组 : 提供基于01
bit流分组后的数据帧(PDU=Frame
)。
想要从下层的01
比特中抽象出这样的结果,则需要解决一下的三个基本问题:
- 封装成帧。
- 透明传输。
- 差错检测。
下层物理层提供的是01
bit流,想要变成分组后的帧,就需要定义起始和结束的标记。
- 起始标识 :
SOH(Start Of Headine)
,二进制0000_0001
。 - 结束标识 :
EOT(End Of Transmission)
,二进制0000_0100
。
发送方会在Frame前后插入SOH
和EOT
。接受方会读取这2个标记中间的数据。每一个链路层协议对Frame
的长度都有约束,称为MTU(Maximum Transfer Unit)
.
有了SOH
和EOT
还是远远不够的,设想一下当你要传输的数据中正好也包含这两个标记,那么我们的起始和结束岂不就错乱了?对的,正是如此,所以就需要找一个办法来识别出这种数据。这个办法就是转义,即通过添加一个新的符号来改变SOH
和EOT
的含义。
- 转义符号 :
ESC(Escape)
,二进制0001_1011
。
发送方会检查Frame,然后在需要转义的地方加入ESC
。接受方读取Frame
时会检查是否同时出现了ESC SOH
、ESC ESC
和ESC EOT
,有的话就移除ESC
,然后把后续的一个Octet
当作正常的数据。
终于可以完成的对下层的01
进行分组了。但是在传输过程中可能会发生差错,比如把0
处理成了1
,或者过来,再或者丢了一些数据,为了保证其完整性,就需要对其进行差错检测。这时就需要把一些校验码放在Frame
的后面(EOT
的前面),这个校验码称为帧检测序列FCS(Frame Check Sequence)
。生成校验码的方式通常是CRC(Cyclic Redundancy Check)
,具体的算法就不展开了。
如果接受方接收到数据后检测发现FCS
对不上,则会丢弃这个Frame
。从这个差错检测也可以反向推断出来,如果不分组成Frame
,则就无法进行差错检测了。
在LAN
中,通信双方需要一个标识符来标识通信双方,这个标识符就是MAC Address(Media Access Control Address)
1,也称为物理地址,后续就称为MAC
了。这个标识符长度为48bit
,是固化到硬件中的。前24
位由IEEE负责分配(硬件厂商向其购买),后24
位硬件厂商自己分配。MAC地址并不是全球唯一的,也不需要全球唯一,在一个LAN
内唯一即可。
Enternet(以太网)
是美国施乐(Xerox)公司在1975年开发出来的一种LAN(Local Area Network)局域网
技术。Enter(以太)
来自于当时物理学中的以太
理论(当时的科学家认为电磁波的传播介质是以太)。
1980年9月,DEC、Intel和Xerox三家公司联合制定了一个10Mbit/s的协议DIX V1
。1982年又做了一些修改,也就是目前所使用的DIX V2
2。
DIX V2的Frame2:
{{}}
这个协议中规定了Frame所包含的一些字段以及其字节布局,包括:
- Destination MAC Address (6 octet) : 目标MAC地址。
- Source MAC Address (6 octet) : 源MAC地址。
- Type (2 octet) : PayLoad的类型字段。
- PayLoad :
MTU=1500
。 - CRC (4 octet) : 这部分并不会出现在链路层,而是底层使用的。
常用到的几种Enter Type3。
Enter Type | Protocol |
---|---|
0x_08_00 | IPv4 (Internet Protocol Version 4) |
0x_08_06 | ARP (Addreee Resolution Protocal) |
0x_81_00 | VLAN (Virtual Local Area Network),IEEE 802.1Q |
0x_86_DD | IPv6 (Internet Protocal Version 6) |
0x_88_63 | PPPoE Discovery Stage |
0x_88_64 | PPPoE Session Stage |
在DIX V2
的基础上,IEEE 802委员会的802.3工作组制定了IEEE的Enternet标准IEEE 802.3
。其并未对DIX V2
的Frame
格式做出变动,而只是扩充了一下Type
字段的含义,是完全兼容DIV V2
的。IEEE 802.3
中Type
字段表示两个含义,当它的值大于0x0600
时,代表类型;小于时则代表Payload的长度。
这里的Frame Type
和上文中的Enter Type
不是一个概念。Enter Type
指的指一个Frame
内的Payload
是什么类型的协议。而Frame Type
指的是接收方收到的Frame
属于哪种类型 :
Unicast
单播 : 1:1, 发给本LAN的一个节点。Broadcast
广播 : 1:N(全体), 发给本LAN所有节点。Multicast
组播 : 1:N, 发给本LAN指定的多个节点。
有了MAC
和Frame
就可以在LAN内进行通信了,但是有个问题,发送发怎么知道对方的MAC
呢?这时候就需要专门的协议来解决这个问题了:
- IPv4 :
Broadcast
协议ARP
(Addreee Resolution Protocal)4。 - IPv6 :
Multicast
协议ICMPv6
(Internet Control Message Protocol for IPv6)5中的NDP
(Neighbor Discovery Protocol)负责。
协议不同,但是解决的问题是同一个,一下有个简单的动图可以描述这个过程。
如果
LAN
中充斥着大量的Broadcast
时,就很容易形成广播风暴,严重影响正常的LAN
通信。所以在IPv6
协议中,已经抛弃了对Broadcast
的使用,而是使用Multicast
替代。
VLAN(Virtual Local Area Network)也可以缓解上述提到的广播风暴,其作用是可以在物理的LAN上建立一个虚拟的LAN。把原本一个LAN的广播域隔离为一个个的虚拟的广播域。IEEE 802.1Q
是IEEE 802
委员会制定的VLAN标准。
当DIX V2
的Type
字段的值为0x_81_00
时,代表其Payload是VLAN(IEEE 802.1Q)6的帧格式7。
{{}}
工作在数据链路层中的设备有很多 : 网卡、集线器和网桥、二层交换机(已称为以太网交换机)。
集线器和网桥的组合它们的工作在半双工模式下,采用
CSMA/CD
协议检测冲突,虽然看起来是星型以太网,但是实际上还是总线型的。目前已被二层交换机替代了,所以就不再介绍集线器和网桥了。
一个交换机可以组建一个星型以太网,交换机识别Frame
,根据协议中的目标MAC
进行转发来通信(目前有专门的硬件来负责,效率非常高)。交换机内置有一个MAC Address Table
,通过自学习的方式积累记录着每个MAC
对应的Port
。
注意
MAC Address Table
中MAC
和Port
的对应关系。其中MAC
可以认为是key,MAC
:Port
是1:1
; 但是反过Port
:MAC
则是1:N(也就是可能有N个MAC
的Port
是同一个)。
链路层的分组&交换:把物理层的01bit流分组成Frame,以及对Frame的差错检测。然后使用交换机来实现交换。
但是如果传输过程中Frame
丢失了、重复了或者乱序了等等,链路层对这种错误则是无能为力的,所以链路层并不能对上层提供可靠传输(发送方按序发送,接收方按序接收)。这些问题就留给了更高层的协议来完成了。
Footnotes
-
MAC Address : https://en.wikipedia.org/wiki/MAC_address ↩
-
DIX Ethernet V2 Frame : https://github.com/linianhui/networking/blob/master/1-src/networking.model/DataLink/EthernetFrame.Layout.cs ↩ ↩2
-
Enter Type : https://en.wikipedia.org/wiki/EtherType ↩
-
ARP : https://en.wikipedia.org/wiki/Address_Resolution_Protocol ↩
-
ICMPv6 : https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol_for_IPv6 ↩
-
VLAN(IEEE 802.1Q) : https://en.wikipedia.org/wiki/IEEE_802.1Q ↩
-
VLAN Frame : https://github.com/linianhui/networking/blob/master/1-src/networking.model/DataLink/VLANFrame.Layout.cs ↩