Linux网络基础3之数据链路层

 (。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~icon-default.png?t=N7T8https://blog.csdn.net/ky233?type=blog

点个关注不迷路⌯'▾'⌯

 ip协议通过子网划分,目的IP地址,路径查找相关的算法从逻辑上可以从A主机到B主机了!

下面就是局域网数据转发的问题!怎么实际上把报文从一个主机到另一个主机呢?

———————————————————————————————————————————

 当决定把数据交给下一跳路由器的时候,下一跳路由器绝对是和我在一个局域网!宏观来看本质上我们的网络都是由一个个子网构成的这都是子网转发!

一、链路层的数据帧格式

1.认识以太网

  • "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的 内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
  • 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
  • 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

2.以太网帧格式

1.数据

这个数据就是ip报文!

2.mac地址

是链路层用来标识主机唯一性的地址!

目的地址就是代表是那个主机发送的,目的地址就是目标主机的地址!

是一个48位的整数,每台主机上都至少有一个mac地址

3.如何解包和封装

因为采用的是定长报头,所以很容易解包,直接去掉就好了

4.如何交付和分用

有类型字段,如果是0800则是ip报文直接交给ip层就行了!

二、重谈局域网通信原理

1.单个局域网中的数据转发

首先这是两个局域网,如果我们从H1转发到H6,每一个主机都收到了,但是目的地址和我的不匹配则不做处理,如果匹配则进行接收处理,进行报头和有效载荷分离!

如果双方同时想发送呢?

 如果在局域网中,同时有多台主机都在发送数据,数据之间就发生了碰撞问题!这样数据就无法使用了!

所以尽量不能发生碰撞问题!所以有了碰撞避免算法,也就是发送主机会休息随机时间,然后重新发送

在发送碰撞的时候我们是不知道的

问题一:局域网中主机越多越好还是越少越好

答案很明显是越少越好!越多就有更大的可能发生碰撞

其中我们有一个叫做交换机的东西,这个是用来划分碰撞域

问题二:局域网中数据帧是越长越好还是越短越好

答案是越短越好,因为数据帧太长了反而会容易造成碰撞问题!

所以就有了网络层的1500限制

三、汇总通信流程,发现并解决

在网络转发的过程中,目的IP是不变的,那么mac帧报头会变吗?

答案是肯定是会变的!因为每个主机都有mac地址,当跳到下一个主机的时候源地址和目的地址也变了!所以这个时候就要重新填写

也就是说有效数据没变,而mac帧一直在变,个人觉得可以想象成古代骑马送信,每经过一个驿站都要换一匹马,而信件没变!

那么假如我们的IP报文被千里迢迢的送到了路由器D,那接下来是不是就要交付给目标主机了呢?

这个时候就要封装mac报头,必须直到主机C的MAC地址!那么这个路由器D怎么直到主机C的地址呢?同理,每一跳是怎么直到下一主机的MAC的地址呢?

四.MSS

不知道是否还记的我们的滑动窗口,滑动窗口是经过一个个的小窗口在滑动,那么为什么不直接一次性的扔过去呢?

这就是因为我们的链路层不允许超过1500字节的数据发送,所以,我们在TCP的时候就要分好,避免网络层去分片,因为网络层分片的代价更大,所以我们不推荐分片!

已知MTU是1500,那么减去IP和TCP报头就剩下1460,所以MSS最大是1460!

五、arp协议

假设主机a要给主机f发送mac帧,要发送就必须要知道目标主机的mac地址,否则就无法封装mac帧!

如果我们只知道目标主机的ip地址,而不知道mac地址!所以我们就需要在同一个网段,需要通过目的ip,得知对方的mac地址的协议,这个协议就叫做arp协议,也叫做地址解析协议,arp协议是一个局域网协议!

将ip地址转化成mac地址大致的流程就是:当一个报文送来时,目的ip我们知道,我们可以查路由表,获取目标网络,然后根据当前网络的编号进行对比,来判断是否到达目标网络,到达了则根据整体的IP地址进行arp协议,获取目标mac地址!

mac帧和arp协议的关系:他们在同一个大层,但是在不同的小层,以太网协议也就是mac它的上层是网络层,arp协议在以太网的上层,但不是说在上面就网络层。

ARP协议的工作过程

1.大致流程

  1. 先广播,让在这个网络的所有人都知道我在找谁。也就是说我们发送一个mac帧,给所有人发一份,不是的人就直接丢弃,是的人就接收!
  2. 1对1进行发送,被找的人凭借我刚刚发的mac帧,对我进行回应

2.arp协议的细节

  1. 硬件类型指链路层网络类型,1为以太网;
  2. 协议类型指要转换的地址类型,0x0800为IP地址;
  3. 硬件地址长度对于以太网地址为6字节;
  4. 协议地址长度对于和IP地址为4字节;

其中前4个字段一般是固定的

发送端以太网地址,就是发送请求方的地址;

发送端IP地址,就是发送请求方的IP地址

目的以太网地址,就是目的以太网地址的,这个是不知道的,一般会设为FFFF;

目的IP地址,我们直接填写目标主机的IP

op字段:

  • 如果一台主机像另一台主机发起过ARP请求那么这台主机未来一定会收到ARP应答,如果向多台主机,则一定会收到多个应答
  • 任何一台主机,也可能向别人发起ARP请求
  • 所以在局域网中,任何一个主机收到ARP的时候,可能是一个应答,也有可能是一个球球

所以op字段为1表示ARP请求,op字段为2表示ARP应答。

3.模拟ARP过程

假设HA给HD发送mac帧,想要获取HD的mac地址,已知HD的ip地址,当我们构建了一个数据帧准备发送,主机B先收到了,这时主机B是要进行处理的,因为主机B不知道是否是找他的,每一台主机要进行报头和有效载荷分离,根据类型字段,来把有效载荷交给自己的ARP层,然后先查看对应的op类型,是否是请求,然后目的IP地址,是否是自己的,这时候就可以找到对应的主机了!

然后主机D就接着构建mac帧,将对应的mac帧一对一的发送给主机A,但这个时候其实全部都能收到,只不过不在处理了,因为大家知道了不是给自己的!所以我们两次丢弃的场景是不一样的,第一次是在ARP层,第二次是在MAC层丢的!

当主机A收到了对应的mac帧之后先看op字段是否是应答,然后再看对应的发送端以太网地址和发送端IP地址!

以上的过程就是ARP的过程!

几个问题

  1. arp看起来至少进行一个请求和一个应答,是不是每一次发送数据都要这么干呢?-----答案是不需要的,arp请求成功之后,请求方会暂时的将IP:MAC地址对应的映射保存起来,往后在一段时间中会直接发送
  2. 是不是只会在目标最终的子网中发生ARP,还是每一跳都要发生ARP呢?-----答案是并不是!arp的过程会在网络中可能随时发生

arp伪装,arp攻击,让自己成为中间人

主机A和路由器B互相发送消息所以他们知道对方的mac地址,这里有一个主机C和你们连接同一个局域网,我疯狂的给B发送arp应答,地址填写macC,IP填写IPA,我和他说我是主机A,我们的arp缓存是存新不存旧,只要有新的我就会更新,所以路由器B就直接把主机A的IP与映射主机A的mac地址替换成了主机A的IP与主机C的mac地址

同时C还给A发送arp应答,说我是B,地址填macC,IP是IPB,同样的,映射关系也改成了macC

所以主机A给B发消息就需要C来传达,也就是C获取到了发送的消息,这个时候主机C就成为了A与B的中间人

六、NAT

之前我们讨论了, IPv4协议中, IP地址数量不充足的问题 NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能

  • NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
  • 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
  • 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;

  • 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路由器如何判定将这个数据包转发给哪个局域网的主机? 这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系

  1. 其实在进行地址转换的过程中,可能不一定只替换原IP,必要的时候,源端口也要被替换
  2. 路由器在NAT转化的过程中,除了单纯的替换,还会为我们根据报文请求的四元组(源IP,源端口,目的IP,目的端口),为我们构建一个映射关系
  3. 源IP表示唯一的一台主机,源端口表示该主机上唯一的一个进程,所以源IP+源端口就表示该主机的唯一一个进程,就可以确定自己在自己的内网中的唯一性
  4. 所以无论是从内向外,还是从外向内,都能在各自的网络中,表示唯一性,所以这个映射关系是:互为KEY值的
  5. 如果从来没有访问过外网,那么能直接访问内网吗?-----理论上是不能的,因为无法进行NAT转化,我们无法更改目的IP和端口进而访问客户端
  6. 但是又很多基于NAT原理的软件,能够帮我们进行外网访问-----内网穿透

NAT技术的缺陷

由于NAT依赖这个转换表, 所以有诸多限制:

  • 无法从NAT外部向内部服务器建立连接;
  • 装换表的生成和销毁都需要额外开销;
  • 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;

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

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

相关文章

拼图小游戏制作教程:用HTML5和JavaScript打造经典游戏

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

redisson解决redis服务器的主从一致性问题

redisson解决redis的主节点和从节点一致性的问题。从而解决锁被错误获取的情况。 实际开发中我们会搭建多台redis服务器,但这些服务器分主次,主服务器负责处理写的操作(增删改),从服务器负责处理读的操作,…

【洛谷 P1824】进击的奶牛 题解(二分答案+循环)

进击的奶牛 题目描述 Farmer John 建造了一个有 N N N( 2 ≤ N ≤ 1 0 5 2 \leq N \leq 10 ^ 5 2≤N≤105) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x 1 , x 2 , ⋯ , x N x _ 1, x _ 2, \cdots, x _ N x1​,x2​,⋯,xN​&#xf…

【算法面试题】-05

智能成绩表 class Student:def __init__(self):self.name "" # 学生名字self.scores [] # 每门课成绩students [Student() for _ in range(10004)] # 存储学生信息的数组 key_index 0 # 要排序的课程名的下标# 自定义排序函数 def student_comparator(a, b):…

07 数据结构之图

# Makefile CCgcc CFLAGS -g -Wall SRCStest.c graph.c link_queue.c OBJS$(SRCS:.c.o) #variable replace APPtestall:$(OBJS) #指定一个目标, 不然默认目标不会检查依赖文件的时间戳$(CC) $(SRCS) -o $(APP) .PH…

协程库项目—协程类模块

ucontext_t结构体、非对称协程 协程类 ucontext_t结构体 头文件中定义的四个函数(getcontext(), setcontext(), makecontext(), swapcontext())和两个结构类型(mcontext_t, ucontext_t)在一个进程中实现用户级的线程切换。 其中…

NXP iMX8MM Cortex-M4 核心 GPT Capture 测试

By Toradex秦海 1). 简介 NXP i.MX8 系列处理器均为异构多核架构 SoC,除了可以运行 Linux 等复杂操作系统的 Cortax-A 核心,还包含了可以运行实时操作系统比如 FreeRTOS 的 Cortex-M 核心,本文就演示通过 NXP i.MX8MM 处理器集成的 Cortex-…

