Linux网络 | 进入数据链路层,学习相关协议与概念

server/2025/2/5 16:43:02/

        前言:本节内容进入博主讲解的网络层级中的最后一层:数据链路层。 首先博主还是会线代友友们认识一下数据链路层的报文。 然后会带大家重新理解一些概念,比如局域网交换机等等。然后就是ARP协议。 讲完这些, 本节任务就算结束。 那么下面废话不多说,开始我们的学习吧!

        ps:建议友友们先学习上三层在学习本节内容哦! 

目录

认识报文

局域网

局域网通信原理 

如何看待局域网

交换机

MSS和MTU

ARP协议

ARP原理 

谈ARP报头

模拟一次过程 

ARP周边问题 


认识报文

        首先, 数据链路层解决的是:直接相连的主机之间,进行数据交付的问题。  

 

        接下来这里有两个问题:

        1、Mac帧如何做到解包和封装。 2、如何做到分用 

        对于第一个问题,我们mac帧解包采用的是定长报文。所以当我们收到报文时,根据定长的报文将报头和有效载荷进行分离。

        对于第二个何题,如做分用就是根报文里面的一个字段叫做类型,这个类型就是记录了报文的类型,如果是0800,就是数,如果时0806,那么就是ARP请求,如果是8035,那么就是RARP请求。

局域网

局域网通信原理 

 

        每一台主机H1、H2等等都有它的Mac地址Mac1、Mac2、Mac3.....Mac7。

        我们之前说过,就此如老师问小王你为什么没交作业,其实教室里面的人都听到了,只是大部分的人一听目的地址是小王,说明不关自己的事情,就直接把老师说的报文丢弃了。只有小王收到报文后,目的地址是小王,自己也是小王,那么就知道是发给自己的。然后就拿着报文向上交付。所以,局域网通信的过程,其实是有很多吃瓜群众的。

        就比如上面从Mac1发向Mac7的报文。其实Mac1要向局域网内的每一台主机都发送一份这个报文(数据)。但是只有Mac7收到后不会将报文丢弃。

        但是这里就有了一个问题,如果一个局域网内的两个主机都发送数据,假如H1和H3发送数据。那么在底层当中,两台主机发送的数据就一定会发生数据碰撞。并目两台主机能够识别碰撞的信息。检测到了后,就实行碰撞避免算法来保证任何时刻只有一台主句在局域网中发送。

        并且,局域网中,主机数量越务,发生碰撞的概率太大,这也就是为什么我们在人多的地方有时候网会卡顿,因为发生数据碰撞概率大,一旦发生数据碰撞,那么就要实行 碰撞避免算法,就要等一等。

如何看待局域网

         我们可以把局域网看成多台主机所对应的临界资源。

         A主机发送数据,数据从上向下进行交付。在网络层先做决策。当我们做完决策,我们发现我们就是要发给中间的某一个路由器,比如说发给路由器R。这个数据发给路由R的时候,一定是数据链路层先收到。然后去掉CRC和报头,再由数据链路层向上交付给网络层。然后网络层就得到了一个带有IP报头的报文。 然后如果又要将这个数据发向别的路由器。那么就要将IP报文重新向下交付。所以,这个整体的过程就是一个解包然后重新封包的过程。

 

交换机

        随着局域网的主机增多,我们会诞生一种新的网络设备。这种设备叫做交换机。这种交换机的设备是工作在数据链路层的。交换机能够识别到数据碰撞,不会影响另一边。所以,假如我们的左边发生了数据碰撞了,那么我们的右边的数据正常转发没有问题。

        一般情况下,就是交换机左侧的报文不会发送到右侧,就能减少右侧的报文数量。就不容易发生数据碰撞。所以,综上,交换机有一个特点:划分碰撞域,减少局域网碰撞。

