Linux--数据链路层(mac&&arp)

目录

1.认识以太网

2.以太网帧格式

3.模拟一次局域网通信(交换机)

[4.认识 MAC 地址](#4.认识 MAC 地址)

[对比理解 MAC 地址和 IP 地址](#对比理解 MAC 地址和 IP 地址)

5.认识MTU

[MTU 对 IP 协议的影响](#MTU 对 IP 协议的影响)

[MTU 对 UDP 协议的影响](#MTU 对 UDP 协议的影响)

[MTU 对于 TCP 协议的影响](#MTU 对于 TCP 协议的影响)

6.ARP协议

[ARP 协议的作用及原理](#ARP 协议的作用及原理)

[ARP 数据报的格式](#ARP 数据报的格式)


1.认识以太网

数据链路层:用于两个设备(同一种数据链路节点(同一局域网))之间进行传递

  • "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
  • 例如以太网中的网线必须使用双绞线; 传输速率有 10M, 100M, 1000M 等;
  • 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN 等;

2.以太网帧格式

以太网的帧格式如下所示:

  • 源地址和目的地址是指网卡的硬件地址(也叫 MAC 地址), 长度是6字节( 48 位),是在网卡出厂时固化的;
  • 帧协议类型字段有三种值,分别对应 IP、 ARP、 RARP;
  • 帧末尾是 CRC 校验码。

6位目标地址,源地址,mac地址就是6字节

1.如何解包?

定长报头:前10字节和后4字节去掉,剩下的就是数据了。

2.如何分用?

类型字段:表示上层是什么协议,这样就能很好的把数据交给上层

3.模拟一次局域网通信(交换机)

下面就是一个局域网,有各种主机,每个主机都有自己的mac地址。在发送数据的时候,(src会带上自己的mac地址,dst是目的机的mac地址,data:发送的数据)会将发送的通过数据网络协议栈变成数据帧,然后通过局域网发送到局域网中,局域网的主机都能收到,主机会通过mac地址判断是不是自己的消息,如果是自己的消息,就会接收处理消息,最终以同样的方式发送回去。这就采用mac地址在局域网中进行通信了。

  • 以太网中, 任何时刻, 只允许一台机器向网络中发送数据
  • 如果有多台同时发送, 会发生数据干扰, 我们称之为数据碰撞
  • 所有发送数据的主机要进行碰撞检测和碰撞避免

如果多个主机在局域网中,是不可避免的。 任何时刻, 只允许一台机器向网络中发送数据,那么在系统观念当中,局域网其实是一种临界资源!如果发送碰撞了就进行检查,重发,以维持这个通信

  • 没有交换机的情况下, 一个以太网就是一个碰撞域
  • 局域网通信的过程中, 主机对收到的报文确认是否是发给自己的, 是通过目标mac 地址判定

如果存在交换机的话,比如第一次发送数据,A向F进行发送,由于交换机是存在两个端口的,那么i0端口就会记录A的mac地址,此时交换机就知道A在i0一侧,但他此时不知道F在哪侧,交换机会把消息转发到i1侧的主机,若此时每台主机都进行了发送消息,那么交换机就会知道每台主机的位置。若此时A向E发送了消息,F向C发送了消息,那么交换机不会把交给E的消息给i1一侧了,交给F的消息也不会被转发给i0一侧了,这样就避免了两台主机的数据碰撞了,因为他们两个的数据在不同的区域内,所以交换机的作用就是划分碰撞域,以提高网络性能和可靠性

4.认识 MAC 地址

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

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

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

对比理解 MAC 地址和 IP 地址

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

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

5.认识MTU

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

• 以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,ARP 数据包的长度不够 46 字节,要在后面补填充位;

• 最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;

• 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU了,则需要对数据包进行分片(fragmentation);

• 不同的数据链路层标准的 MTU 是不同的;

MTU 对 IP 协议的影响

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

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

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

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

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

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

MTU 对 UDP 协议的影响

• 一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP 首部)), 那么就会

在网络层分成多个 IP 数据报.

• 这多个 IP 数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就

意味着, 如果 UDP 数据报在网络层被分片, 整个数据被丢失的概率就大大增加了

MTU 对于 TCP 协议的影响

• TCP 的一个数据报也不能无限大, 还是受制于 MTU. TCP 的单个数据报的最大消息长度, 称为 MSS(Max Segment Size);

• TCP 在建立连接的过程中, 通信双方会进行 MSS 协商.

• 最理想的情况下, MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度

仍然是受制于数据链路层的 MTU).

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

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

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

6.ARP协议

虽然我们在这里介绍 ARP 协议, 但是需要强调, ARP 不是一个单纯的数据链路层的协

议, 而是一个介于数据链路层和网络层之间的协议

ARP 协议的作用及原理

报文要交付给下一跳结点,必须知道下一跳结点的mac地址,因为要封装mac帧;我们可能只知道目标主机的IP地址,并不清楚目标主机的mac地址。因此我们有将IP地址转成mac地址的作用--ARP协议。

  • 在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址;
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
  • 因此在通讯前必须获得目的主机的硬件地址;

主机A是路由器,主机B是该局域网内的一台普通主机

  • 源主机发出 ARP 请求,询问"IP 地址是 192.168.0.1 的主机的硬件地址是多少"并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播);(将数据帧封装好)
  • 目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中;(这是在arp层进行处理的,而不是在mac帧层进行处理的,收到的主机要先看是arp应答还是arp请求再去对比IP地址),等收到主机B的应答后,主机A就知道了主机B的mac地址。主机A既知道主机B的IP地址,又知道主机B的mac地址,此时就能把封装的mac帧交给主机B了,实现正常的通信
  • 每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。 缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。

ARP 数据报的格式

  • 注意到源 MAC 地址、 目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
  • 硬件类型指链路层网络类型,1 为以太网;
  • 协议类型指要转换的地址类型,0x0800 为 IP 地址;
  • 硬件地址长度对于以太网地址为 6 字节;
  • 协议地址长度对于和 IP 地址为 4 字节;
  • op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。
相关推荐
我的运维人生19 分钟前
利用Python与Ansible实现高效网络配置管理
网络·python·ansible·运维开发·技术共享
Dola_Pan1 小时前
Linux文件IO(一)-open使用详解
java·linux·dubbo
Spring-wind2 小时前
【linux】pwd命令
linux
ken_coding2 小时前
Windows11 WSL2的ubuntu 22.04中拉取镜像报错
linux·ubuntu·docker
阳光开朗_大男孩儿2 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
gopher95113 小时前
linux驱动开发-设备树
linux·驱动开发
学习3人组3 小时前
克隆centos网卡uuid相同如何修改
linux·运维·centos
【D'accumulation】3 小时前
配置RHEL和centOS的阿里云镜像源
linux·阿里云·centos
ZhangTao_zata3 小时前
ubuntu安装wordpress(基于LNMP环境)
linux·运维·ubuntu
QDNBD3 小时前
【zookeeper安装】zookeeper安装详细教程(单机/集群部署)(linux版)
linux·zookeeper