brpc之Channel

简介 Channel是brpc的通信类,继承于RpcChannel,RpcChannel是protobuf中的类,用于服务通信 Channel #mermaid-svg-HdRl5ZFGKiLhYVuW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

Sqllab第一关通关笔记

知识点: 明白数值注入和字符注入的区别 数值注入:通过数字运算判断,1/0 1/1 字符注入:通过引号进行判断,奇数个和偶数个单引号进行识别 联合查询:union 或者 union all 需要满足字段数一致&…

《领导的气场——8堂课讲透中国式领导智慧》读书笔记

整体感悟 个人感觉书籍比较偏说教、理论,没有看完。 现仅仅摘录自己“心有戚戚焉”的内容。 经典摘录 管理的本质是通过别人完成任务。有一百件事情,一个人都做了,那只能叫勤劳;有一百件事情,主事的人自己一件也不做&…

子类的继承性

继承性 类有两种重要的成员: 成员变量和方法 子类的成员 ① 自己声明定义 ②从父类继承 ① 成员变量的继 把继承来的变量作为 自己的一个成员变量 (如同在子类中直接声明一样); 可被子类中自定义的任何实例方法操作 。 ② 方法…

虚拟机中安装Win98

文章目录 一、下载Win98二、制作可启动光盘三、VMware中安装Win98四、Qemu中安装Win981. Qemu的安装2. 安装Win98 Win98是微软于1998年发布的16位与32位混合的操作系统,也是一代经典的操作系统,期间出现了不少经典的软件与游戏,还是值得怀念的…

