【网络】数据链路层知识梳理

全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的笔记吧~ 

自己写自己的八股!让未来的自己看懂! (全文手敲,受益良多) 

数据链路层

我们来重新理解一下这个图:

把数据从A主机送到B主机,我们要先把数据交到路由器A吧。IP解决的是AB之间跨网络传输的问题,再怎么跨网络,得先达到下一跳吧,一步一步走。

数据链路层解决的是:直接相连的主机(也包括路由器),进行数据交付的问题。

Mac地址

每一个网卡都有自己的mac地址,mac地址的作用:在同一局域网中,区分不同的主机。

我们来看一看mac的报头:

这个数据部分,大部分情况就是IP交给该层的IP报文。Mac帧就是这个报文,数据部分称为有效载荷。

问题1:Mac帧如何做到解包和封装

     Mac帧解包用到的是定长报文,收到报文的时候就可以把报头和有效载荷进行分离

问题2:Mac帧如何做到分用(交给上层的谁)

     通过类型,如果是0800说明数据是IP数据报…

目的地址: 就是要去的下一跳主机对应的mac地址

源地址:当前主机的mac地址

局域网的通信原理

  

   发送方把mac报头填好目的地址,源地址。然后发到局域网中,局域网中每一台机器都看到了这个报头然后进行比较,如果是给自己的才拿上来。

数据碰撞

局域网中有很多数据的时候,就会发生数据碰撞。要进行数据碰撞避免算法,本质就是让主机停发,避免过多数据碰撞。局域网中,主机数越多,发生数据碰撞的概率越大。

如何看待局域网??

局域网被多台主机共享,又要避免数据碰撞,所以我们可以将其看作多台主机的临界资源。通过网络层的IP协议,知道要去哪个路由器,然后在Mac帧上填上目标Mac地址(IP地址转Mac地址ARP协议)。到达这个路由器的时候,再根据Mac帧的类型向上交付给网络层,网络层去掉Mac的报头,然后再找到下一个要去的路由器,再由Mac帧重新填上目标Mac地址。依次类推,直到找到目标主机!

Mac帧只在局域网中有效!Mac帧的源地址和目的地址一直在变化的!

局域网中,主机数越多,发生数据碰撞的概率越大。怎么办呀?

   随着局域网的主机变多,我们引入新的设备——交换机。交换机可以识别到碰撞发生在哪一侧,如果左边发生碰撞,就不把数据给右边了,防止右边也发生碰撞。交换机可以划分碰撞域,减少局域网碰撞。

反正局域网都会发生碰撞,那我发生长一点的数据帧好呢?还是短一点的好呢?

  数据越长,时间就越长,发生碰撞概率就变大了。所以要求数据大小有范围【46,1500】字节。

数据链路层最多允许上层传1500字节(MTU),这会逼着网络层进行分片,可是分片不太好。我们要在协议里减少分片,我们如何减少分片呢?而IP传多少由TCP决定。所以减少分片的问题根源在TCP。IP报头为20字节,所以TCP最多只能传1480字节,TCP报头标准大小为20字节,所以真正的数据为1460。因为TCP有自己的发送缓冲区,所以每次最多取1460来发就可以了。这个1460就称为MSS(最大发送的数据段)。MMS双方三次握手的时候也会相互交互。

所谓的数据发送到目标网络,本质是通过无数个连续的子网实现的

ARP协议

  也是局域网协议,它要做到:在局域网中,将目标主机的IP地址转化为Mac地址!!!才可以实现路由器的跳转。

   如何让入口路由器R得到,主机B的Mac地址呢?

1.先谈ARP原理:
  

在局域网中广播一条消息:我是主机A,要找某某IP地址,它的Mac地址是什么?这个消息被主机B收到了,然后告诉其自己的Mac地址。

ARP报文:

ARP协议,属于MAC帧上层,但是归属到数据链路层。

硬件类型:表示链路层网络类型,1为以太网(固定写法)

协议类型:要传换的地址类型,0x0800为IP地址(固定写法)

硬件地址长度:对于以太网为6字节(固定写法)

协议地址长度:对于IP地址为4字节(固定写法)

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

