1、数据帧格式
我们首先来看看数据链路层的传输数据帧的格式。
所有的以太网(802.3)帧都基于一个共同的格式。在原有规范的基础上,帧格式已被改进以支持额外功能。
当前以太网的帧格式[1]如下:
前导
:用在发送方和接收方之间同步时钟和bit流;
SFD
:帧开始界定符,只有一个byte,内容固定为:10101011 (0xAB);
DST
:目标MAC地址;
SRC
:源MAC地址;
长度或类型
:0800时,表示IP数据报,0806表示ARP请求/应答,0835表示RARP请求/应答;
FCS
:帧检验序列,用于数据帧的差错检测;
这个包应该发给谁?
判断是否应该接受这个包,就是通过帧的MAC地址进行判断的。
这是一个物理地址,叫做链路层地址,因为链路层主要解决媒体接入控制问题,所以称为MAC地址(Media Access Control Address)。实际上,MAC地址就是适配器地址或适配器标识符,当适配器插入到某台计算机之后,适配器上的标识符就成为这台计算机的MAC地址了。
怎么校验包是否出现错误
FCS是帧校验序列,也就是循环冗余检测,收到数据报之后,会通过一个检验计算规则,把计算结果与FCS字段匹配,如果匹配补上,则帧可能在传输过程中受损,通常会丢弃该帧。
2、ARP: 如何获取目标机器的MAC地址?
我们知道,在数据链路层,是通过MAC地址判断某一个接收到的包是不是要进一步处理的。但是如果我们不知道对方的MAC地址的时候,如何发送数据链路层的帧呢?这就需要用到数据链路层的ARP协议了。
ARP协议:ARP为IP地址到硬件地址之间提供了动态映射,我们通过ARP可以把32位的Internet地址转换为48位的MAC地址。另外,我们可以使用RARP,把48位的MAC地址转换为32位的Internet地址。
另外,为了保证ARP的高效运行,ARP会维护每个主机和路由器上的ARP缓存,把Internet地址和MAC地址的映射关系保存起来,缓存正常到期时间是20分钟。
下面是这个过程的演示,其中ARP数据帧只把关键信息描述出来了,想要了解完整的帧格式可以用参考 TCP/IP协议详解卷1
[2]
如上图:
主机A想知道192.168.1.4
这个IP地址的MAC地址是什么,发现本地缓存中找不到,于是广播
了一个ARP请求,主机B和主机D收到之后,发现自己不是192.168.1.4
于是忽略这个消息,主机C发现自己就是192.168.1.4
,于是响应了一个ARP数据帧。最终主机A收到主机C响应的数据帧,拿到了MAC地址,并把IP地址和MAC地址映射关系保存下来。
3、链路层设备之交换机
3.1、为什么需要交换机?
前面我们用了集线器组件网络,这个时候所有消息都会广播到其他端口,可以发现集线器转发了很多不必要的消息,能不能只发给需要的端口呢?这个时候就需要用到交换机了。
当一台电脑A向交换机发送数据时,交换机会把电脑A的IP和MAC地址记住,保存到一个转发表
中,如果转发表
中暂时找不到目标IP地址的MAC地址,那么首先还是会广播消息,最终转发表会记录所有请求过交换机的电脑IP和MAC。当然,转发表也是有过期时间的。
如上图,看到交换机的奸笑没有,与集线器不同,交换机是有灵魂的的,你告诉他你的身份证号和住址了,他就会偷偷记下来。
3.2、为什么有了IP地址,还需要有MAC地址?
IP地址是工作在网络层的,后面会讲到;
MAC地址是工作在数据链路层的,也就是交换机这一层,交换机之间的主机进行通信,都是用的MAC地址,但是一旦走出了局域网,我们就得用大家都公认的IP地址了。
MAC地址就好像是我们的身份证,IP就像是我们的住址,可以根据住址寄送快递,但是不能根据身份证号码寄快递,别人不知道怎么走呢。
一个局域网,用身份证没有问题呀,因为要找某个人,ARP会大喊一声名字,那个人就会告诉你他的身份证号码了,这个时候直接以身份证作为标识传消息,别人听到不是自己的身份证就不管了。最终交换机这个小管家记住了所有人的名字跟身份证号码,就会使用悄悄话的方式传达消息了。这也就是用到了交换机的转发表。
3.3、交换机拓扑环路问题
假设我现在拉网线,搞了一个这样的拓扑结构:
如上图,主机准备发送一个消息出去,结果交换机B收到后,复制数据帧,发送给了交换机A、C、D,此时交换机B认为主机是在左边。但是不妙的事情发生了,交换机D收到消息后,由于转发表还是空的,又是也复制数据帧,转发到了交换机A、B、C,这个时候交换机B发现怎么主机的数据又从右边传过来了,这些彻底晕了,不知道主机究竟在哪里。就这样数据一致在这个网络里面打转,这就拓扑环路导致的问题。
生成树协议
为了解决以上问题,于是 有了生成树协议(Spanning Tree Protocol,STP)。
STP通过在每个交换机禁用某些端口工作,来避免拓扑环路,保证不会出现重复路径。
STP会找到拓扑结构的一个生成树,通过生成树避免环路。生成树的形成和维护有多个网桥完成,在每个网桥上运行一个分布式算法。
以上拓扑,结构,最终应用了生成树,禁用一些端口之后,可能会是这样:
这样,消息就不可能再传回左边的主机了,从而避免了拓扑环路导致的问题。
建立生成树:
网桥会发送一种称为网桥协议数据单元(BPDU)的帧来辅助形成和维护生成树。
STP首先会尝试选举根网桥,根网桥是在网络中标识符最小的网桥(也就是说优先级与MAC地址结合),网桥初始化的时候,假设自己是最小的网桥,然后用自己的网桥ID作为根ID字段的值发送配置BPDU消息,如果发现ID更小的网桥,那么会停止发送自己的帧,并基于接收到的ID更小的帧构造下一步发送的BPDU消息。发出根ID更小的BPDU端口被标记为根端口,剩余端口被设置为阻塞或者转发状态。