网络数据链路层-MAC帧(1)

云掣YunChe2个月前技术文章181

1.数据链路层

数据链路层是网络协议栈中最底层的内容,而在之前对其他层次的学习让我们知道传输层可以保证数据的可靠性问题,网络层保证数据跨网络转发的路由问题,而数据链路层解决的就是局域网内两台主机间通信的问题。



2.以太网

2.1什么是以太网

以太网属于一种局域网通信技术。


不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:


以太网:以太网是一种计算机局域网技术,一种应用最普遍的局域网技术。

令牌环网:令牌环网常用于IBM系统中,在这种网络中有一种专门的帧称为“令牌”,在环路上持续地传输来确定一个节点何时可以发送包。

无线LAN/WAN:无线局域网是有线网络的补充和扩展,现在已经是计算机网络的一个重要组织部分。

虽然网络中各个局域网所采用的通信技术可能的不同的,但是IP屏蔽了底层网络的差异,对于网络通信双方的IP层及其往上的协议来说,它们并不关心底层具体使用的是哪种局域网技术。


网络中的路由器会不断去掉数据旧的局域网报头,并添加上新的局域网报头,因此数据在进行跨网络传输时,就算所需跨越的网络采用的是不同的局域网技术,最终也能够正确实现跨越。


(1)以太网通信原理


以太网”不是一种具体的网络,而是一种技术标准,它既包含了数据链路层的内容,也包含了一些物理层的内容。例如,以太网规定了网络拓扑结构,访问控制方式,传输速率等。

以太网中的网线必须使用双绞线,传输速率有10M,100M,1000M等。

以太网中所有的主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能够收到该数据。


比如当局域网中的主机A想要发送数据给主机B时,其实局域网当中的每一台主机都能收到主机A发出去的数据,只不过最终只有主机B会将主机A发来的数据向上进行交付。

局域网当中的其他主机虽然也收到了主机A发出的数据,但经过识别后发现这个数据不是发送给自己的,于是就会直接将该数据丢弃而不会向上进行交付。

(2)数据碰撞


由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用。


对于这个问题,以太网的做法就是先不限制各个主机发送数据的能力,局域网中的每个主机想发数据的时候直接发就行了,但是只要发送出去的数据与其他主机发送的数据产生了碰撞,那就得执行碰撞避免算法。

所谓的碰撞避免算法就是,当主机发送出去的数据产生碰撞时,该主机需要等待一段时间后再进行数据重发,在主机等待的时候就能够就能够尽可能让局域网当中的数据消散。

一个局域网就是一个碰撞域。

(3)交换机


交换机通过维护一个MAC地址表来记录每个端口连接的设备的MAC地址。当数据帧到达交换机时,它会根据目的MAC地址查找MAC地址表,以确定将数据帧转发到哪个端口。这种机制减少了数据帧被错误地发送到多个端口的可能性,从而降低了碰撞的概率。


交换机支持VLAN技术,可以将网络划分为多个逻辑上独立的广播域。每个VLAN内的设备只能与同一VLAN内的其他设备通信,从而减少了广播流量和碰撞的可能性。


(4)令牌环网


令牌环网(Token-ring network)的传输方法在物理上采用了星形拓扑结构,但逻辑上是环形拓扑结构。

令牌环网的通信传输介质可以是无屏蔽双绞线、屏蔽双绞线和光纤等。

令牌环网中各节点间采用多站访问部件(Multistation Access Unit,MAU)连接在一起,MAU是一种专业化集线器,用来围绕工作站计算机的环路进行传输。

在令牌环网中有一种专门的帧称为“令牌”,这个“令牌”会在环路上持续地传输,只有拿到“令牌”的主机才能发送数据,因此发送出去的数据不会发生碰撞。


令牌环网当中的“令牌”就像系统当中用于保护临界资源的互斥锁一样,“令牌”与互斥锁一样也有“忙”和“闲”两种状态,“忙”表示令牌已经被占用,而“闲”则表示令牌没有被占用。

想要发送数据的计算机必须首先检测到“闲”令牌,并将其置为“忙”状态,然后才可以发送数据,这就和申请互斥锁的过程很像。

此外,由于“令牌”在网环上是按顺序依次传递的,因此对于所有入网的计算机而言,它们获取令牌的机会都是相等的,因此不会造成某台主机发送数据的饥饿问题。

2.2MAC帧格式

MAC帧是数据链路层的一种数据数据格式,用于在局域网(以太网)传递数据。


QQ_1723168031354


源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。

帧协议类型字段有三种值,分别对应IP协议(0800)、ARP协议(0806)和RARP协议(8035)。

帧末尾是CRC校验码。

(1)MAC帧如何将报头与有效载荷进行分离?


以太网MAC帧的帧头和帧尾都是固定长度的,因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。


(2)MAC帧如何决定将有效载荷交付给上层的哪一个协议?


以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层的哪一个协议。


在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。


(3)数据传输过程