目的以太网地址不知道,填为全F

2.模拟ARP过程

当主机R要找目的主机B的Mac地址的时候,先填ARP 报头:

,然后向下交付给数据链路层。再添加Mac帧报头,填写之后如下:

然后流向局域网,每台主机都会收到处理这个ARP报文。对于非目的主机,先对Mac帧报头的分离,发现目的地址为全F(广播地址),要受理这个报文,根据0806(类型)交付给该机器的ARP软件层,然后分析报文,发现目的IP地址并不是自己的IP地址,然后就把报文丢弃了。可是任何一台主机都可以发起ARP请求,所以任何一台主机都会收到ARP应答,和别人的ARP请求。所以我们要看op字段(1为请求,2为应答)。只有目的主机(B主机)的IP地址才可以对上,然后进行ARP应答~

重新写APR报文,把请求变为应答

然后再把应答的报文,广播给局域网,然后被主机R拿到,这样就可以拿到主机B的Mac地址啦。

结论:先看op,为1,看目的IP地址。为2看,源Mac地址。主机的mac地址和IP地址会被主机临时缓存起来。

ARP的周边问题

  1. ARP 工作机制:ARP(地址解析协议)用于将 IP 地址解析为 MAC 地址。主机通常会缓存 IP - MAC 映射关系。只有当缓存中的对应记录失效(比如缓存超时 、对应网络设备更改等情况 )时,才会再次发起 ARP 请求来重新获取 MAC 地址。
  2. 获取主机 IP 和 MAC 方法(理论设想):通过自身 IP 地址和子网掩码可确定所在网络号。理论上可通过拼接该网络号内的 IP 地址,然后使用 ping 命令探测网络内主机。在 ping 过程中,主机间交互会触发 ARP 过程,从而获取到对应主机的 MAC 地址。但实际中,这种操作可能受网络权限(如防火墙限制 )、广播域等因素影响。
  3. ARP 应答处理:当主机收到多次相同 IP 地址的 ARP 应答时,一般会以最新收到的应答为准更新自身的 ARP 缓存。这是因为最新应答可能反映了网络中设备当前真实的 MAC 地址情况,确保后续通信能正确寻址。

ARP 欺骗是针对 ARP 协议的攻击技术 。利用 ARP 协议无验证机制的漏洞,攻击者发送伪造 ARP 数据包,使目标主机将攻击者 MAC 地址错当成网关或目标主机 MAC 地址 。

DNS协议

实际上访问的网站是IP地址,因为IP地址不方便记忆。所以用域名,进行域名解析成IP地址就可以了。

浏览器中输入url后,发生的事情(就是输入一个域名后)

 分三个阶段:

  1. http过程+域名解析
    先域名解析,拿到目标IP地址,浏览器会构建http请求,填充请求行,请求报头空行,如果需要的话,还可以带正文。在构建http请求之前要三次握手。进行网络转发,到达目的主机,构建http应答,还有响应报文,再通过TCP链接,把响应返回,浏览器得到之后对报文做解析,提取正文,对正文进行解释,再由浏览器渲染就可以看到结果了。
  2. https提一下
    刚刚的都是最简单的,现在都是https,双方在通信之前除了建立链接,在正常通信之前进行密钥协商…
  3. 谈论细节
    我们底层http的数据其实就是数据流,最后拷贝到TCP的发送缓冲区,那些策略,流量控制,拥塞控制,超时重传,三次握手,面向连接,还问就是IP层,子网划分,查路由表,IP分片,分片和组装,再往下就是Mac帧…

     

ICMP协议
 

   ICMP是网络层的协议。可以对网络当中出现问题时,对IP报文进行应答的。

        ping 命令基于 ICMP, 是在网络层. 而端口号, 是传输层的内容. 在 ICMP 中根本就不关
注端口号这样的信息.

NAT技术(重点)

 我们之前讲过,源IP地址在经过路由器的时候会被替换成WAN口地址。NAT技术本质还是缓解IP地址不足的问题。

可是怎么把收回来的数据,从路由器到源主机呢??

我们有NAPT,NAT转化表