MSS和MTU

        正因为数据顿最多字节就是1500, 那么就倒逼着网络层最多发送1500字节的数据,网络层就要分片。 又因为分片不太好, 所以就要尽可能减少分片。

        所以如何减少分片呢? 就是规定TCP最多发送多少个字节!那么发送多少, 首先数据最多1500,说明IP报文最多能有1500个字节。然后要知道TCP发送过来的报文是在IP报文的有效载荷部分。IP报头20字节,那么TCP报头加有效载荷就不能超过1480个字节。 TCP的报头加有效载荷是哪里来的? TCP内部有一个流式缓冲区。 倒时候我们就是从流式缓冲区中拿数据。拿多少? TCP的报头加有效载荷为1480,那么有效载荷最多1460。 所以拿1460个字节最多。这个1460就是我们的MSS。这就是为什么当中我们的滑动窗口中要一段一段的滑动。

        上面的这个数据帧对多就是1500,这个1500,就是MTU。

ARP协议

        我们在学习IP的时候其实就已经知道了,所谓了数据发送到目标网络,本质就是通过无数个连续的子网实现的。我们也学过了,其实我们发送到报文在子网中进行跳跃的时候跳到一个路由器上面就要先解包向上交付到网络层。然后检查dst和src。如果不是的话,再封包向下交付到数据链路层,然后进行跳转。就是下面这个过程:

         问题是,如果我们的路由器向上交付后,在网络层发现dst IP就是在自己的局域网中。那么路由器就要重新封装mac顿交给目标主机了。

        可是,路由器怎么知道我们的目标主机的mac地址的呢?所以,此时在局域网当中,还要有一种协议:ARP(工作在数据链路层,局域网当中)  。ARP协议的作用是,在局域网中,将目标主机的IP地址,转化为mac地址。

        下面是一种局域网

        下面是一个IP报文,从A发来的,目的主机是B。

 

        如何将目标主机内的IP地址转化为mac地址呢?

ARP原理 

        加入上面是主机A和主机B的IP和MAC地址。 如果是主机A想要向主机B发送数据。开始主机A是先进行广播。就是广播说我想要与IP地址170.20.1.2进行通信,我的IP地址是170.20.1.1,MACA。IP地址为170.20.1.2的主机,MAC地址是多少?这个广播就是一次ARP请求。

        然后主机B就收到了这个ARP请求。然后就返回一个ARP响应包: 170.20.1.2的MAC地址是XXX。

谈ARP报头

        下面是ARP报头以及其中的各个字段: 

  •         硬件类型指的是网络类型。这个固定写法为1,为以太网。
  •         协议类型:指要转化的地址类型, 0x0800为IP地址。
  •         硬件地址长度对于以太网地址长度是6
  •         协议地址长度对于IP地址为4字节
  •         OP字段为1,表示ARP请求。OP字段为2表示ARP应答
  •         发送端和目的就是我们的路由器和目标主机。 

模拟一次过程 

         此时入口路由收到了一个报文:

 

        因为我们的中转路由要将报文发给主机B。但是他只知道主机B的IP地址,不知道MAC地址,那么怎么办呢。所以中转路由就要发起ARP请求了。 ARP请求报文格式如下。先不填写Mac帧:

        怎么填这个报文呢?

  •         硬件类型填1,表示以太网。
  •         协议类型是IP地址转化为MAC地址。所以填0800
  •         硬件长度就是6,协议地址长度就是4。
  •         然后OP字段是1。
  •         发送端的以太网地址是谁呢? 就是MACR。
  •         发送端的IP地址就是IPR。
  •         目的以太网地址不知道,所以就是全F。
  •         目的IP就是IP B。

         然后添加Mac帧

        添加好MAC顺之后就发送向局域网了,然后局域网当中的每一合主机都受到了这个报文、所以每合主机都要处理,如果不是B主机。那么就是收到这个报文解包并处理。先进行MAC的解包。然后发现报头的目的以太网地是全F,所以A就要处理2这个报文,然后又看帧类型,是0806,说明就是ARP请求,所以这个主机就要把数据帧向上交付给上层,也就是ARP软件层。然后ARP软件层就查看目的IP地址,是IP B,不是自己。就把这个报文丢弃了。

        但是这里有一个问题,任何一个主机,既可以收到ARP清求,也可以收到ARP应答。我怎么知道我这个收到的应答就是我刚刚发过去的请求的应答呢。所以,就要先看一下OP。如果OP是1就是个请求。如果是2就是应答。

        如果是主机B,主机B收到后发现就是发给自己的。那么就要应答了。应答的时候,OP字段就不能是1了, OP要变成2。发送方和目的也要调换一下了。

        然后就把应答报文发到以太网中。路由就发现这个报文是发给我的。然后就能拿到主机B的MAC地址了。这里要注意的是,在ARP的过程中,收到的任何ARP报文,都是先看OP!!!OP决定了什么呢??OP决定了ARP的类型: 请求或者应答。如果是请求,我们看的是目的MAC地址和目的IP。如果是应答,我们看的是发送端的MAC地址和发送端的IP。看看这两个是否相等。

