笔者:YY同学
生命不息,代码不止。好玩的项目尽在GitHub
Layer 2(L2)功能
- L1 无法决定数据传输的目标主机,L2 则可以通过媒介进入控制单元(Media Access Control,MAC)选择数据传输的目标主机。
- L1 无法命名和识别主机,L2 可以使用 Flat Addressing 进程。
- L1 只能描述 bit 流, L2 使用 frame 来重组 bit 流。
- L1 无法与上层(L3)沟通,L2 可以通过 Logic Link Control(LLC)与上层通话。
- L2 通过网卡(Network Interface Card,NIC)实现网络适配器。
MAC 层和 LLC 层
MAC 层和 LLC 层属于 L2 的两个子层,MAC 在下,LLC 在上。
- MAC:向下连接 L1,决定共享环境下哪个主机可以收到数据,分为可决定性(Deterministic)和不可决定性(Non-deterministic)。前者采用轮转式,当前拿到电子 token 的 host 可以进入网络完成数据收发,如果该 host 不发送数据则 token 递给下一个 host,以此类推。Token Ring 和 FDDI(Fiber Distributed Data Interface)采用这种模式。后者采用广播式,会对所有主机发送数据,没有先后顺序。以太网就采用这种模式。MAC 层拥有唯一地址,即 MAC 地址,又称物理地址(Physical Address)。
- LLC:通过软件实现,独立于硬件。LLC 可以参与包封装,并且加入 Destination Service Access Point(DSAP)和 Source Service Access Point(SSAP)便于 MAC 完成数据包运输。
- 注意:以太网(Ethernet)包含物理层(L1)和 MAC 层(L2 下半层)。以太网命名规则:速度(Mbps)+ 信号方法(BASE/BROAD)+ 媒介(F 表示光纤管,T 表示 UTP)。
碰撞域(Collision Domain)
在逻辑拓扑(Logical Topology)中,多个设备共享一块区域,处于该区域中的设备可以自行并且同时转发数据包,因此数据包之间可能产生冲突导致数据损毁。一般碰撞域会被 L2 的设备(Bridge 和 Switch)隔开,而 L1 的设备(Hub 和 Repeater)则会拓展碰撞域。其原因是 L1 设备是半双工(Half-Duplex)的,如同运输汽车,只负责运输而不知道是不是该停下来;而 L2 设备则是双工(Full-Duplex)的,如同路口的交通警察,具有指挥数据交通的功能。
CSMA/CD(Carrier Sense Multiple Access with Collision Detection)
这是一个简易的检测碰撞的系统。在每个时间片只允许一个 host 发送信息。在发送信息前,host 会监听网络确保是否有其他 host 发送的数据正在网络中,如有则等待,如没有则发送。如果发生了碰撞,检测到碰撞的 host 会停止当前的一切发送,并且 NIC 会将检测到的碰撞在碰撞域内广播。最后,发送数据的 host 收到碰撞信息后,会销毁之前传输的数据并重新发送一遍,之后会传送一个 32-bit 的 jam 信号告知该碰撞域内的所有 host 现在正在进行数据传送,请勿再发送数据包。
碰撞的三种类型
- 本地碰撞(Local Collision):在 UTP 中同时检测到 RX 和 TX
- 远程碰撞(Remote Collision):一般发生在 repeater 的远端,并且没有本地碰撞。
- 延后碰撞(Late Collision):发生在前 64 个八位字节发送之后,NIC 不会自动传送这种冲突,一般发生在插槽时间(Slot Time)结束之后。
插槽时间与退避算法(Backoff Algorithm)
插槽时间是比理论上一个碰撞域中距离最远的两个设备之间来回通信的时间还要略微长一点。插槽时间不仅能保证碰撞域内任意两个设备在经过一个插槽时间后一定能完成数据传送,并且最大程度上减少不必要的等待时间。目前,插槽时间只应用于半双工系统。
退避算法是在发生碰撞后快速恢复通信的一种算法。如果当前碰撞域内没有检测到任何碰撞,则正常发送数据包。如果检测到了碰撞,则发生碰撞的所有 host 需要随机等待一段时间后再次尝试发送数据包以减少再次碰撞的概率,但如果又失败了则需要继续尝试。尝试的次数越多(一般最多 16 次),则需要等待时间的范围也会随之增大(如同在十字路口中心的车辆需要等待各方向车辆通过后才能通过)。例如下图中 A 与 B 先检测到碰撞,然后 A 和 B 随机等待一段时间后继续发送。之后 B 与 C 检测到碰撞,因此 B 需要等待更长的时间因为这是 B 的第二次尝试,而 A 则可以正常发送。随机等待时间范围的公式如下:
R
a
n
d
o
m
w
a
i
t
i
n
g
p
e
r
i
o
d
=
(
2
n
–
1
)
?
(
s
l
o
t
t
i
m
e
)
Random waiting period = (2^n – 1) * (slot time)
Randomwaitingperiod=(2n–1)?(slottime)
泛型 Frame 格式
- 起始段(Start Frame Field):表示信号序列的开始,后面跟的所有部分称为 Frame。
- 地址段(Address Field):包含源(Source)和目的地(Destination)的 MAC 地址。
- 长度段(Length/Type Field):包含 Frame 的长度以及 layer 3 的发送请求和协议,与地址段合并为 Header。
- 数据段(Data Field):包含主体传送的数据,一般是上层的 PDU。
- 校验和段(Frame Check Sequence Field, FCS):又称为 Trailer,负责确认数据是否正常发送,是否有损坏。常用的检测方法有:Cyclic Redundancy Check(CRC),Two-dimensional Parity 和 Internet Checksum。
MAC 地址类型
- 单播地址(Unicast) :只包含一个目的地的 MAC 地址,发送给唯一目标 host。
- 广播地址(Broadcast):在冲突域内广播给所有的 host,MAC 地址为 FF-FF-FF-FF-FF-FF。
- 多播地址(Multicast):在冲突域内发送给部分或一组 host,MAC 地址以 01-00-5E 开头。
Bridging 和 Switching
都是 L2 设备的寻址方式,都利用 MAC 地址寻找 host。按照设备分,桥用 Bridging,交换机用 Switching,后面还会衍生出 Bridge Table 和 Switch Table 用于记录源和目的地的 MAC 地址和端口号,但二者本质上是差不多的。 来看一个例子,一个数据包从 PC1 发送给 PC3,当前两个 Switch Table 里分别记录了 PC1,PC2,PC3 的 MAC 地址和端口号。现在,数据包从 PC1 通过 P1 端口发送给 Switch1,Switch1 中已经存在了 PC1 的记录因此无需重复记录,之后 Switch1 开始寻找 PC3 的记录结果没找到。于是 Switch1 在冲突域内进行广播,将数据包发送给 PC2 和 Switch2。PC2 因为目的地 MAC 地址不一样因此会把收到的数据包扔掉(Drop),而 Switch2 收到数据包后会在 Switch Table 中标记 PC1 的 MAC 地址为 MAC_1,端口号为 P4,这表示数据包是由 PC1 经过 P4 端口发送过来的。之后,Switch2 会寻找 PC3 的地址,正好 Switch Table 中有所记录,于是只会向 PC3 发送数据包而不会发送给 PC4。
三种 Switching Mode
模式 | Store-and-forward | Fast-forward | Fragment-free |
---|
读取目的地 MAC 的时间 | 在接收整个 Frame 后 | 在接收整个 Frame 前 | 在接收整个 Frame 前 | 转发时间 | 在接收整个 Frame 后 | 在接收整个 Frame 前 | 在接收整个 Frame 前 | 延迟高低 | 高延迟,取决于 Frame 的到达时间 | 延迟最低 | 低延迟 | 错误检测 | 会检测所有错误类型 | 没有错误检测 | 冲突时检测,会检测大多数错误 |
|