Linux网络编程:数据链路层协议
目录
前言:
1.以太网
1.1.以太网帧格式
1.2.MTU(最大传输单元)
1.2.1.IP协议和MTU
1.2.2.UDP协议和MTU
1.2.3.TCP协议和MTU
2.ARP协议(地址解析协议)
2.1.ARP在局域网通信的角色
2.2.ARP报文格式
2.3.ARP报文的传输
前言:
为什么需要数据链路层
我们在之前的学习知道了网络层实现将数据报文从远端A主机经过若干个路由器的转发,最终到达目的主机B。
本质上就是数据从不同的局域网间进行转发直到转发到终点,比如家用主机转发到局域网中的家用路由器,家用路由器转发到局域网中的运营商路由器,最终在广域网这个“局域网”中转发到服务器!!!那么再按照相同的方式转发到目标主机B
那么我们如何进行局域网之间的转发呢?也就是实现家用主机转发到家用路由器呢?这时我们就需要构建数据链路层协议来实现数据报文在局域网内进行转发。
因此我们也可以看出:网络层时确定往哪里发送,实现路由和路由选择的。而数据链路层就是一个跑腿的,实现数据包的发送。
局域网通信
在局域网中,所有主机都是直连的,这时某一台主机发送信息,其他主机都能够接收到这个信息,所以我们进行局域网通信时需要特别指定接收方进行信息响应,而其他主机不进行消息响应。

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

- IP地址作用:描述整个数据传输过程中的起点和终点(进行路径选择)
- MAC地址作用:数据传输过程中在同一个局域网之间每一跳的起点和终点
如何理解这两个地址呢?
我们知道在进行数据报文转发时,起始的IP地址可能为内网的IP,需要不断的通过局域网中的路由器转换成WAN口IP最后转为公网IP。而这个过程需要进行局域网中主机找到路由器,当前层路由器找到向上层转发的路由器,这时就需要MAC地址,进行局域网内的数据移动(因为局域网中的所有主机都能够读到局域网中发出的信息,那么这时我们进行对这个目的MAC地址进行比对)
交换机的引入
通过MAC地址我们实现了:信息被对应的MAC地址的主机接收,但是当同一个局域网内获取到大量的信息,这时会出现数据碰撞问题,因为局域网可以看做多台主机的一份“临界”资源。
- 局域网中,任何时刻只允许一台主机在向局域网中发送数据
- 如果同时发送,会产生局域网数据碰撞问题,这时我们通过碰撞检测和碰撞避免算法来解决

如图:当我们引入交换机,交换机左端为A、B、F、E,右端为C、D、G
场景一:
A主机信息发送给E主机,如图这时A主机直接可以转发给E主机
场景二:
A发送信息给G,因为A到G之间存在交换机,此时就需要通过交换机转发到右边
交换机的作用:划分碰撞域,减少数据碰撞的概率
交换机的引入,实现了数据不会直接扩散在整个局域网中,只有数据需要跨碰撞域才会通过交换机,那么就允许不同的局部(碰撞域)同时发送信息,增大了传输效率。
1.以太网
1.1.以太网帧格式

目的地址和源地址
表示当前数据报文需要发往局域网中的哪一个地址,当前的地址。这里的地址为mac地址
类型
表示当前的数据报文内存储的是IP数据包、还是ARP、RARP请求/应答
CRC
CRC-循环冗余校验码,用于校验数据传输过程中是否发生了更改、出错。
1.2.MTU(最大传输单元)
我们在Linux网络编程:网络层协议|IP-CSDN博客 曾经提及了MTU最大传输单元,即以太网帧的最大数据长度。实际上帧长度为:46~MTU大小,当以太网帧小于46时,会将他补齐至少为46字节,当以太网帧大于MTU时,会进行切片成适合的以太网帧。
这时我们联想到了快递的包裹大小也是有范围的,不会过于小也不会过于大。
1.2.1.IP协议和MTU
在IP协议中我们对过长的数据报文进行分片,最大有效载荷 = MTU - IP协议报头,并且将对应的报头标志位设为切片的状态,具体可以看Linux网络编程:网络层协议|IP-CSDN博客 这篇博客!!!
1.2.2.UDP协议和MTU
我们知道UDP协议是不可靠的传输层协议,他没有UDP的确认应答机制和超时重传机制,所以我们如果使用UDP协议进行通信时,报文大小过大,进入IP层就会出现切片成若干个UDP报文,那么这样数据丢包的可能性增加。所以UDP协议的 最大有效载荷大小 = MTU - UDP报头 - IP报头
1.2.3.TCP协议和MTU
同理我们知道TCP协议的最大有效载荷大小为: 最大有效载荷大小 = MTU - TCP报头 - IP报头,这个值也称为MSS。
在TCP三次握手期间,双方会进行各自主机的MTU大小进行协商(协议可能不同),双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,并且选取最小的MSS值作为通信时的MTU大小

