【Linux网络与网络编程】11.数据链路层mac帧协议&&ARP协议

前面在介绍网络层时我们提出来过一个问题:主机是怎么把数据交给路由器的?那里我们说这是由数据链路层来做的。

网络上的报文在物理结构上是以mac帧的形式流动的,但在逻辑上是以IP流动的,IP的流动是需要mac帧支持的。

数据链路层解决的是相邻节点间的通信问题。

1. 以太网

1.1 认识以太网

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

1.2 以太网的帧格式

报头各部分的功能:

• **源地址和目的地址:**指网卡的硬件地址(mac 地址)

• **类型:**该字段有三种值,分别对应 IP、ARP、RARP

• **CRC:**校验码
关于mac地址

mac 地址用来识别数据链路层中相连的节点,它的长度为 48 位( 6 个字节),一般用 16 进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)。它在网卡出厂时就确定了,不能修改。

mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址,可能会冲突;也有些网卡支持用户配置 mac 地址)。

2. MTU

2.1 认识MTU

MTU 相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层产生的限制。 以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,若 ARP 数据包的长度不够 46 字节就要在后面补填充位。**最大值 1500 称为以太网的最大传输单元(MTU),**不同的网络类型有不同的MTU。如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU 则需要对数据包进行分片。

我们可以通过ifconfig 命令查看 ip 地址、mac 地址和 MTU。

2.2 MTU对IP协议的影响

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

2.3 MTU对UDP协议的影响

一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP 首部)) 那么就会在网络层分成多个 IP 数据报。这多个 IP 数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着:如果 UDP 数据报在网络层被分片,整个数据被丢失的概率就大大增加了。

2.4 MTU对TCP协议的影响

TCP 的一个数据报也不能无限大,还是受制于 MTU。TCP 的单个数据报的最大消息长度为 1460(1500 - 20(IP首部) - 20(TCP首部)),称为 MSS(Max Segment Size)。 TCP 在建立连接的过程中,通信双方会进行 MSS 协商。最理想的情况下就是MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)。

双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值,然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS。MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind = 2)。

MSS和MTU的关系:

3. 局域网通信原理和交换机

3.1 局域网通信原理示意图

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

如果碰撞了,涉及的主机该怎么办呢?

两台主机都会休眠一下,然后将数据重发(数据链路层也有重发机制)。

在没有交换机的情况下,一个局域网就是一个碰撞域

从系统的角度来看,局域网就是一个临界资源,碰撞检测和碰撞避免就是保护临界资源,使得任何时刻都只有一台主机发送消息的策略和机制。

所以在一个局域网(碰撞域)中主机自然是越少越好,如果主机过多就要引入交换机了。

3.2 交换机

交换机的核心问题就是通过对局域网中的mac帧进行分析,从而划分碰撞域。

4. APR协议

曾经在介绍网络层时说到过,数据转发的时候用到的是IP地址,但是在局域网通信时我们使用的可是mac地址啊,所以这也就注定需要在局域网中提供一种将IP地址转化为mac地址的能力------ARP协议。

4.1 基本原理

源主机发出 ARP 请求,询问 "IP 地址是 192.168.0.1 的主机的硬件地址是多少",并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播)。目的主机接收到广播的 ARP 请求后若发现其中的 IP 地址与本机相符,则将自己的硬件地址填写在应答包中,并发送 ARP 应答数据包给源主机。

总结来说就是:先广播,后单发。

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

cpp 复制代码
C:\Users\caryo>arp -a

接口: 172.18.154.182 --- 0xe
  Internet 地址         物理地址              类型
  169.254.169.254       cc-d8-1f-28-db-2f     动态
  172.18.145.119        ac-19-8e-6c-c5-8c     动态
  172.18.148.251        ac-50-de-88-fa-45     动态
  172.18.150.140        64-d6-9a-9a-37-1f     动态
  172.18.152.44         c4-d0-e3-64-de-35     动态

4.2 ARP协议报头

可以看出ARP协议是 mac 帧协议的上层协议,但是也属于数据链路层。

报头各部分的功能:

• **硬件类型:**指链路层网络类型,1 为以太网

• **协议类型:**指要转换的地址类型,0x0800 为 IP 地址

• **硬件地址长度:**对于以太网地址为 6 字节

• **协议地址长度:**对于和 IP 地址为 4 字节

• **op 字段:**为 1 表示 ARP 请求,为 2 表示 ARP 应答

4.3 ARP的具体过程

如果路由器知道IP对应的MAC地址,那就可以直接发送,如果不知道,就要使用ARP协议获取目的MAC。

主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。目的MAC地址为全F(FF:FF:FF:FF:FF:FF)。局域网内的所有主机都会收到这个ARP请求,网卡识别目的MAC地址为全F,广播数据,需要向上交付,再根据帧类型识别是ARP请求/响应。所以向上交付给ARP协议。**ARP协议 先看op字段,如果为ARP请求,再看目的IP地址,除目的主机外,其他主机发现不是给自己的,就在ARP层丢弃报文。**如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。

相关推荐
风行無痕9 分钟前
Ubuntu Linux系统配置账号无密码sudo
linux·服务器·ubuntu
驱动小百科1 小时前
WiFi出现感叹号上不了网怎么办 轻松恢复网络
网络·智能路由器·wifi出现感叹号怎么解决·wifi无法上网·电脑wifi
好多知识都想学1 小时前
协议路由与路由协议
网络·智能路由器
爆农1 小时前
centos搭建dokcer和vulhub
linux·运维·centos
SZ1701102311 小时前
中继器的作用
服务器·网络·智能路由器
chenxy021 小时前
如何快速分享服务器上的文件
运维·服务器
重启就好2 小时前
【Ansible】模块详解
linux·服务器·ansible
o0o_-_2 小时前
【瞎折腾/mi50 32G/ubuntu】mi50显卡ubuntu运行大模型开坑(三)安装风扇并且控制转速
linux·运维·ubuntu
Huazzi.2 小时前
Ubuntu 22虚拟机【网络故障】快速解决指南
linux·网络·学习·ubuntu·bash·编程
熙曦Sakura2 小时前
【Linux网络】HTTP
linux·网络·http