我们来谈谈数据链路层

news2024/12/27 12:46:14

 "啊,其实触手可及!"


        谈到网络层IP,有很多说法都是说,"IP是决定到达对端主机的能力"。而在实际的网络世界中,在各个节点路由器上,游走的报文也是IP报文!   

         但是,真实的网络数据传输不是上图那样,显得简单。

         因此,所谓的跨网络通信(传输),其本质是: " 无数个子网内转发的结果 "

        由此,现在的问题到了,如何理解局域网转发?局域网是如何进行转发的呢?

--- 前言 


如何认识局域网1 ? 

        我们可以将一个局域网当做是一个教室,教室里的学生和老师可以看做是一个一个独立的主机。这时候,如果老师喊了一句,"张三,站起来"。从这个的动作中,我们可以预示,班上的所有人都会听到这句话,并且和自己的信息(名字)作比对,发现不是叫的自己,那么久不用站起来了。因此,在同一个局域网的主机能不能进行通信? 答案是能!并且,在同一个局域网内,每一台主机都有一个唯一标识自己的标识符——网卡(Mac地址)。

什么是Mac地址?

        任何一台主机网卡(这里不考虑虚拟出来的),理应有一个唯一的sn,该序号是一个48位、16进制的数字。在全球范围内具有唯一性!

         该网卡的Mac地址在出厂的时候就已经确定了,不能更改。(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)。

一、 数据链路层

(1) 什么是以太网?

        "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等。

        以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

(2) 认识以太网协议 

        认识格式帧:

 目的地址\源地址: 通过上层的IP协议得到。

 类型: 报文其值有三种, IP、ARP、RARP

 帧末: 尾是CRC校验码.

以太网如何进行解包和分用?

        ip可以通过16位总长度获取整个报文的大小,udp通过定长报头和报文大小确定解包大小,tcp也可以通过定长报头完成报头与有效载荷的分离。

       

         对于以太帧而言,掐去前面的14字节,去除尾部的4字节,一共18字节就可以拿到对应的有效载荷。

        并且,在报头字段里,也有2bit,区分有效载荷的数据报,到底交付上层的什么协议。

局域网转发的原理(基于协议)

        我们模拟一下,现在接收到了一个来自上层协议的报文。

         正如前言中教室的例子,任何出现在局域网内的数据,其他主机都能够看见!如果此时主机B拿到了该报文。

         一旦主机B发现该报头中的目的地址不是自己,那么就会立即丢掉!当主机D收到这个报文后,发现该报文的目的地址就是M5时,就会将该报文的进行解包和分用,将数据交付上层,并在之后重新封包以太帧响应给M1(同样这个报文也是会被局域网内其他主机知晓的!)。

  

混杂模式:

        在局域网中有一种"混杂模式",该功能就是不放弃任何数据帧,直接向上交付!

        这也是很多抓包软件、工具的原理。所以你就可以很清晰地认知到,你通过网络对外发送消息时,会经历过很多很多的路由器,穿过很多很多的子网,一个中间人是很容易抓取你报文中携带的隐私信息。这也是为什么现如今有了https,通过加密和CA证书保障用户数据被泄漏的风险。

小结:

① 局域网中的所有主机都能接收到数据帧,只不过大部分主机在自己的数据链路层通过对比数据帧中的目的地址和本主机的Mac地址是否匹配,再来决策是否进行后续处理。

② 局域网中,一次只允许一台主机向局域网中发送数据,如果多个消息被发送可能会导致局域网中的数据发生碰撞、数据无效。

         因此,局域网也叫做碰撞域。也许你会像,有没有一种可能,我想搞掉一个局域网,那么我就只需要不遵守碰撞检测与碰撞避免,持续向该局域网塞垃圾数据。是的,这样会加大消息碰撞的概率,别人正常的消息发送就会受到影响。

③ 如何减少碰撞域,提高发送数据的效率呢?        

        划分碰撞域。

(3) 认识MTU

        MTU相当于发快递时对包裹尺寸的限制,网络传输流量大小最终受到的限制是MTU,这个限制是不同的数据链路对应的物理层, 产生的限制:

● 以太网帧中的数据长度规定 ”最小46字节”,"最大1500字节";

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

● 如果一个数据包长度大于MTU了,则需要对数据包进行分片(fragmentation);

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

查看不同主机的MTU:        

#windows:
netsh interface ipv4 show subinterfaces
#linux:
ipconfig

MTU对IP协议的影响:

        因为数据链路层MTU的限制,一旦ip层传输的报文数据过大,就会触发分片机制。