ARP周边问题 

        arp,主机的Mac地址和IP地址都是数据,会被主机缓存起来 (临时缓存)可以使用arp-a查看: 

1、arp不是每次都要做的,因为它已经被缓存了。 arp只有在缓存失效的时候,才会进行.

2、我可以通过我的IP和子网掩码,得到我的网络号,然后拼接IP地址, ping所有的主机。得到所有主机的IP和mac。

3 、如果我收到多次同样的arp应答,我会以最新的为准。这就导致了一个问题——基于ARP的称为中间人方式。 如下:

        上面这种中间主机定向的向目标主机发送大量的arp,构建出虚假的IP地址和Mac地所对应的映射关系。以后所有的报文都会转发给这个主机。这种技术,叫做arp欺骗。

        如果以后,中间主机不再丢弃了,而是将数据发给路由器。以后路由器返回数据也会返回给中间主机。然后由中间主机发给原本的主机。以后,原本主机和路由器都不知道中间主机的存在,这台中间主机就成功地成为了一台局域网当中的中间人机器。 这种方式,叫做基于arp的称为中间人的方式

 ——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!    


http://www.ppmy.cn/server/165182.html

相关文章

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户登录

🧸安清h:个人主页 🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯1.登录-持久层 &…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】3.1 NumPy图像大小调整实战

3.1 NumPy图像大小调整实战 目录 #mermaid-svg-uDg4hyooC74c0r2r {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uDg4hyooC74c0r2r .error-icon{fill:#552222;}#mermaid-svg-uDg4hyooC74c0r2r .error-text{fill:#5…

C++【iostream】数据库的部分函数功能介绍

在 C 编程世界中,iostream 库扮演着举足轻重的角色,它是 C 标准库的核心组成部分,为程序提供了强大的输入输出功能。无论是简单的控制台交互,还是复杂的文件操作,iostream 库都能提供便捷高效的解决方案。本文将深入剖…

Docker小游戏 | 使用Docker部署跳一跳经典小游戏

Docker小游戏 | 使用Docker部署跳一跳经典小游戏 前言一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、创建httpd容器下载镜像创建容器检查容器状态检查服务端口四、部署小游戏项目拉取项目源码重启容器安全设置五、访问跳一跳经典…

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么? 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…

Image Resize:强大的在线图像处理工具

Image Resize 是一款免费的在线批量图像处理工具,让你轻松调整图像大小、裁剪、压缩,支持多种格式。 批量处理:一次编辑多个图像,提高工作效率。多种格式支持:支持PNG、JPG等多种常见图像格式,满足不同需求…

Codeforces Round 1002 (Div. 2)(部分题解)

补题链接 A. Milya and Two Arrays 思路&#xff1a;题意还是比较好理解&#xff0c;分析的话我加了一点猜的成分&#xff0c;对a&#xff0c;b数组的种类和相加小于4就不行&#xff0c;蒋老师的乘完后小于等于2也合理。 AC代码&#xff1a; #include <bits/stdc.h> u…

【CPP】迭代器失效问题 static和inline

文章目录 迭代器失效**常见的迭代器失效场景**1. **std::vector**2. **std::deque**3. **std::list**4. **std::map / std::set**5. **std::unordered_map / std::unordered_set** **总结&#xff1a;迭代器失效场景****如何避免迭代器失效&#xff1f;** static 和 inline1. s…