数据链路层

数据链路层(Data Link Layer)是 TCP/IP 五层模型的第 2 层(对应 OSI 七层模型的第 2 层),介于物理层和网络层之间,核心作用是 将物理层的原始信号封装成可传输的 "帧",并解决相邻节点间的可靠通信问题

也就是说数据链路层解决同一个子网里的通信。

以太网

以太网既是一种网络技术标准,也是数据链路层的核心协议,更准确地说,我们常说的以太网协议(IEEE 802.3) 是数据链路层 + 物理层的复合标准,其中数据链路层的定义是其核心。

我们来看看以太网帧的格式:

这里目的地址和源地址就是MAC地址。

类型是用来分清上层协议的。

CRC 是 "循环冗余校验码"(Cyclic Redundancy Check),也是用来检验数据正确性的。

也就是说以太网帧通过固定的报头长度来实现报头和有效载荷分离;

通过类型来实现分用。

以太网帧最常见的上层协议就是IPv4,类型会填0800:

除此之外,还有ARP和RARP等上层协议:

这里PAD是填充字段:

以太网帧的数据字段长度要求是 46~1500 字节(太短会导致传输效率低),而 ARP 请求 / 应答本身只有 28 字节,所以需要加PAD(填充字段)补到 46 字节,保证帧结构合法。

以太网帧的有效载荷(数据字段)设置 46 字节的最小限制,核心是为了适配早期以太网的 CSMA/CD(载波监听多路访问 / 冲突检测)机制,保证冲突能被正确检测,同时兼顾传输效率。

除此之外,上层协议如果是ipv6,类型就是86DD。

MAC地址

  • MAC地址用来识别数据链路层中相连的节点;
  • 长度为48位,及6个字节.一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
  • 在网卡出厂时就确定了,不能修改.mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址)

MTU

注意到我们以太网帧的有效载荷大小上限是1500,其实这就是MTU。

MTU(Maximum Transmission Unit,最大传输单元)指网络通信中单次数据传输允许的最大数据包大小,单位为字节(Byte)。不同网络协议或物理介质对 MTU 的限制不同,例如以太网的默认 MTU 为 1500 字节。

我们在IP部分就已经谈过MTU对上层协议的影响。有了MTU的限制,IP不得不对报文大小超过MTU的报文进行分片。这会导致报文丢失的概率增加。因此为了避免分片TCP又有着MSS的规定:

MSS(Maximum Segment Size)指TCP协议中单次传输数据的最大分段大小,用于避免IP层分片。通常在TCP三次握手阶段协商,默认值为1460字节(基于以太网MTU 1500字节减去IP和TCP头部40字节)。

一次发送的报文大小不超过MSS就能避免报文在下层分片。

MTU对上层如此不便为什么要这么规定呢?

其实回顾我们刚进入网络世界

那时候提到了,同一个局域网里通信时。

不同主机发送报文会互相影响,发生碰撞。碰撞之后就要休眠一段时间再发送。因此碰撞会影响发送报文的效率。

报文越大,发送的时间越长,越容易发生碰撞。因此规定一个发送帧的上限大小,本质也是为了减少发生碰撞的概率,这样反而能提高效率。

输入ifconfig指令能查看本主机的MTU大小:

交换机

我们以前常说网络通信里会用到交换机和路由,事实上我们一直分不清这两者的区别,现在来明确一下。

首先我要介绍一下碰撞域的概念:

碰撞域(Collision Domain)是指在网络通信中,所有可能发生数据帧冲突(碰撞)的设备集合。当多个设备同时发送数据时,若共享同一传输介质(如以太网总线或集线器连接的设备),数据帧会相互干扰,导致碰撞。碰撞域的范围决定了网络性能,因为碰撞会降低有效带宽。

我一开始说一个以太网是一个碰撞域,这在以前是正确的,现在随着交换机的发展就不太准确了。

因为我们的交换机会分割碰撞域。

首先我们在一个以太网中接入一个交换机,交换机有两个端口,连接不同的主机:

一开始交换机不清楚当前局域网情况,当A向C发送报文时:

这时候交换机也不知道C在哪,因此当交换机收到A的报文时,也会将报文交给右边的区域。这时候以太网还是在同一个碰撞域。

但是交换机可以很确定,主机A一定在左边。

工作一段时间后,交换机就能摸清当前局域网的主机分布情况:

这时候A向B发送报文,交换机就会知道A、B都在左边,因此不会将报文交给右边。这时候不会影响右边D向E通信。

所以交换机就将以太网分成了两个碰撞域。

所以,交换机作用在同一个子网通信。路由器则是连接不同的子网。

ARP

虽然我们在这里介绍ARP协议,但是需要强调,ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。

还记得我们写的套接字编程吗。里面写的从来没有目的MAC地址。那么我们怎么知道对方MAC地址呢?

这里就到了ARP协议登场了:

ARP协议建立了主机IP地址和MAC地址的映射关系

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

ARP协议的工作流程

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

    这就是IP部分提到的广播地址:

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

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

如此我们才能知道对方的MAC地址,然后再继续IP报文发送。

我们再来看看ARP的报文格式:

下边就是ARP报文格式:

  • 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
  • 硬件类型指链路层网络类型,1为以太网
  • 协议类型指要转换的地址类型,0x0800为IP地址
  • 硬件地址长度对于以太网地址为6字节
  • 协议地址长度对于和IP地址为4字节
  • op字段为1表示ARP请求,op字段为2表示ARP应答

很显然,当同一个局域网里所有主机收到ARP报文都会进行处理。收到IP报文则不一定会处理。

RARP概述

RARP(Reverse Address Resolution Protocol,反向地址解析协议)是一种网络协议,用于通过已知的物理地址(MAC地址)获取对应的IP地址。它是ARP(Address Resolution Protocol)的逆向过程,主要用于无盘工作站或设备启动时获取IP配置。

这个过程比ARP还要简单就不赘述了。

相关推荐
怎么没有名字注册了啊2 小时前
VMware 完整版安装 Debian 纯命令行系统(无图形化、超详细全程教程)
linux·服务器·网络·数据库·debian
同聘云2 小时前
阿里云国际站gpu服务器能干什么?阿里云国际站gpu服务器怎么搭建?
服务器·阿里云·云计算
睿思达DBA_WGX2 小时前
Oracle 服务器 ORA-12516 错误的处理过程
服务器·数据库·oracle
Howie Zphile2 小时前
TOMCAT跑死服务器,怎么限制TOMCAT使用资源
服务器·tomcat·firefox
就叫飞六吧2 小时前
常见服务器黑话/术语名称
运维·服务器
iconball2 小时前
个人用云计算学习笔记 --29 华为云网络云服务
运维·笔记·学习·华为云·云计算
石去皿2 小时前
C++校招通关秘籍:从高频考点到工程思维的跃迁
java·服务器·c++
睿思达DBA_WGX2 小时前
Oracle 服务器 ORA-257(归档程序错误)的处理过程
服务器·数据库·oracle
草莓熊Lotso3 小时前
Linux 实战:从零实现动态进度条(含缓冲区原理与多版本优化)
linux·运维·服务器·c++·人工智能·centos·进度条