假设局域网当中的主机A想要将IP数据报发送给同一局域网当中的主机B,那么主机A封装MAC帧当中的目的地址就是主机B的MAC地址,源地址就是主机A的MAC地址,而帧协议的类型对应就是0800,紧接着就是要发送的IP数据报,帧尾部分对应就是CRC校验。


当主机A将该MAC帧发送到局域网当中后,局域网当中的所有主机都可以收到这个MAC帧,包括主机A自己。


主机A收到该MAC帧后,可以对收到的MAC帧进行CRC校验,如果校验失败则说明数据发送过程中产生了碰撞,此时主机A就会执行碰撞避免算法,后续进行MAC帧重发。

主机B收到该MAC帧后,提取出MAC帧当中的目的地址,发现该目的地址与自己的MAC地址相同,于是在CRC校验成功后就会将有效载荷交付给上层IP层(0800)进行进一步处理。

局域网中的其他主机收到该MAC帧后,也会提取出MAC帧当中的目的地址,但发现该目的地址与自己的MAC地址不匹配,于是就会直接将这个MAC帧丢弃掉。

也就是说,当底层收到一个MAC帧后,会根据MAC帧当中的目的地址来判断该MAC帧是否是发给自己的,如果是发送给自己的则会再对其进行CRC校验,如果校验成功则会根据该MAC帧的帧协议类型,将该MAC交付给对应的上层协议进行处理,如果不是发送给自己的则在数据链路层直接将数据丢弃。


(4)认识MAC地址


MAC地址用来识别数据链路层中相连的节点。

长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示,例如:08:00:27:03:fb:19。

在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)。

我们可以通过ifconfig命令来查看我们的MAC地址。


QQ_1723168466230


ether:以太。


(5)对比理解MAC地址和IP地址


实际数据在路由过程中会存在两套地址,一套是源IP地址和目的IP地址,还有一套是源MAC地址和目的MAC地址。


IP地址描述的是数据通信总体的起点和终点。

MAC地址描述的是数据通信上的每一个区间的起点和终点。

比如唐僧取经,源IP地址就是东土大唐,目的IP地址就是西天,而源MAC地址就是取经路途上一个区间内的起点,目的MAC地址就是取经路途上一个区间内的终点。


因此数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的(但实际上由于NAT技术,源IP地址也是会发生变化的),而数据每进行一跳后其源MAC地址和目的MAC地址都会变化。


(6)认识MTU


MTU(Maximum Transmission Unit,最大传输单元)描述的是底层数据帧一次最多可以发送的数据量,这个限制是不同的数据链路层对应的物理层产生的。


以太网对应MTU的值一般是1500字节,不同的网络类型有不同的MTU,如果一次要发送的数据超过了MTU,则需要在IP层对数据进行分片(fragmentation)。

此外,以太网规定MAC帧中数据的最小长度为46字节,如果发送数据量小于46字节,则需要在数据后面补填充位,比如ARP数据包的长度就是不够46字节的。

(7)认识MSS


由于数据链路层限制了单次数据传输的数据量(MTU),所以为了避免数据在网络层进行IP分片,我们应在传输层对向网络层交付的数据大小加以控制。


我们将TCP的单个数据报的最大报文长度,称为MSS(Max Segment Size)。


TCP通信双方在建立连接的过程中,就会进行MSS协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。


MSS的值实际就是在TCP首部的40字节的选项字段当中的(kind=2)。


最理想的情况下,MSS的值正好就是在数据不会在IP层进行分片的最大长度。


MSS和MTU的关系如下:


QQ_1723169159367

相关文章

PG的执行计划

一、Explain基本使用1.1 命令解释explain [ ( option [,...] ) ] statement explain [ analyze ] [ verbose ] statem...

mysql 导出 csv 参数 secure_file_priv 设置

mysql 导出 csv 参数 secure_file_priv 设置

一、功能secure_file_priv 参数是用来限制数据导入和导出操作的效果,例如由LOAD data和SELECT…INTO OUTFILE语句和LOAD_FILE()函数。只有具有“FILE”...

arm环境安装达梦数据库

arm环境安装达梦数据库

一、安装前准备1、创建用户和用户组groupadd dinstall useradd -g dinstall -m -d /home/dm...

基于Jenkins和Kubernetes的CI/CD

基于Jenkins和Kubernetes的CI/CD

jenkins安装安装helm CRD编辑好yaml文件后直接安装即可k3s kubectl apply -f jenkins-crd.yaml查看我们安装好的helmchart crdk3s kub...

ES运维(三)架构与规划(阿里云)

ES运维(三)架构与规划(阿里云)

1、 阿里云Elasticsearch架构图阿⾥云Elasticsearch和Kibana容器化运⾏在ECS中,监控agent(独⽴进程)负责收集监控指标,通过SLS发送给云监控完成监控报警。实例之间...

scylladb通过扩缩容节点迁移数据

环境: Scyllsdb版本:4.2一、上线新节点1、确认集群状态和检查配置· 首先确认集群各节点状态是Up Normal (UN),[root@172-16-121-153 scylla]# nod...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。