内网中源地址一定是唯一的,我们提前建立映射关系。即使将来通过路由器转换后的地址都相同,但是收回数据的时候,可以根据映射关系来区分是哪个主机的数据。

NAT在替换的时候不仅仅会替换。会加端口号,通过端口号找到源地址~

NAT的缺陷

  1. 无法从NAT外部向内部建立连接
  2. 转换表的生成和销毁都需要额外开销
  3. 如果NAT路由器异常了,所有的TCP连接都会断开

内网穿透:通过一个公共的服务器,实现2个局域网主机的相互通信

代理服务器

正向代理(Forward Proxy)是一种常见的网络代理方式,它位于客户端和目标

服务器之间,代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请

求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。通过这

种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问

控制等。

工作原理

• 客户端将请求发送给正向代理服务器。

• 正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等。

• 正向代理服务器将处理后的请求转发给目标服务器。

• 目标服务器处理请求,并将响应返回给正向代理服务器。

• 正向代理服务器将响应返回给客户端。

反向代理

概述

• 反向代理服务器是一种网络架构模式,其作为 Web 服务器的前置服务器,接收

来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回

给客户端。这种架构模式可以提升网站性能、安全性和可维护性等基本原理

• 反向代理服务器位于客户端和 Web 服务器之间,当客户端发起请求时,它首先

会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的 Web

服务器,并将 Web 服务器的响应返回给客户端。在这个过程中,客户端并不知道实际

与哪个 Web 服务器进行了交互,它只知道与反向代理服务器进行了通信。


下篇文章我将更新——多路转接~期待你的关注👉【A charmer】 

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

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

相关文章

机器学习(神经网络基础篇)——个人理解篇6(概念+代码)

1 在声明一个类中,构建一个属于类的函数,前面为什要加上“self”? 就像下面这一串代码: class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std0.01):# 初始化权重self.params {}self.p…

Cribl 对Windows-xml log 进行 -Removing filed-06

Removing Fields Description​ The Eval Function can be used to add or remove fields. In this example we will remove the extracted fields while preserving _raw, _time,index,source, sourcetype. Steps - Adding an Eval Function

chili3d调试6 添加左侧面板

