0
点赞
收藏
分享

微信扫一扫

MAC协议原理与ARP协议(八千字长文详解)

MAC协议原理

数据链路层

Quicker_20231030_204532_result

现在我们知道主机B的报文经过路径选择后,可以将报文交给主机C!

我们上面说过IP提供的能力是将B主机报文跨网络送到C主机的能力!——现在我们知道跨网络将报文送到的能力是通过==目的IP+子网划分+路由(路径选择)==来达成的!

但是我们想要将数据从主机B到主机C的前提是——我们要能将数据交付给和我们直接相连我们下一跳路由器!而路由器也要将数据交付给和路由器直接相连的下一跳的设备!循环往复这个过程!——==所以我们将数据从主机B到主机C,我们要先解决的是如何将数据交给直接相连的下一个节点!(从主机B到路由器F)==

而这就要保证主机B和路由器F是同一个网段(局域网内)的!而路由器F到路由器G也是要处于同一个网段!

==所以跨网络传输的本质是由无数个局域网(子网)转发的结果!==

==我们想要彻底理解跨网络转发!首先就要理解,局域网中报文跨网络转发的原理!==

什么是以太网

"以太网" 不是一种具体的网络, 而是一种技术标准;

既包含了数据链路层的内容, 也包含了一些物理层的 内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

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

以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

==那么局域网转发原理是什么呢?==

以太网帧格式(协议格式)

在局域网通信的时候,数据报到了IP层,IP经过路由转发,发现他要去的路由主机要转发到局域网中的入口/出口路由器当中!所以就要重新封装MAC帧

要封装MAC帧就要将IP重新交付给它的下一层协议以太网!遵守的协议就是MAC帧

所以就要进行IP报文封装MAC——所以我们接下来就要了解一下MAC帧的报头格式!

Quicker_20231106_095518_result

image-20231106100440282

==这个数据就是上层交付下来的IP报文!——包含了IP报头和有效载荷!==

==然后前面的目的地址和源地址,类型,以及后面的CRC都是属于以太网报头!==

==那么如何进行报头和有效载荷分离呢?==

基于协议的局域网转发的原理

上面我们用一个生活例子来说明了局域网的转发原理!

那么实际上局域网的转发流程是怎么样的呢?两个主机是如何通信的呢?

image-20231106105219128

==所以以太网的通信原则是非常简单的!——它的信息是会被所有主机都接收到的!但是主机会将不是自己的报文丢弃!是自己的才会向上交付!==

==总结——局域网中所有的主机其实都能收到对应的mac报文,只不过大部分主机在自己的数据链路层通过对比数据帧中的目标mac地址和自己的mac地址是否相等,来决策要不要在进行后续处理!==

所以在局域网中,网卡有一种模式:混杂模式,不放弃任何数据帧,直接向上交付,这也是绝大部分局域网抓包工具的原理!——就是修改网卡的工作模式为混杂模式!因为本质我们都是能收到的!(所以我们说http协议是不安全的!因为在任意的一个节点中只要设置为混杂模式就能抓到使用http协议发出来的数据包)

==刚刚的情况是m1和m8独自的在网络中发送!——那么在m1发送的时候么m2,m3,m4...可以一起发送吗?==

就好比在一间教师里面,小明和小红在对话,那么小刘和小张能不能同时对话呢?——当然可以!因为教师就是一个共享的环境!但是这样子教师肯定是乱糟糟的!十分的吵闹,什么声音都有!

==上面的情况在网络通信也是会出现的!——但是这样子会出现很严重的数据干扰!在计算机里面也叫做数据碰撞!==

换句话说m1发消息的时候,m2,m3m4也可以同时向局域网里面发消息啊!而我们发送的消息,在计算机里面都是光电信号!就是一些数字和模拟信号

或者也可以理解是一些波形图!当多个波同时在一起的时候,就会互相干扰了!分不清楚谁是谁了!

==所以为了避免这样的问题——任何时刻只能有一个主机发送消息!==

但是每个主机都是独立的!又应该如何管得住这些主机呢?

管不住的!——但是因为彼此都是使用的是同一个数据链路层协议!虽然主机间无法阻止,当我在发消息的时候,你也在发消息这件事的发送!==但是可以进行检测==

==如果多个消息被同时发送,会导致局域网中的数据发送碰撞!那么这个数据就变成了无效数据!==

那么如何知道发送碰撞呢?——很简单因为一台主机发送的数据,主机本身也是能收到的!(就像是你自己说话,你也能听到),当发现收到的数据是不一样的时候,那不就是发送碰撞了吗?

==所以一个局域网,也叫做一个碰撞域==

那么如何保证任何时候,只能有一个主机发送消息呢?

不同的局域网有不同的解决方案!——其中有个叫做==令牌环!==

对比MAC地址和IP地址

==IP地址描述的是路途总体的 起点 和 终点==;

==MAC地址描述的是路途上的每一个区间的起点和终点;==

MTU介绍

MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制

MTU对IP协议的影响

由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.

1.将较大的IP包分成多个小包, 并给每个小包打上标签;

2.每个小包IP协议头的 16位标识(id) 都是相同的;

3.每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最 后一个小包, 是的话置为1, 否则置为0);

4.到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;

5.一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;

