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地址的映射关系

  1. 通信开始初期,在局域网内发送一条广播信息,内容大致为:我是主机A,我的MAC地址是MAC-A,我要和主机B进行通信,我知道你的IP是IP-B,请告诉我你的MAC-B
  2. 这时在局域网域中,所有主机都能够接收到这个信息,然后用自己的IP地址和IP-B匹配
  3. 最终其他的主机不接受这个报文,只有B主机接收,并返回MAC-B
  4. 这时我们就能够通过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报文的传输 

  1. 首先完善ARP报文,然后通过MAC帧进行封装,默认以太网首部(报头)的目的地址为:FFFFFFF,表示传输给所有主机。并且帧类型设为
  2. 当发出ARP请求的报文进入局域网时,所有在局域网的主机都可以接收到,当接收到信息后,解包掉以太网首部,读取当前ARP报文的OP字段,如果是请求报文,那么接下来就分析IP地址是否符合
  3. 如果不符合,直接丢包。如果符合,那么就进行构建ARP应答报文,这时我们也获得了以太网首部的源MAC地址,接着进行以太网帧的构建并发送,完成IP地址和MAC地址的映射。

以上内容即为ARP地址解析,这里我们看出局域网中的任何一台主机都可能接收到ARP请求或者是ARP回应,并且ARP地址解析正是IP地址和MAC地址的互相映射,所以IP地址、MAC地址在实际网络通信都具有各自重要的意义……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/686702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sqli-labs 靶场 less-5、6 第五关和第六关:判断注入点、使用错误函数注入爆库名、updatexml()函数

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它,我们可以学习如何识别和利用不同类型的SQL注入漏洞,并了解如何修复和防范这些漏洞。Less 5 SQLI DUMB SERIES-5 判断注入点:1. 首先,尝试正常的回显内容&#x…

【精通NIO】NIO介绍

一、什么是NIO NIO,全称为New Input/Output,是Java平台中用于替代传统I/O(Blocking I/O)模型的一个功能强大的I/O API。NIO在Java 1.4版本中被引入,其设计目标是提供一种非阻塞的、低延迟的I/O操作方式,以…

BERT应用——文本间关联性分析

本文结合了自然语言处理(NLP)和深度学习技术,旨在分析一段指定的任务文本中的动词,并进一步探讨这个动词与一系列属性之间的关联性。具体技术路径包括文本的词性标注、语义编码和模型推断。 一、技术思路 NLP和词性标注 在自然…

C语言 | Leetcode C语言题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> singleNumbers(vector<int>& nums) {int eor 0;for (int num:nums)eor ^ num;int rightOne eor & (~eor 1); // 提取出最右的1int onlyOne 0;for (int cur : nums) {if ((cur…

Spring Boot中整合Jasypt 使用自定义注解+AOP实现敏感字段的加解密

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

国外高防云服务器全面解析

国外高防云服务器是部署在海外市场&#xff0c;具备高级防护能力的云服务器。它们通常能够抵御大规模的分布式拒绝服务(DDoS)攻击和CC攻击&#xff0c;这类服务器特别适合对网络稳定性和数据安全性有较高要求的业务场景&#xff0c;如游戏行业、外贸电商等。下面将具体分析国外…

idea maven 执行 控制台乱码

这是没加出现的问题 上方案

verilog 232串口通信程序

1,串口通信协议: 通常串口的一次发送或接收由四个部分组成:起始位S、数据位D0~D7(一般为 6 位~8 位之间可变,数据低位在前)、校验位(奇校验、偶检验或不需要校验位)、停止位(通常为1位、1.5位、2位)。停止位必须为逻辑 1。在一次串口通信过程中,数据接收与发送双方…

容器(Docker)安装

centos安装Docker sudo yum remove docker* sudo yum install -y yum-utils#配置docker的yum地址 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装指定版本 - 可以根据实际安装版本 sudo yum install -y docke…

c# 下 ScintillaNET 显示XML信息并折叠节点

winform下显示XML信息&#xff08;非WPF&#xff09; 之前使用的是FastColoredTextBox&#xff0c;github地址如下&#xff1a; https://github.com/PavelTorgashov/FastColoredTextBox 但是有个问题&#xff0c;它支持中文&#xff0c;wordwraptrue&#xff0c;自动换行时&…

Vue3+vite部署nginx的二级目录

修改router访问路径 const router createRouter({history: createWebHistory(/mall4pc-bbc/),routes: [XXX,] })配置package.json文件 "build:testTwo": "vite build --mode testing --base/mall4pc-bbc/", 执行打包命令 npm run build:testTwo 打包出…

.NET集成DeveloperSharp操作Redis缓存

&#x1f3c6;作者&#xff1a;科技、互联网行业优质创作者 &#x1f3c6;专注领域&#xff1a;.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 &#x1f3c6;欢迎关注我&#xff08;Net数字智慧化基地&#xff09;&#xff0c;里面…

汇编:数组数据传送

要在32位汇编中实现数组数据的传送&#xff0c;可以使用字符串操作指令 MOVS 以及其前缀 REP&#xff0c;可以高效地复制数组数据。 MOVS 指令是一种字符串操作指令&#xff0c;用于将数据从源地址移动到目标地址。MOVS 指令有不同的变种&#xff0c;可以处理不同大小的数据&a…

每日一题——几行Python实现PAT甲级1065 A+B and C (64bit)(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 总结 改进建议 我要更强 代…

适用于 Windows 11 的 10 款最佳视频转换器:快速转换高质量视频格式

您是否遇到过由于格式不兼容而无法在设备上播放视频或电影的情况&#xff1f;您想随意播放从相机 GoPro 导入的视频&#xff0c;还是以最合适的格式将它们上传到媒体网站&#xff1f;您的房间里有一堆 DVD 光盘&#xff0c;并想将它们转换为数字格式以方便播放?...所有这些问题…

ComfyUI工作流分享-黏土特效工作流

大家给的教程都是苹果端使用Remini的软件制作&#xff0c;免费白嫖7天&#xff0c;7天后就要收费&#xff0c;作为ComfyUI技术党&#xff0c;当然是选择自己实现了&#xff0c;搭建一套工作流就搞定&#xff0c;这不&#xff0c;今天就来分享一套对应的黏土效果工作流&#xff…

前端进阶之HTML表单

前端之HTML表单 1.HTML表单的定义及概述 HTML 表单用于搜集不同类型的用户输入。 用<form> 元素定义HTML表单 例如&#xff1a; <form>. form elements. </form>1.1 HTML 表单包含表单元素&#xff1a;表单元素指的是不同类型的 input 元素、复选框、单…

成功解决:AssertionError: Torch not compiled with CUDA enabled

在运行pycharm项目的时候,出现了以上的报错,主要可以归结于以下两个个方面: 1、没有安装GPU版本的pytorch,只是使用清华的镜像地址下载了CPU版本的pytorch 2、安装的CUDA和安装的pytorch的版本不相互对应 我使用 pip list 来查看我在该环境下安装了哪些依赖项,发现自…

前端项目打包、部署的基础 (vue)

详细请看B站视频 BV19n4y1d7Gr 《禹神&#xff1a;前端项目部署指南&#xff0c;前端项目打包上线》&#xff0c;本博客为自用视频笔记。 目录 项目打包vue打包打包前分析项目请求 本地服务器部署问题 & 解决问题1&#xff1a;刷新页面404问题问题2&#xff1a;ajax请求废…

Java——break、continue和return

一、break break语句用于立即终止最内层的循环或switch语句。它是一种控制流语句&#xff0c;能够在满足特定条件时跳出循环或结束switch块的执行。 1、在循环中使用 1&#xff09;一般的 break break语句可以用于for、while和do-while循环中。当在循环中遇到break语句时&a…