● 任意一个原报文中的数据被切分,打上标签。并在数据到达对端时,按序重组。

● 如果这些小包中出现丢失, 接收端重组就会失败. 但IP层不会负责重新传输数据。

MTU对UDP协议的影响:

         UDP是定长8字节协议。当携带的数据超过MTU限制,也会在网络层IP处触发分片机制。反而因为udp不可靠,导致接收端出现重组失败,整个数据传输的丢包率大大增加。

MTU对TCP协议影响:        

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

TCP与MTU的关系:

  

        TCP会在通信双方,建立连接时进行MMS协商。在我们前面知道这跟(滑动窗口,窗口大小,拥塞窗口等有关)。双方得知对方的MSS值之后, 选择较小的作为最终MSS。


二、ARP协议

什么是ARP协议?

        我们都知道,所谓跨网络通信,本质上就是各个由"路由"设备划分的子网内,进行数据包转发。然而,双方在通信时,仅仅只知晓了对端主机网络号是多少,以及该主机的port进程端口。此时 ,该报文已经抵达了由路由器连通内的,组成的多台主机的子网。此时,该报文又应该向下封装MAC帧时,如何找到对端主机的MAC帧?

        长话短说,ARP协议本质上:ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.

         "根据IP地址,转换成MAC地址,获取对方的MAC地址后,向下封装MAC帧,再发送数据"。所以,ARP协议并不单纯是一个数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。
 

(1) 认识ARP协议        

 注:源MAC地址,目的MAC地址,一个在以太网首部出现一次,一个又在ARP请求中出现一次。如果仅仅是对于链路层为以太网的情况下,是多余的。但如果是其他类型的网络,则是有必要的。

● 硬件类型:指明了硬件的接口类型,1表示以太网,网络类型还有:令牌环网 或者 无线网;

● 协议类型指要转换的地址类型,0x0800为IP地址;

● 硬件地址长度对于以太网地址为6字节;

● 协议地址长度对于和IP地址为4字节;

● op字段为1表示ARP请求,op字段为2表示ARP应答;

(2) ARP协议的工作流程        

 ● 源主机发出ARP请求,并且将ARP协议内的目的MAC地址填 "FF:FF:FF:FF:FF:FF表示广播。在该网段内的所有主机首先都会查看字段”OP”,如果是填写为1,都会接收到该报文,并且在MAC层将报头和有效载荷分离,向上进行交付。

 ● 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则会将"OP"字段填为2,发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。其余主机发现广播ARP请求中的IP与本机IP不相符,自动丢弃该报文。

ARP缓存表:

        这些ARP结果是会被存储起来的,每台主机都维护一个ARP缓存表,可以用arp -a命令查看。                

        ARP缓存表是一种“短期存储”中间设备 "IP与MAC地址间的对应关系"的表格,提供一种有效的IP和MAC映射机制。

        可以直接映射物理地址与IP地址之间的联系,而不需要花大量时间去核对及确认,实现网络的快速通信,节省网络通讯的流量以及时间。        

 (3) ARP欺骗           

        所以,http明文传输危险吗?答案是相当危险。其他主机如何拿到本该发送到你这台主机的信息?进行ARP欺骗。

        这也是为什么需要https对传输数据进行加密,需要CA证书,对称、非对称加密、各种数据摘要……让中间人即便能够拿到传输数据,却无法解密,拿不到真实的数据信息,从而降低了数据泄漏可能,为数据传输提供了安全。

RAPR协议: 

        知道了什么是ARP协议,它是一个地址转换协议。那么是RARP协议呢?RARP协议是一个"逆地址解析协议"。比如,一台主机知道自己的MAC地址,而不知道自己的IP地址,那么可以通RARA协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。然发送方发出的是广播信息,RARP规定只有RARP服务器能产生应答。


三、NAT技术        

NAT技术背景:

        IPv4协议中, IP地址数量不充足的问题,NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。
        比如我们的家用路由器,或者学校的路由器,NAT技术是它们必备的功能之一,方便访问公网。我们自己使用的IP地址大都是私有IP,而路由器或者必要的服务器上会设置全局IP。

        全局IP具有唯一性要求,但是不同局域网内,可以出现重复的私有IP,互相完全不受影响。
                 

(1)NAT转换过程:        

● NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;

● NAT路由器收到外部的数据时, 又会把目标IP从 “202.244.174.37 ” 替换回"10.0.0.10";

● 在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;

● 当10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;

