Linux(12)(下)

https://blog.csdn.net/qscftqwe/article/details/157249052

上节课链接,大家可以点击观看!

一.数据链路层

引入:

数据链路层解决的是直接相连设备之间的数据帧可靠交付问题;在同一个局域网中,它通过 MAC 地址唯一标识并区分每一台设备。

1.1 以太网帧的格式和数据链路层的知识

  • **目的地址/源地址:**数据链路层解决的是直接相连设备之间的数据帧可靠交付问题,因此目的地址就是对方的Mac地址,源地址就是自身的Mac地址!

  • 类型: 以太网帧中的 "类型"字段 (Type / EtherType)用于标识该帧所承载的上层协议类型,从而让接收方知道如何处理帧中的数据。

  • CRC(循环冗余校验码):是验证码的一种

  • **PAD(填充字节):**因为ARP和RARP它们的长度不符合最低46字节,因此PAD就是把缺的部分补上!

1.认识MAC:

  • MAC地址用来识别数据链路层中相连的节点;

  • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19),在网卡出厂时就确定了, 不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)。

2.对比理解MAC地址和IP地址

  • IP地址描述的是路途总体的 起点 和 终点

  • MAC地址描述的是路途上的每一个区间的起点和终点

**举个例子:**A要发数据到D,那么要经过B,C,IP的源地址就是A,目的地址是D,而MAC地址A------B,B------C,C------D。

3.认识MTU

MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路层技术标准决定 ,而这些标准又受到受底层物理介质和硬件

  • 以太网帧的数据字段 长度规定为 46 ~ 1500 字节 。若上层协议数据(如 ARP 报文)不足 46 字节 ,则需在末尾添加 填充字节,使总数据长度达到至少 46 字节;

  • 1500 字节称为以太网的 MTU (最大传输单元),表示该链路能承载的上层协议数据

  • 不同数据链路层标准(如 PPP、Wi-Fi、FDDI)具有不同的 MTU 值。

1.2 MTU对UDP和TCP的影响

UDP:

  • **一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),**那么就会在网络层分成多个IP数据报

  • 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。

TCP:

  • TCP 的单个报文段不能无限大,其大小受限于底层网络的 MTU 。 为了避免 IP 层分片 ,TCP 引入了 MSS ,表示TCP 报文段中数据部分的最大长度(不包括 TCP 和 IP 首部)。

  • 在 TCP 三次握手建立连接时,通信双方会在 SYN 报文的 TCP 选项字段 中携带自己支持的 MSS 值:

​ 通常,MSS = 本地 MTU − IP 首部长度 − TCP 首部长度 ; (例如以太网 MTU=1500 → MSS = 1500 − 20 − 20 = 1460 字节

  • 双方收到对方的 MSS 后,会取较小值作为本次连接的最终 MSS,确保双方发送的数据段都不会导致 IP 分片。

二.ARP协议

引入:

ARP 是网络层协议(TCP/IP可能是因为从功能上来看,OSI则认为是数据链路层可能是因为其采用帧的格式),但它不封装在 IP 数据报中,而是直接封装在数据链路层帧中 (如以太网帧),因此它"位于网络层底部,紧贴数据链路层"。

作用:ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.

  • 同一局域网 中进行通信时,源主机的应用程序知道目的主机的 IP 地址和端口号 ,但不知道其硬件地址 (MAC 地址)。 数据帧到达主机后,网卡首先检查目的 MAC 地址

  • 如果与本机 MAC 地址不匹配 (且不是广播地址),则直接丢弃,不会交给上层协议处理;

  • 因此,在发送数据前,源主机必须通过 ARP 协议 获取目的主机的 MAC 地址,并将数据封装在以太网帧中发送。

ARP格式:

  • **以太网目的地址:**要发给谁(请求的时候,这个为全1)

  • **以太网源地址:**发送人是谁

  • 帧类型:固定0806,其作为数据帧的类型之一

  • 硬件类型: 指链路层网络类型,1为以太网

  • 协议类型: 指要转换的地址类型,0x0800为IPv4

  • **硬件地址长度:**对于以太网地址为6字节

  • **协议地址长度:**对于和IP地址为4字节

  • **op:**字段为1表示ARP请求;op字段为2表示ARP应答

  • **发送端以太网地址和IP地址:**发送人的MAC地址和IP地址

  • **目的以太网地址和IP地址:**接收人的MAC地址和IP地址

ARP工作流程:

例子为A发给C

  1. A 首先构造一个 ,ARP 请求报文,因为它不知道目标 IP 对应的 MAC 地址。

    在以太网帧中,目的 MAC 地址字段填为全 F (即 FF:FF:FF:FF:FF:FF,广播地址),表示该帧将被局域网内所有设备接收。

  2. 局域网中的每个设备收到该帧后:

  • 首先在数据链路层检查目的 MAC 地址 ;如果是广播或本机 MAC,则上送至网络层处理;否则直接丢弃(不会进入网络层)。

  • 对于上送的设备(如 B 和 C),会解析 ARP 报文中的操作码(op):

    • 若 op = 1(请求),则检查 ARP 报文中"目标协议地址"(即要查询的 IP)是否等于本机 IP;

    • 如果匹配,则构造 ARP 应答;如果不匹配(如 B 的情况),则丢弃该 ARP 请求(注意:B 是在网络层判断 IP 后丢弃,但前提是它已通过 MAC 地址过滤,进入了上层)。

3 .假设 C 的 IP 与 A 查询的目标 IP 匹配:

  • C 构造 ARP 应答报文 (op = 2),并将以太网帧的目的 MAC 地址设为 A 的 MAC 地址(单播,因为其他设备MAC匹配不上,因此不会进入网络层,也就不会检测ARP报文);

  • 当 C 发送该应答帧时,B 收到后在数据链路层发现目的 MAC 不是自己也不是广播,立即丢弃,根本不会送到网络层

  • A 收到后,确认目的 MAC 是自己,解析 ARP 应答,根据 op=2 判定为应答 ,于是更新本地 ARP 缓存(将 IP 与对应的 MAC 地址绑定)。

ARP周边问题:

  1. ARP 会缓存结果

    • 主机在收到 ARP 应答后,会把 IP → MAC 的映射存入本地 ARP 缓存表

    • 后续通信直接查表,不用每次都广播请求,提高效率。

  2. 多次 ARP 应答,以最新为准

ARP欺骗问题:

A :普通用户(IP=192.168.1.10);B :网关/路由器(IP=192.168.1.1);C:攻击者(IP=192.168.1.20)

  1. C 向 A 发送伪造 ARP 应答:

    "我是网关(192.168.1.1),我的 MAC 是 CC(C 的 MAC)"→ A 更新 ARP 表:192.168.1.1 → CC

    如果只伪造了网关,C还给他流量转发,那么A还可以上网,如果不转发那么A就上不了网这个就叫ARP 拒绝服务攻击(DoS)。

  2. C 向 B(网关)发送伪造 ARP 应答:

    "我是 A(192.168.1.10),我的 MAC 是 CC"→ 网关更新 ARP 表:192.168.1.10 → CC

    如果伪造了用户又伪造了网关,那么用户/网关接收到的应答都是C想给它们的,因此危险巨大,这个叫双向欺骗

三.RARP协议

RARP 的作用与 ARP 相反:

  • ARP :已知 IP → 查询对应的 MAC 地址(IP → MAC)

  • RARP :已知 MAC → 查询对应的 IP 地址(MAC → IP)

不过该协议,基本被弃用

四.DNS

DNS作用:

DNS,帮助我们输入网址的时候不需要输入IP,只需要输入一串字符串 比如:<www.baidu.com>,DNS会把这个域名转换成IP地址

域名简介:

bash 复制代码
www.baidu.com

com: 一级域名,表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.

baidu: 二级域名,公司名.

www: 三级域名,主机名,提供WWW服务,可以省略

五.ICMP协议

引入:

ICMP协议是一个 网络层协议

功能:

  • 确认IP包是否成功到达目标地址。

  • 通知在发送过程中IP包被丢弃的原因。

  • ICMP也是基于IP协议工作的。ICMP只能搭配IPv4使用。如果是IPv6的情况下, 需要是用ICMPv6。

IP 只管发,ICMP 负责说"到没到"和"为啥失败"。 采用ICMP,使用原始套接字实现,此时应用层直接操作 IP+ICMP,跳过 TCP/UDP。

分类:

  • 一类是通知出错原因

  • 一类是用于诊断查询

  • 其中这两个的实现,就是我们常用的ping

ping命令:

  • 注意, ping命令ping 的是域名或IP, 而不是url!

  • ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL**(其中时间代表的是往返延迟,TTL表示还能跳几次,一跳就是经过一个路由器)。**

  • ping命令会先发送一个 ICMP Echo Request给对端;

  • 对端接收到之后, 会返回一个ICMP Echo Reply;

六.NAT技术

NAT引入:

NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。

  • **NAT能够将私有IP对外通信时转为公网IP。**也就是就是一种将私有IP和公网IP相互转化的技术方法

  • 很多学校, 家庭, 公司内部每个终端设置私有IP, 而在路由器或必要的服务器上设置公网IP

NAT IP转换过程:

NAT路由器将源地址从10.0.0.10替换成公网IP 202.244.174.37;

NAT路由器收到外部的数据时, 又会把公网IP从202.244.174.37替换回10.0.0.10;

但是有这样一个问题,就是如果A,B,C都访问同一个服务器,那么路由器怎么知道这个应答,要发送给那个客户端呢,这就需要用到NAT表。

NAT表:

这个表就记录了,私有IP转公网IP,对于之前的问题即任何区分A,B,C,采用端口,这样就可以区分了!你可以把一块白色区域当作一个字符串,该字符串是唯一的,因此可以区分。

NAT缺陷:

  • 无法从NAT外部向内部服务器建立连接。
    因此服务器是不能主动和设备进行通信,必须要由设备主动访问服务器才可以

  • 装换表的生成和销毁都需要额外开销。

  • 通信过程中一旦NAT设备异常, 所有的TCP连接也都会断开,因此又要重新创建转换表。

内网穿透frp

  1. 首先你A设备要访问C设备是不可能的,可是你要想让A访问C中设备怎么办呢?

  2. 首先你需要frp,让服务器用frps,C设备用frpc,让frpc向frps构建TCP连接,这样就建立了一条链接,然后让A访问frps,然后frps再把数据发送给frpc

  3. frpc在发给frps,然后frps在发给A,这样就完成了A和C的通信

七.代理服务器

  • 代理服务器 是一个"中间人",代表客户端去访问目标服务器。它站在客户端和目标服务之间,接收你的请求,再替你转发给真正的服务器,并把结果返回给你。

  • 图中设备用到校园网,因此会把数据发送给学校服务器,然后让学校服务器帮你访问资源,因此你用校园网访问的资源,学校是可以看到的!

代理服务器的种类:

  • 正向代理: 对客户端,代表客户端访问外部资源

  • 反向代理: 对服务器,代表服务器接收外部请求

因此之前的内网穿透的那个frps就是反向代理,因为A访问C,那么C(frpc)相当于服务器,而那个frps就是为了服务C,因此是反向代理!

隧道技术:

  • 隧道技术通过将一种协议的报文封装到另一种协议的有效载荷中,使其能够穿越原本不支持该协议的网络(如公网)

例子:

  • 你需要一台拥有公网 IP 的云服务器,客户端发送一个数据包,其"外层 IP 头"指向服务器(隧道出口),而"内层 IP 包"包含真正的目标地址(如 8.8.8.8www.google.com 的 IP); 公网服务器收到后,剥去外层封装,根据内层 IP 去访问外网,并将响应原路返回。

  • 还有其他的实现,这个例子只是其中一种而已

八.NAT和代理服务器的区别

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

  • 从底层实现上讲, NAT是工作在网络层 ,直接对IP地址进行替换。代理服务器往往工作在应用层。

  • 从使用范围上讲, NAT一般在局域网的出口部署代理服务器可以在局域网做,也可以在广域网做,也可以跨网。

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

那么关于网络层和数据链路层的知识就讲到这里了!

相关推荐
郝亚军2 小时前
如何在windows11和Ubuntu linux之间互传文件
linux·运维·ubuntu
ghostmen2 小时前
Kuboard 离线安装与 K3s 集群绑定完整指南
linux·kuboard·k3s
j_xxx404_2 小时前
Linux:进程状态
linux·运维·服务器
济6172 小时前
linux 系统移植(第二十三期)---- 进一步完善BusyBox构建的根文件系统---- Ubuntu20.04
linux·运维·服务器
程序员 _孜然2 小时前
openkylin、ubuntu等系统实现串口自动登录
linux·运维·ubuntu
hweiyu002 小时前
Linux 命令:csplit
linux·运维·服务器
守正出琦2 小时前
Linux信号核心函数速查表
linux·运维·服务器
花花鱼2 小时前
Linux中的755及644等等速记
linux·运维·服务器
草草_2 小时前
【内核驱动基础】主设备号与次设备号
linux·内核驱动