image-20231107105508066

==现在有一个问题——分片问题是不是只会由发送端主机来分片?路上的其他节点也会不会对数据进行分片呢?有可能!路上的路由器也可能发生分片!因为大家都用的是TCP/IP协议!所以都是具有分片的能力的!==

为什么会发生这种情况呢?——因为有可能主机的MTU是1500,而路由器的MTU是500,每个设备的MTU不一定是一致的!每个设备都会有自己MTU的规定

如下图

image-20231107112021109

MTU对UDP协议的影响

1.一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.

2.这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在 网络层被分片, 整个数据被丢失的概率就大大增加了.

MTU对于TCP协议的影响

1.TCP的一个数据报也不能无限大, 还是受制于MTU.

2.TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);

3.TCP在建立连接的过程中, 通信双方会进行MSS协商. 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU).

4.双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.

5.然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.

6.MSS的值就是==在TCP首部的40字节变长选项中(kind=2)==

使用指令查看MTU

使用ifconfig命令,即可查看ip地址,mac地址,和MTU;

image-20231107105142248

ARP协议

xXFCwzOQqASE5cI

==为了完成这个认识的过程!——所以我们就必须要有一个新的协议!就是ARP协议!==

否则路由器只知道目标主机的IP地址但是不知道目标主机的MAC地址也是无法传输!

虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议(因为ARP都认识IP了!所以就不仅仅是单纯的是数据链路层了!);

ARP协议的作用

1.在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;

2.数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;

3.因此在通讯前必须获得目的主机的硬件地址;

ARP协议的原理

我们用一个例子来说明

ARP数据报的格式

image-20231107172631948

==ARP协议是在MAC帧的上层的!==

image-20231107212942694

==所以我们可以看到,MAC帧协议的有效载荷里面也可以存放ARP的请求和应答!对应的类型是0806==

Quicker_20231107_213400_result

==我们可以从这个图中也可以看出来!进入以太网后既可以走IP协议,也可以走ARP协议== image-20231107215405903

==再了ARP请求的结构后我们可以实际演示一下==

image-20231108214340105

ARP请求和响应,不止会发生在进入目标主机的子网的入口路由器里面!==但凡是一个路由器从一个子网传输数据到另一个子网的时候,都有可能会发送ARP请求来请求另一个子网的下的某个主机的MAC地址!==路由器和路由器之间也可以发起ARP请求!

一个局域网本身是不大的!——只要有子网掩码!那么我们就可以将子网内的所有IP地址构建出来!例如(255.255.255.0,ip是196.168.3——那么局域网内的范围就是192.168.3.1——192.168.3.254),那么路由器就可以简单粗暴对所有主机发起ARP请求!那么路由器就可以获取这局域网内的所有主机MAC地址和IP地址!——这样就可以在路由器中获取所有主机的情况!

因为有ARP的存在!所有路由器之间可以互相发彼此!就可以通过结合IP地址,来构建出一个更详细的,网络转发的路由表结构!

难道每一次我们就要发起ARP请求么?——刚刚结束,发送给主机C的数据!现在又来了一个新的数据要发送给主机C,路由器是不是又要发送一个ARP请求呢?==不是!ARP的结果是会暂时缓存起来的!第一次不认识!第二次如果很快就来了!就可以直接查缓存表!找到MAC地址发送就行了!==

为什么要清理掉呢?——因为在局域网中IP是会变的!有可能机器上一次接入的IP是192.168.3.1

下一次接入就是192.168.3.111——那么MAC地址和IP的映射关系就发生改变了!所以ARP的缓存是会失效的!

而且如果有点设备想要换网卡!那么MAC地址就发生改变了!

如果是一个永久的表!映射关系永久不变!一个IP就对应了一个MAC那么这就会导致换了网卡后就永远上不了网了!

Quicker_20231107_212156_result

arp缓存是会定期更新的!那么当==收到来自同一个主机的多个arp报文响应==的时候!arp收到应答的时候,会以最新的为主!只记录最新的!

==那么假如出现了如下的情况==

总结

源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网 段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);

目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自 己的硬件地址填写在应答包中;

每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如 果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址

image-20231107212756059

RARP

如果有一种情况就是我们知道MAC地址,但是不知道IP地址的时候,这种情况存在但是这种情况很少见!

比如:我是一个管理员,内网就是我搭建的!我知道路由器的MAC地址!但是发现数据报转发不出去!想要调试一下!但是我们此时不知道路由器的IP地址!那么此时我们就可以使用RARP(Reverse ARP——逆地址解析),来获取这个IP地址!

==这个过程比ARP过程更加简单!因为ARP我们是不知道MAC地址,所以才需要广播!但是此时我们知道MAC地址只需要,直接封装MAC帧然后请求获取!然后接收方在RARP层里面解包分用,然后将IP地址填入RARP响应发出去即可!==

ARP欺骗

image-20231109111813870

==所以我们有了各种的加密和证书,保证哪怕你拿到了也无法解密!修改了就会被发现!==

==而且如果我们主机3不对报文进行转发!还会导致主机1无法上网!因为主机1找不到路由器了!==

==那么我们如何知道一个局域网下面的设备的MAC地址呢?==

举报

相关推荐

ARP协议与DNS协议详解

0 条评论