【牛客】CM26 二进制插入 HJ60 查找组成一个偶数最接近的两个素数

目录 题目一:二进制插入 题目链接:二进制插入_牛客题霸_牛客网 (nowcoder.com) 解题思路: 代码实现: 题目二:查找组成一个偶数最接近的两个素数 题目链接:查找组成一个偶数最接近的两个素数_牛客题霸_…

【sgPhotoPlayer】自定义组件:图片预览,支持点击放大、缩小、旋转图片

特性&#xff1a; 支持设置初始索引值支持显示标题、日期、大小、当前图片位置支持无限循环切换轮播支持鼠标滑轮滚动、左右键、上下键、PageUp、PageDown、Home、End操作切换图片支持Esc关闭窗口 sgPhotoPlayer源码 <template><div :class"$options.name"…

线程和进程

参考链接&#xff1a; 1.基本概念 进程&#xff1a;Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。例如打开浏览器就是一个进程 线程&#xff1a;进程中的一个执行任务&#xff08;控制单元&#xff09;&#xff0c;负责当前进程中程序的执行。一个进程至少有一个…

无人机|LQR控制算法及其无人机控制中的应用仿真

前言 LQR全称Linear Quadratic Regulator&#xff08;线性二次调节器&#xff09;&#xff0c;顾名思义用于解决形如 x ˙ A x B u y C x D u \begin{aligned}\dot{x}&AxBu\\y&CxDu\end{aligned} x˙y​AxBuCxDu​ 线性时不变系统的一种线性控制方法&#xff0c;…