注释前 一个一个注释看对应哪个窗口 无事发生 子方法不是显示的窗口 注释掉看看 没了 注释这个看看 零件页面没了 这个浏览器居然完全不用关的,刷新就重载了 注释看看 无工具栏版本 sidebar: 往框框里面加入 div({ className: style.input }, user_…

Linux学习——了解和熟悉Linux系统的远程终端登录

Linux学习——了解和熟悉Linux系统的远程终端登录 一.配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 打开VMWare,选择编辑虚拟机设置,在网络适配器设置中,选择“桥接模式”,保存设置并启动Ubuntu。 2、配置Ubuntu的…

【JAVA EE初阶】多线程(1)

这样的代码,虽然也能打印hello thread,但是没有创建新的线程,而是直接在main方法所在的主线程中执行了run的逻辑 start方法,是调用系统api,真正在操作系统内部创建一个线程。这个新的线程会以run作为入口方法&#xff…

javase 学习

一、Java 三大版本 javaSE 标准版 (桌面程序; 控制台开发) javaME 嵌入式开发(手机、小家电)基本不用,已经淘汰了 javaEE E业级发开(web端、 服务器开发) 二、Jdk ,jre jvm 三…

【Linux】Linux 操作系统 - 05 , 软件包管理器和 vim 编辑器的使用 !

文章目录 前言一、软件包管理器1 . 软件安装2 . 包管理器3 . Linux 生态 二、软件安装 、卸载三、vim 的使用1 . 什么是 vim ?2 . vim 多模式3 . 命令模式 - 命令4 . 底行模式 - 命令5. 插入模式6 . 替换模式7 . V-BLOCK 模式8 . 技巧补充 总结 前言 本篇笔者将会对软件包管理…

python基础知识点(1)

python语句 一行写一条语句 一行内写多行语句,使用分号分隔建议每行写一句,且结束时不写分号写在[ ]、{ }内的跨行语句,被视为一行语句\ 是续行符,实现分行书写功能 反斜杠表示下一行和本行是同一行 代码块与缩进 代码块复合语句&#xf…

C#/.NET/.NET Core技术前沿周刊 | 第 35 期(2025年4.14-4.20)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…

HTML表单与数据验证设计

HTML 表单与数据验证设计:构建可靠的用户数据采集系统 引言 互联网的核心是数据交互,而HTML表单是这一交互的主要入口。作为前端工程师,设计高质量的表单不仅关乎用户体验,更直接影响数据收集的准确性和系统安全。 在我的学习实…

基于STM32的Keil环境搭建与点灯

本人使用的STM32开发板为正点原子的STM32F103ZE,在此记录完整的搭建与点灯过程。 一、Keil的安装与配置 安装Keil 首先进入Keil下载官网:https://www.keil.com/download/product/ 点击MDK-ARM,并填写相关信息,之后开始下载最新版…

React-useRef

如果我们想在hooks里面获同步取最新的值&#xff0c;那么则可以使用useRef, 关键源码如下&#xff1a; function mountRef<T>(initialValue: T): {|current: T|} {const hook mountWorkInProgressHook();const ref {current: initialValue};hook.memoizedState ref;re…

幽灵依赖与常见依赖管理

文章目录 前言1. 演示&#xff1a;检测和修复幽灵依赖步骤1&#xff1a;安装 depcheck步骤2&#xff1a;在项目根目录运行 depcheck可能的输出步骤3&#xff1a;修复幽灵依赖 2. 依赖管理的好习惯 1. 场景设定现在有如下依赖需求&#xff1a; 2. 依赖冲突的表现3. 解决依赖冲突…

如何使用人工智能大模型,免费快速写工作总结?

如何使用人工智能大模型&#xff0c;免费快速写工作总结&#xff1f; 详细学习视频https://edu.csdn.net/learn/40406/666581

[Java实战经验]异常处理最佳实践

一些好的异常处理实践。 目录 异常设计自定义异常为异常设计错误代码&#xff08;状态码&#xff09;设计粒度全局异常处理异常日志信息保留 异常处理时机资源管理try-with-resources异常中的事务 异常设计 自定义异常 自定义异常设计&#xff0c;如业务异常定义BusinessExce…

Makefile 入门指南

Makefile 入门指南 最简单的例子 单文件编译 假设我们有一个main.cpp文件&#xff0c;最简单的Makefile如下&#xff1a; # 最简单的单文件编译 # 目标:依赖文件 main: main.cpp# 编译命令g main.cpp -o main使用步骤&#xff1a; 将上述内容保存为名为Makefile的文件&…

PyTorch数据操作基础教程:从张量创建到高级运算

本文通过示例代码全面讲解PyTorch中张量的基本操作&#xff0c;包含创建、运算、广播机制、索引切片等核心功能&#xff0c;并提供完整的代码和输出结果。 1. 张量创建与基本属性 import torch# 创建连续数值张量 x torch.arange(12, dtypetorch.float32) print("原始张…

【Redis】Redis中的常见数据类型(一)

文章目录 前言一、Redis前置知识1. 全局命令2、数据结构和内部编码3. 单线程架构 二、String 字符串1. 常见命令2. 计数命令3.其他命令4. 内部编码5. 典型使用场景 三、Hash哈希1. 命令2.内部编码3. 使用场景4. 缓存方式对比 结语 前言 Redis 提供了 5 种数据结构&#xff0c;…

Windows 中使用 `netstat` 命令查看端口占用

在 Windows 系统中&#xff0c;可以通过 netstat 命令来查看当前系统的网络连接以及端口的占用情况。以下是关于该命令的具体说明&#xff1a; #### 使用方法 1. **查看所有端口及其状态** 可以通过以下命令查看系统中的所有活动连接和监听端口&#xff1a; bash net…

23种设计模式-结构型模式之装饰器模式(Java版本)

Java 装饰器模式&#xff08;Decorator Pattern&#xff09;详解 &#x1f381; 什么是装饰器模式&#xff1f; 装饰器模式是一种结构型设计模式&#xff0c;允许向一个对象动态添加新的功能&#xff0c;而不改变其结构。 &#x1f9f1; 你可以想象成在原有功能上“包裹”一…