mac数据链路层的理解
mac层的功能介绍
mac层在理论上赋予了较全的功能,但是其实,实际上在使用的时候,由于无噪声通道,或者一些功能交给了上层的协议,所以实际的mac功能没有理论那么全面。mac层的实现包括在驱动和固件中,所以实际的功能得看芯片和固件的支持,比如是否支持监听模式;
理论上:建议书籍《数据通信与网络》
寻址:实际的端到端通信,都是需要先知到对方的mac地址(通过arp),才能进行实际传输的;
帧构建:这一层结束后就是完成了包封装,下一步传送给物理层编码发送了;
数据差错检查;传送控制,流量控制,差错控制,编码,校验和等等;,编码是指在原始数据mac封包后,在实际传输时进行编码(按照某个80x协议等,这个属于偏物理层的事情了)
实际上:数据差错检查,流量控制,差错控制等都没做,或者要看具体的厂商实现如高通,mtk等
mac层的传输限制
考虑一个包从电脑发出去,最后一次封包根据接口不同(有线,无线),协议不同,采用的mac头也不同,如ppp协议要加其他信息;
–>简述:接着可能发给无线路由器或者交换机,路由器会判断是wifi的mac头,接着要向以太网传输时,或者无线传输时,需要去掉mac头,并加上自己的mac头,改变mac源地址为自己,目的地址为(路由表对应)arp寻找的下一跳mac地址;若为以太网,还要转换为以太网的头类型等
…
整个过程,从物理层角度看,是可以顺利进行的,但是实际为了效率,不接受无用的包,不发送无效的包和安全等,在驱动和固件都会有做相应的过滤处理,从而使发包收包,转发包等受到了限制,见下实验等;
mac层的封包,mtu,msdu,mpdu
在包的封装上,有线网和无线网不同,更确切的是协议不同,其mac层封包也不同–对相同的ip包(ip头+上层数据/arp/…)带有不同的mac头:
例如对以太网(有线):常见有一下四种mac头封装的帧:
- EthernetII: dest addr+src addr+type+data+fcs
- Ethernet 802.2:dest addr+srcaddr+len+ llc+data+fcs
- Ethernet 802.3:dest addr+src addr+len+data+fcs
- Ethernet SNAP:dest addr+src addr+len+llc+snap+data+fcs
参考:https://blog.csdn.net/xiao628945/article/details/8006022
针对无线网络:802.11n等,更复杂些: - 802.11头+msdu(数据部分)+fcs(crc)
而802.11wifi无线帧分为控制帧,管理帧和数据帧,因为在无线网络中的安全性等考虑,需要扫描,关联,认证四次握手等步骤,在802.11头就包含了subtype,即数据部分是什么类型(控制,。。)https://blog.csdn.net/suiyuan19840208/article/details/17200745或者啃spec:文末
https://blog.csdn.net/robertsong2004/article/details/42805803这篇更详细,能查到的不想记录了
这么多的封包类型,除却ip层只有一种,那在传递的过程中如何处理?即有线到无线,怎么识别?答案是在路由器,主机中进行去头和加头
不同厂商实现不同,在无线中,非数据帧部分:底层的实现分为full mac driver(Full Mac的Driver,一般Auth和Assoc的包直接在芯片里边处理了,Driver通过command形式告诉Firmware要连接AP的信息,Firmware处理了Assoc Response之后,report给Driver一个Event,说明连接的情况(result和AID)以及assoc相关的IE,Driver会直接调用cfg80211的接口报告给supplicant,然后处理EAPOL的握手过程,因为之后的EAPOL Data的处理会用到Assoc Response里边的IE) 而用soft mac则软件可以控制较多的事情(Soft Mac模块开源代码mac80211的WiFi芯片,会将这两种包送到Mac80211处理,mac80211处理完后调用cfg80211的接口通过nl80211(netlink)通知wpa_supplicant准备认证以及四次握手的状态机,等待处理EAPOL包,EAPOL是二层的Data包,会在Supplicant里边处理,连接加密的路由情况就是这样处理的,如果不加密,那就直接DHCP了);扯远了。。
在pc等设备中,在封装到数据链路层时,封装时用的是ethernetII,到底层驱动时就被替换为对应的802.11的头了,进而发送出去,而在接收数据包的时候,底层上报上来又会把802.11格式的转换为ehternetII的形式,所以我在实验wifi的时候,用的PF_PACKET来操作数据包,加的是ethernetII的头,接收到打印出来后还是ethernetII的头
晒张空中包的和本地tcpdump抓到的包对比:
//to do
当然除却mac头的不同,mtu的概念还是存在:
mac层在传输时一次传输一帧,这一帧即是封装了mac头的数据包,它常为[46-1500]+mac头,而mtu即是最大的传输单元,是去掉mac头的负载部分最大值,如1500
而在实际传输的空中包,情况又可能不同,这里看msdu 和mpdu:
https://blog.csdn.net/zhengnice/article/details/51923132
这篇文章讲的很好,在理解了上述的内容后,看这篇文章里面的msdu和mpdu就能很好的理解了,spec的416页也有相关的内容
mac头格式:不同协议可能不同:
常见:dest addr,src addr ,proto type; 14byte
见上文
mac层的发包和收包限制
考虑一个问题,即在不考虑网络网段的情况下,两台设备在开启wifi或者连接网线的情况下,能相互直接通信吗?
从理论上是可以的,首先是发送,无问题,接收,可以接收;其次,接收之后解码,需要双方使用相同的编码协议等;
其次:实际上,需要几个条件,且有线和无线的方式不同:
- 有线:需要双方相同的编码,直连的情况下,可以直接通信;
- 无线: (分为数据部分和管理部分,需要双方相同的编码),但是仅开启wifi,只能接收小量信息的beacon帧;即wifi为了安全性,效率等(wifi本身可以接收所有数据),做了连接前的扫描,关联认证,四次握手等过程,并且对mac地址进行过滤,使不同网段的两个相邻设备不能通过直接发送接收mac层数据来交互;具体见厂商的实现,可以参考实验部分;
- 所以关键看厂商怎么实现,底层的东西,他们提供接口给你,你就能操作了balalal
普通模式,混杂模式和监听模式
mac层的几个实验
普通模式下,wifi实验,以station架构进行:
设备A,B,路由器C,D; - A,B连接同一个路由器C,A,B通过PF_PACKET发送和接收mac头加任意数据,成功发送接收,即使arp表无对方的条目
- A,B都不连接wifi,只是打开wifi,此时无法发送和接收数据,厂商默认的只会发送主动扫苗和接收beacon帧,扫描的具体过程待文章写,在没有连接上时,只会发送小数据
- A,B间任意设备连上路由器,同上
- A连接路由C,B连接路由D,相互发送和接收mac头加任意数据,目的地址为对方mac,源地址为自己的mac—失败,其实一开始是怀着疑问的,从理论分析是可以的,但是还是不行,若只是在二层的话,对方怎么知道这个源mac地址是在不同网段并做过滤?难道发之前,底层进行了隐式arp?但是我发的包里面没有带ip信息啊,同时进行了广播帧的发送接收,还是失败了;应该都是出在接收的环节;也有可能是两个ap使用的协议不同导致编码方式不同从而接收失败
- 考虑到可能是两个路由器编码和使用的协议如一个是802.11n,一个是ac,等,可能导致接收不到,所以可以再尝试使用两个相同的型号的路由器;//待测试
- 发送方普通模式,接收方监听模式,接收方可以收到所有包,所以可以接收到
openwrt开源路由系统,驱动,固件
了解一下。。。
spec:Wireless LAN Medium Access Control
(MAC)
and Physical Layer (PHY) Specifications