初识REDHAWK

文章目录 前言一、什么是 REDHAWK?1、概述2、REDHAWK 的应用 二、REDHAWK 的流程管理和交互方法1、流程管理2、数据传输 三、入门1、安装 REDHAWK2、IDE 快速入门①、启动 REDHAWK IDE②、打开 Chalkboard③、创建信号发生器④、测试组件的输入/输出响应 前言 REDHAWK 是一个…

Opencv 绘制线段、矩形、圆形、多边形操作

1、前言 OpenCV提供了许多用于绘制图形的方法 包括绘制线段的line()方法、绘制矩形的 rectangle()方法、绘制圆形的 circle()方法、绘制多边形的 polylines()方法和绘制文字的 putText()方法 本章将依次对上述各个方法进行讲解&#xff0c;并作出相应实验。 因为 OpenCV 中的…

简洁的链式思维(CCoT)提示

原文地址&#xff1a;Concise Chain-of-Thought (CCoT) Prompting 传统的CoT导致了输出令牌使用的增加&#xff0c;而CCoT提示是一种旨在减少LLM响应的冗长性和推理时间的提示工程技术。 2024 年 1 月 24 日 Areas where Chain-Of-Thought-like methodology has been introd…

【C/C++ 学习笔记】函数

【C/C 学习笔记】函数 视频地址: Bilibili 函数结构 返回值类型函数名参数列表函数体语句return 表达式 返回值类型 函数名 (参数列表) {函数体语句;return 表达式; }声明 在函数定义之前声明函数&#xff0c;可以声明多次&#xff0c;但是只能定义依次 返回值类型 函数名…