这里我们就需要注意加粗字段的内容来理解:“有效载荷”即可
2.ARP协议(地址解析协议)
2.1.ARP在局域网通信的角色
我们在前言中局域网通信模块,学习到了数据传输是需要MAC地址来实现的,那么对于发送端,他知道自己的源MAC地址,但是他怎么知道接收端的MAC地址呢?所以为了知道局域网内某个主机的MAC地址,我们实现了ARP协议,用来建立主机IP地址和MAC地址的映射关系。

- 通信开始初期,在局域网内发送一条广播信息,内容大致为:我是主机A,我的MAC地址是MAC-A,我要和主机B进行通信,我知道你的IP是IP-B,请告诉我你的MAC-B
- 这时在局域网域中,所有主机都能够接收到这个信息,然后用自己的IP地址和IP-B匹配
- 最终其他的主机不接受这个报文,只有B主机接收,并返回MAC-B
- 这时我们就能够通过IP地址来找到对应的MAC地址,进而完成通信
并且在实际通信中,ARP协议完成获取主机MAC地址后,会将其进行缓存,也就是不需要一致用过发送ARP请求报文来获取MAC地址,直接在这个缓存表获取即可。
值得一提的是:为了应对某一台主机的网卡设备更改导致MAC地址改变,所以ARP缓存表定期更新,重新发送ARP请求
这时我们回顾以太网帧格式:在图中我们就看到以太网报文中的有效载荷可以为IP报文、ARP请求/应答、RARP请求/应答。
2.2.ARP报文格式
我们已经知道了ARP报文可以作为以太网报文的有效载荷,发到局域网中进行IP地址到MAC地址的映射。如图为:发送ARP报文的以太网格式:

那么接下来我们来学习一下ARP报文的字段!!!
- 硬件类型指链路层网络类型,1为以太网
- 协议类型指要转换的地址类型,0x0800为IP地址
- 硬件地址长度内填6字节
- 协议地址长度内填4字节
- op字段为1表示ARP请求,op字段为2表示ARP应答
2.3.ARP报文的传输
- 首先完善ARP报文,然后通过MAC帧进行封装,默认以太网首部(报头)的目的地址为:FFFFFFF,表示传输给所有主机。并且帧类型设为
- 当发出ARP请求的报文进入局域网时,所有在局域网的主机都可以接收到,当接收到信息后,解包掉以太网首部,读取当前ARP报文的OP字段,如果是请求报文,那么接下来就分析IP地址是否符合
- 如果不符合,直接丢包。如果符合,那么就进行构建ARP应答报文,这时我们也获得了以太网首部的源MAC地址,接着进行以太网帧的构建并发送,完成IP地址和MAC地址的映射。
以上内容即为ARP地址解析,这里我们看出局域网中的任何一台主机都可能接收到ARP请求或者是ARP回应,并且ARP地址解析正是IP地址和MAC地址的互相映射,所以IP地址、MAC地址在实际网络通信都具有各自重要的意义……
相关文章:
Linux网络编程:数据链路层协议
目录 前言: 1.以太网 1.1.以太网帧格式 1.2.MTU(最大传输单元) 1.2.1.IP协议和MTU 1.2.2.UDP协议和MTU 1.2.3.TCP协议和MTU 2.ARP协议(地址解析协议) 2.1.ARP在局域网通信的角色 2.2.ARP报文格式 2.3.ARP报文…...
企业估值的三种方法
估值模型三剑客—DCF、P/E、EV /EBITDA 三种主要估值模型的优缺点: DCF 优点:通过对自由现金流的折现计算,反映了公司内在价值的本质,是最重要与最合理的估值方法。 缺点:未来自由现金流的估计不准确,受折现率影响…...
比亚迪正式签约国际皮划艇联合会和中国皮划艇协会,助推龙舟入奥新阶段
6月5日,比亚迪与国际皮划艇联合会、中国皮划艇协会在深圳共同签署合作协议,国际皮划艇联合会主席托马斯科涅茨科,国际皮划艇联合会秘书长理查德派蒂特,中国皮划艇协会秘书长张茵,比亚迪品牌及公关处总经理李云飞&#…...
宏集Panorama SCADA:个性化定制,满足多元角色需求
前言 在考虑不同人员在企业中的职能和职责时,他们对于SCADA系统的需求可能因其角色和工作职责的不同而有所差异。在SCADA系统的设计和实施过程中,必须充分考虑和解决这种差异性。 为了满足不同人员的需求, 宏集Panorama SCADA平台具备灵活的功能和定制…...
聪明人社交的基本顺序:千万别搞反了,越早明白越好
聪明人社交的基本顺序:千万别搞反了,越早明白越好 国学文化 德鲁克博雅管理 2024-03-27 17:00 作者:方小格 来源:国学文化(gxwh001) 导语 比一个好的圈子更重要的,是自己优质的能力。 唐诗宋…...
图片和PDF展示预览、并支持下载
需求 展示图片和PDF类型,并且点击图片或者PDF可以预览 第一步:遍历所有的图片和PDF列表 <div v-for"(data,index) in parerFont(item.fileInfo)" :key"index" class"data-list-item"><downloadCard :file-inf…...
图论第5天
127.单词接龙 需要cout看一下过程。 #include <iostream> #include <queue> #include <stack> #include <unordered_map> #include <unordered_set> #include <vector> using namespace ::std;class Solution { public:int ladderLength(…...
Java开发-面试题-0004-HashMap 和 Hashtable的区别
Java开发-面试题-0004-HashMap 和 Hashtable的区别 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术文) 生活…...
Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)
概览 在任何语言中对序列(或集合)元素的排序无疑是一种司空见惯的常规操作,在 Swift 语言里自然也不例外。序列排序看似简单,实则“暗藏玄机”。 要想真正掌握 Swift 语言中对排序的“各种姿势”,我们还得从长计议。不如就先从最简单的排序基本功开始聊起吧。 在本篇博…...
redis 04 redis结构
1.客户端...
【原创】springboot+mysql农业园区管理系统设计与实现
个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…...
web前端 孙俏:深度探索与实战之路
web前端 孙俏:深度探索与实战之路 在这个数字化、信息化的时代,web前端技术以其独特的魅力,吸引着越来越多的开发者投身其中。今天,我们将跟随孙俏的脚步,一同探索web前端的深度与广度,揭开其神秘的面纱。…...
opencv实战小结-银行卡号识别
实战1-银行卡号识别 项目来源:opencv入门 项目目的:识别传入的银行卡照片中的卡号 难点:银行卡上会有一些干扰项,如何排除这些干扰项,并且打印正确的号码是一个问题 最终效果如上图 实现这样的功能需要以下几个步骤…...
Windows API 开发桌面应用程序,在窗口按下鼠标左键不放可以拖图,并且拖图期间鼠标图标变成手掌
在Windows API中,要实现鼠标左键按下并拖动以移动窗口中的某个图形,并且同时改变鼠标图标为“手掌”形状(这通常指的是“拖动”或“移动”的图标),你需要执行几个步骤。 以下是一个基本的步骤指南,用于在W…...
Docker的网络管理
文章目录 一、Docker容器之间的通信1、直接互联(默认Bridge网络)1.1、Docker安装后默认的网络配置1.2、创建容器后的网络配置1.2.1、首先创建一个容器1.2.2、ip a 列出网卡变化信息1.2.3、查看新建容器后的桥接状态 1.3、容器内安装常见的工具1.4、容器间…...
【数据结构】平衡二叉树左旋右旋与红黑树
平衡二叉树左旋右旋与红黑树 平衡二叉树 定义 平衡二叉树是二叉搜索树的一种特殊形式。二叉搜索树(Binary Search Tree,BST)是一种具有以下性质的二叉树: 对于树中的每个节点,其左子树中的所有节点都小于该节点的值…...
2024蓝桥杯初赛决赛pwn题全解
蓝桥杯初赛决赛pwn题解 初赛第一题第二题 决赛getting_startedbabyheap 初赛 第一题 有system函数,并且能在bss上读入字符 而且存在栈溢出,只要过掉check函数即可 check函数中,主要是对system常规获取权限的参数,进行了过滤&…...
大模型多轮问答的两种方式
前言 大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图,而在常见的使用大模型进行多轮对话方式中,我接触到的只有两种方式: 一种是简单地直接使用 user 和 assistant 两个角色将一问一答的会话内容喂给大模型,…...
【无标题】1877A
足球锦标赛中有 n支球队。每对队伍匹配一次。每场比赛结束后,Pak Chanek收到两个整数作为比赛结果,即两队在比赛中得分的数量。一支球队的效率等于本队每场比赛的总进球数减去对手每场比赛的总进球数。 比赛结束后,Pak Dengklek会计算每支球…...
直播美颜工具解析:美颜SDK核心技术与性能优化方法
本篇文章,小编将深入解析直播美颜SDK的核心技术及其性能优化方法,以期为开发者提供有价值的参考。 一、美颜SDK核心技术 1.实时人脸检测与识别 美颜SDK的核心技术之一是实时人脸检测与识别。这项技术基于深度学习算法,能够快速、准确地识别…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
