以下是来自湖科大
计算机网络
公开课的笔记
当多个主机连接在同一个广播信道上,每个主机都必须有一个唯一的标识,即一个数据链路层地址。(点对点的信道就不需要了,一个信道上只有两个主机)
每个主机发送的帧中必须携带表示发送主机和接收主机的地址。由于这类地址是用于媒体接入控制MAC(Media Acess Control),因此这类地址被称为MAC地址。
媒体接入控制基本概念: 多个主机连在一根同轴电缆上,它们共享这根传输媒体,形成了一个总线型的局域网,如下图,显然共享信道需要解决,如何协调多个发送和接收站点对一个共享传输媒体的占用,即媒体接入控制MAC(Medium
Access Control):可以静态划分信道(把这根物理电缆划分成不同的信道,频分多址,时分多址,码分多址——这些前面物理层也有讲)
也可以动态接入控制(受控接入弃用了,主要是随机接入——有线局域网的CSMA/CD协议,无线局域网的CSMA/CA协议,主要是解决碰撞冲突问题)
MAC地址一般固化在网卡(网络适配器)的电可擦可编程只读存储器EEPROM中,因此MAC地址也被称为硬件地址。如图:
(1)虽然MAC地址有时会被称为物理地址,但这并不意味着MAC地址属于网络体系结构中的物理层!
(2)严格来说,MAC地址是对网络上各接口的唯一标识,而不是对网络上各设备的唯一标识:
一般情况下,用户主机会包含两个网络适配器:有线局域网适配器(有线网卡)和无线局域网适配器(无线网卡)。每个网路适配器都有一个全球唯一的MAC地址。而交换机和路由器往往拥有更多的网络接口,所以会拥有更多的MAC地址。
总共6个字节,48个比特,所以也叫扩展的唯一标识符EUI-48——MAC地址共有2的48次方个,二百八十多万亿,现在鼓励用EUI64替代,怕用完
MAC的标准标识方法是将每4个比特写成一个十六进制的字符,这样就一共有12个字符,每两个字符分成一组,共6组
在Windows系统中组与组之间用短线连接(也是标准表示),如上图,00-0C-CF-93-8C-92
在Linux、IOS、安卓系统中用冒号连接,如 00:0C:CF:93:8C:92
还可以每四个字符之间用.连接,如:000C.CF93.8C92
回到6字节48位的MAC地址。
MAC地址第一字节的b0位取0时,表示该地址是单播地址,取1时,表示该地址是多播地址;
第一字节的b1位取0时,表示该地址是全球管理的,即全球唯一的,取1时表示是本地管理的;
b0、b1两位就能分成四种MAC地址:
本地管理的单播地址由网络管理员分配,优先级高,会覆盖网路接口的全球管理单播地址。
注意,在b0、b1也是1,即本地管理的多播地址时,如果剩下的那46位(总共6字节,48位)也全为1,此时48位全为1,那MAC地址就是广播地址
16进制表示是FF-FF-FF-FF-FF-FF;
单播:某主机发送数据,数据帧的前面是目的MAC地址,然后是发送源地址(下面也是一样),各主机收到帧后发现目的地址不是自己就丢弃,是就接收数据。
广播:如果某主机发送的帧的目的地址字段是广播地址FF-FF-FF-FF-FF-FF,那总线上其它主机匹配时发现是广播帧,就都会接收该数据帧。
**多播:**从标准MAC地址快速判断是否是多播帧的方法就是,查看第一个十六进制数能不能整除2,如07就不能:
假设主机BCD支持多播,那各用户给自己主机就配置了多播组列表,各主机收到数据会查看自己的多播组列表中有没有这个目标地址,有就接收数据,没有就丢弃:
注意,给自己主机配置多播组列表进行私有应用时,不得使用公有的标准多播地址,可以在IEEE标准网查询
字节发送顺序:第一字节、第二字节…第六字节
字节内的比特发送顺序:b0、b1、b2…b7
补充:现在的很多设备,IOS系列,Windows10,安卓6.0,Linux3.18等都有随机MAC地址技术,防止被追踪MAC地址追踪技术跟踪
在数据链路层这里介绍网络层的IP地址主要是MAC地址和IP地址有一定关系,这里主要是介绍IP地址作用,后面在网路层会更详细的介绍
IP地址是英特网上的主机和路由器所用的地址,用于标识两部分信息:
①网络编号:区分英特网是哪个数以百万计的网络
②主机编号:标识同一个网络上不同主机(或路由器各接口)
显然,MAC地址不具备区分不同网络的功能,他只能区分同一个子网下的不同主机。所以主机只要想接入英特网,则IP地址和MAC地址都需要使用。
看以下数据传输过程中,IP地址和MAC地址的区别,可以看到,源IP地址和目的地IP地址一直没变,都是IP1和IP2(因为用户只需要知道目的IP地址是谁,具体怎么传应该由下层负责),而MAC地址却是阶段性的,中间是填路由器的MAC地址,发送源和目的地的MAC地址随路由器而变。
因为实际上,主机H1知道要把数据包传给路由器R1,他也知道路由器R1相应接口的的IP地址,但是不知道R1的MAC地址,所以需要在链路层的数据帧中写上对方的MAC地址,同样的,R1也知道R2的IP地址而不知道MAC地址,R2对主机H2也是。
而如何从IP地址解析出MAC地址,需要用到地址解析协议ARP
要知道,在上面情况中,如果不知道对方的MAC地址,那数据链路层无法构建MAC帧,数据也就不能进一步封装了!
每台主机都有一个ARP高速缓存表,这个缓存表记录之前通信过的设备的IP地址和MAC地址的对应关系
B的ARP高速缓存表中,有A的IP地址和MAC地址对应关系(第一行),但是没有C的,而我们的B要将数据发给C。
B会发送广播,来请求到C的MAC地址:
当然具体格式不是这样的。而且,ARP请求报文被封装在MAC帧中发送,目的地址?——就是广播地址!
总线上其它主机收到广播帧后,比如主机A的网卡收到,它交给上层处理,上层专门的ARP解析进程解析后发现,该报文中请求的IP地址不是自己的,就不予理会。
主机C收到,解析,发现要找的就是自己:
首先将B的地址和MAC地址记录到自己的ARP高速缓存表中;——先收藏进ARP缓存表再说哈哈哈——因为发送的时候是先查主机的ARP缓存表找到对方的MAC地址再发送
然后给主机B发送ARP响应,并告知自己的MAC地址。——目的地址是主机B的MAC地址,单播帧
响应报文如下:
虽然是单播帧,总线上的主机都能收到(毕竟是总线,没有经过路由器),A收到发现目的地址不是自己,就丢弃该帧。B收到后则是将其放入ARP高速缓存表中,
然后B就能给C发送数据了。
ARP高速缓存表中的记录分动态和静态两种类型(上面有图)。
动态:是主机自动获取到的,生命周期默认为2分钟——比如B获取到C的IP和MAC记录就是。过了两分钟就删除缓存了。因为IP地址和MAC地址的对应关系不 是固定的,主机网卡坏了,更换后MAC地址也变了而IP地址没变
静态:是网络维护人员或者有用户手工设置,不同操作系统下生命周期不同,比如有的系统重启后不存在了,有的重启依然有效
1. 先查ARP高速缓存表
2. 没有就发送请求报文,广播
(主机先看这个目的IP地址和自己是不是一个网络号,是的话说明在一个局域网内,先查自己的ARP高速缓存表,查不到就广播;如果不是一个局域网内,那查自己的高速缓存表,一般会有下一个路由器的MAC地址,这样路由器就发送广播)
ARP只能在一个链路或一个局域网络上使用,上面的例子中就是总线连接各主机之间可以通过广播获取MAC地址
下图就不行了:
那为啥第二部分说有IP地址就可以从主机H1送到主机H2?
因为是一段一段链路上使用的ARP呀!
所以第二部分的例子就是H1知道R1的IP地址(因为主机本身就是由路由器对外连接的,一个主机连一个路由器)然后通过ARP协议获取到R1的MAC地址,然后发给R1(主机H1和R1是在同一个网络上的),而路由器和路由器之间也有一个ARP高速缓存表,就这样一段一段找到了主机H2!