NAPT:

        可是如果局域网内,是有多台主机的,并且这多台主机都要访问同一个服务器。又或者一台主机的不同进程都要访问同一服务器。服务器返回数据中的目的IP都是相同的,那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?

        答案是,使用IP+port来建立这个关联关系!        

         这种关联关系也是由NAT路由器自动维护的,由此,服务端返回的数据,到底返回给子网内的哪一台主机上的哪一个进程,这样的信息就会被保存在这个NAPT转换表之中。一旦通信双方连接断开,就会删除这项表项数据。

NAT缺陷:

● 无法从NAT外部向内部服务器建立连接,也就意味着公网设备是不能直接访问内网设备的。
● 装换表的生成和销毁都需要额外开销;
● 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;

(2) NAT和代理服务器

代理服务器:

        客户端向代理服务器发送请求, 代理服务器将请求转发给客户端真正要请求的服务器; 服务器返回结果后,发送给代理服务器,代理服务器又把结果回传给客户端。        

正+反向代理服务器:

正向代理服务器: 

 反向代理服务器:

        如何区分正、反向代理?离客户端谁近,谁就是正向代理,反之就是反向代理。

负载均衡与反向代理: 

        假设有多台主机上,部署了同样的服务,并且每台主机都持有唯一的公网ip,所有机器因此会暴露在公网之中!这种情况是比较尴尬,甚至是危险的~。        

         所以,反向代理服务器仅仅是运作为连接转发的功能。

        比如说一些在软件层面上的反向代理Nginx。


NAT vs 代理服务器:

        NAT似乎与代理服务器没什么区别,因为两者在数据转发的行为是类似的。但是两者工作在完全不同地方,解决的问题也是不同的。

● 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题。代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器。

● 从底层实现上讲, NAT是工作在网络层, 代理服务器往往工作在应用层。

● 从使用范围上讲, NAT一般在局域网的出口部署(NAT路由器), 代理服务器可以在局域网做(比如说我们使用的校园网), 也可以在广域网(作为入口服务器)做, 也可以跨网。

●从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上。
 


 

本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~ 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门之stl六大组件--List源码深度剖析及模拟实现

文章目录 前言 一、List源码阅读 二、List常用接口模拟实现 1.定义一个list节点 2.实现一个迭代器 2.2const迭代器 3.定义一个链表,以及实现链表的常用接口 三、List和Vector 总结 前言 本文中出现的模拟实现经过本地vs测试无误,文件已上传gite…

AI大模型来袭,智能客服变天?

配图来自Canva可画 自ChatGPT爆火“出圈”之后,国内外就掀起了一波AI大模型风潮。越来越多的企业都开始布局AI大模型领域,其中不少企业已经推出了自家的AI大模型产品,试图在这股AI浪潮中拔得头筹。而在众多AI大模型中,既有通用大…

Python爬虫如何更换ip防封

作为一名长期扎根在爬虫行业动态ip解决方案的技术员,我发现很多人常常在使用Python爬虫时遇到一个困扰,那就是如何更换IP地址。别担心,今天我就来教你如何在Python爬虫中更换IP,让你的爬虫不再受到IP封锁的困扰。废话不多说&#…

LVS负载均衡(DR)

文章目录 LVS-DR模式配置原理注DR配置添加VIP下载ipvsadm在DR上管理LVS Real-Server RS配置绑定VIP到环回网卡添加访问VIP的路由配置ARP抑制测试: LVS-DR模式配置 原理 当客户端发起请求后由DR处理,通过算法将流量转发至Real-Server中的某一个处理。然后…

8.16CAS

1.CAS 2. 原子类的原理 3.原子类的使用 import java.util.concurrent.atomic.AtomicInteger;public class Test {public static AtomicInteger atomicInteger new AtomicInteger();public static void main(String[] args) throws InterruptedException {System.out.println(…

Python读取及生成pb文件,pb与jsonStr互转,pb与dictJson互转,打包.exe/.sh并转换,很完美跨平台

Python读取及生成pb文件,pb与jsonStr互转,pb与dictJson互转,打包.exe/.sh并转换,很完美跨平台 1. 效果图2. 命令行:proto文件转.class(绝对路径或相对路径)3. 序列化、反序列化api4. pb转json&a…

搭建MyBatis开发环境

hi,大家好,今天来学习一下MyBatis的相关知识 文章目录 🧊1.MyBatis定义🧊2.为什么要学习MyBatis🧊3.搭建MyBatis开发环境🍐3.1前置工作--创建数据库和表🍐3.2在新项目中添加MyBatis的框架🍐3.3设置MyBatis…

Leetcode31 下一个排列

解题思路: 算法过程的第二步,可以变为将[j,end]排序,然后从[j,end)和i进行比较,在区间j,end区间第一个大于nums[i]后,交换即可 public void nextPermutation(int[] nums) {int len nums.length - 1;for(int i len;i…

小程序的 weiui的使用以及引入

https://wechat-miniprogram.github.io/weui/docs/quickstart.html 网址 1.点进去,在app.json里面配置 在你需要的 页面的 json里面配置,按需引入 然后看文档,再在你的 wxml里面使用就好了

使用DMA传输实现单片机高效串口转发——以STM32系列为例

使用DMA传输实现单片机高效串口转发——以STM32系列为例 DateAuthorVersionNote2023.08.06Dog TaoV1.01. 完成了文档的撰写。 文章目录 使用DMA传输实现单片机高效串口转发——以STM32系列为例应用场景实现流程源码示例串口与中断配置DMA外设配置DMA发送数据函数串口中断服务函…

Java中String方法魔性学习

这里写目录标题 先进行专栏介绍String详解常用构造方法代码演示常用成员方法代码示例总结 先进行专栏介绍 本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记 进行适当修改。希望…

【redis】SpringBoot集成redis

目录 1.添加redis依赖2.配置redis3.操作redis3.1 操作string 3.1 操作其它数据类型 4. Spring-Session基于Redis解决共享Session问题4.1 问题提出 4.1 添加依赖 4.2 修改配置4.3 存储和读取 1.添加redis依赖 方法①&#xff1a; <dependency><groupId>org.springf…

ChatGPT已闯入学术界,Elsevier推出AI工具

2022年11月&#xff0c;OpenAI公司发布了ChatGPT&#xff0c;这是迄今为止人工智能在现实世界中最重要的应用之一。 当前&#xff0c;互联网搜索引擎中出现了越来越多的人工智能&#xff08;AI&#xff09;聊天机器人&#xff0c;例如谷歌的Bard和微软的Bing&#xff0c;看起来…

微信小游戏流量主结算财务信息填写指引

微信小游戏个人开发者: 流量主结算财务信息填写指南 一,登录公众平台二,补充财务信息三,补充信息指引四,提交审核五,绑定通知对于微信小游戏个人开发者来说,流量主结算财务信息的填写是非常重要的一步。正确填写可以保证收入的及时结算,而填写不当则可能会导致收入无法到…

wxRibbonBar 常用三种控件Button,DropdownButton,HybridButton

这三种控件的效果如下所示&#xff1a; 点击下拉的效果&#xff1a; 这一部分可以设置wxITEM_CHECK&#xff0c;wxITEM_RADIO等效果 但我们可能更关注实现实例&#xff1a; &#xff08;1&#xff09;MyFrame.h #pragma once #include <wx/wx.h> #include "wx/wx…

vue2-diff算法

1、diff算法是什么&#xff1f; diff算法是一种通过同层的树节点进行比较的高效算法。 其有两个特点&#xff1a; 比较只会在同层级进行&#xff0c;不会跨层级进行。 在diff比较的过程中&#xff0c;循环从两边向中间比较。 diff算法在很多场景中都有应用&#xff0c;在vue中&…

(学习笔记-进程管理)进程

进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着CPU会执行程序中的每一条指令&#xff0c;那么这个运行中的程序就被称为进程。 现在我…

怎么加密文件夹才更安全?安全文件夹加密软件推荐

文件夹加密可以让其中数据更加安全&#xff0c;但并非所有加密方式都能够提高极高的安全强度。那么&#xff0c;怎么加密文件夹才更安全呢&#xff1f;下面我们就来了解一下那些安全的文件夹加密软件。 文件夹加密超级大师 如果要评选最安全的文件夹加密软件&#xff0c;那么文…

python GUI nicegui初识一(登录界面创建)

最近尝试了python的nicegui库&#xff0c;虽然可能也有一些不足&#xff0c;但个人感觉对于想要开发不过对ui设计感到很麻烦的人来说是很友好的了&#xff0c;毕竟nicegui可以利用TailwindCSS和Quasar进行ui开发&#xff0c;并且也支持定制自己的css样式。 这里记录一下自己利…

spring security + oauth2 使用RedisTokenStore 以json格式存储

1.项目架构 2.自己对 TokenStore 的 redis实现 package com.enterprise.auth.config;import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis…