【Linux】网络--数据链路层--以太网
个人主页~
网络--数据链路层
- 一、以太网
- 二、以太网帧格式
- 三、局域网通信原理
- 四、最大传输单元MTU
- 五、ARP协议
- 1、概念
- 2、ARP数据报格式
- 3、ARP数据报工作流程
- RARP数据报的工作流程
- 六、详解NAT技术
- 1、NAT
- 2、NAPT
- 3、NAPT vs 基本NAT
一、以太网
以太网是一种技术标准,包含数据链路层以及物理层的内容,是当今世界上应用最广泛的局域网技术,其兼容性强,成本低,扩展性高
二、以太网帧格式
-
以太网帧
- 目的地址和源地址:就是我们说的MAC地址,MAC地址是一种出厂固化的地址,是指网卡的硬件地址,共48位6字节
- 类型:用于标识以太网首部后面所跟数据包的类型,即指示该帧处理完成后应被发送到哪个上层协议进行处理,共有三种协议:IP、ARP、RARP
- 数据:就是有效载荷,也就是网络层报文
- CRC:帧校验,通过算法对帧的某些值取出后进行计算得出的结果,接收方也有这样的一套算法,也会取出这些值进行计算,若两者结果相同,则说明帧正确,不相同则丢弃重发
-
图中下面三个就是不同类型的数据报的,其中类型很明确,0800是IP类型,0806是ARP类型,8035是RARP类型,除了类型以外的就是填充在以太网帧的数据段中的,也就是有效载荷,然后对于ARP和RARP,PAD是以太网帧的补位工具,因为要确保以太网帧的总长度要大于等于64帧
- 其中ARP(地址解析协议)和RARP(反向地址解析协议),前者专门用来通过IP地址查找MAC地址,后者专门用来通过MAC地址查找IP地址,有关于它们的详细介绍下面我们再谈
三、局域网通信原理
-
局域网内通信
-
假设此时局域网中只有MAC1在发消息,MAC1发送到局域网中的消息是会被所有主机接收的,只是我们当前MAC1发送的报文是给MAC5的,所以其他主机在收到消息之后,检查一下目标地址,嘿,不是我,那我扔了,之后MAC5在接收到消息后会将其继续向上传输
-
实际上局域网是一种临界资源,我们在使用网络时发生卡顿,实际上是使用用户太多,其中的消息发送太多,消息和消息数据发生碰撞导致丢失重传
-
-
跨局域网通信
- 发送的报文会在数据链路层拆下MAC报头,然后在网络层拆下IP报头,然后重新封装IP报头,重新封装MAC报头
- MAC地址作用于局部,只知道下一站而不知道终点站,IP地址就是只知道终点站,而不知道下一站,相互配合下,实现最终到达终点站的目的
四、最大传输单元MTU
- 以太网帧中的数据长度规定最小为46字节,最大1500字节,最大值也被称为以太网的最大传输单元MTU,不同的网络类型有不同的MTU
- 如果一个数据包长度大于MTU,那么就会对其进行分片
- 不同数据链路层标准的MTU不同
- TCP单个数据报的最大消息长度:MSS
- 整个在以太网帧中,去掉以太网包装的头尾,再去掉IP报头,再去掉TCP报头,剩下的就是真正的数据的最大长度
- 在MTU的情况下,剩下的这部分就是MSS,因为我们尽量的还是最好不要分片,所以这个MSS也是不分片的最大限度
- MSS的值在TCP首部的40字节的变长选项中
- 通信双方在三次握手的时候会写入交换MSS的值,选取最小的为最终的MSS
- 对于UDP来说MSS就比较简单了,加上报头等于MTU就行了
五、ARP协议
1、概念
- ARP协议不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议
- ARP协议用来建立主机IP地址和MAC地址的映射关系,其特点就是知道通信对方的IP地址而不知道其MAC地址,通过ARP报文的作用,得到对方MAC地址,从而进行数据传输
2、ARP数据报格式
- 前两个就是目的MAC地址和源MAC地址:需要注意的是,这里的目的MAC地址填的是全F:
FF:FF:FF:FF:FF:FF
,表示广播,因为我们不知道我们的目的MAC地址,所以我们要让所有主机收到这个信息 - 帧类型:0x0806,ARP数据报
- 硬件类型:指链路层网络类型,填1为以太网
- 协议类型:指要转换的地址类型,0x0800为IP地址(这里的类型格式同帧类型,指的是知道对方的IP地址,要转换成MAC地址)
- 硬件地址长度:就是MAC地址这样的硬件地址的长度,MAC地址的长度为6,所以填0x06
- 协议地址长度:就是IP地址这样的协议地址的长度,IPv4地址的长度为4,所以填0x04
- op:指操作码,1表示ARP请求,2表示ARP响应,3表示RARP请求,4表示RARP响应
- 发送端以太网地址:本机MAC地址
- 发送端IP地址:本机IP地址
- 目的以太网地址:全0(因为不知道)
- 目的IP地址:对方IP地址
3、ARP数据报工作流程
-
当网络层想要给对方发送消息时,发现没有对方的MAC地址只知道对方的IP地址(大部分情况下大家都是不知道对方的MAC地址的),然后就会构建一个ARP请求,在数据链路层的上层,封装一个报文填写方式按照前面的样式填写,然后交付到数据链路层,数据链路层给它做图中以太网首部以及最后一个CRC校验位的封装,封装完成后发到局域网中,所有在这个局域网中的主机都会收到这个信息,收到信息后拆下以太网报头以及CRC校验位,然后对op进行查看,发现报文是ARP请求,然后对目的IP值进行比对,发现不是发给自己的那就扔掉,是发给自己的那就收到后就得到了本机的MAC地址和IP地址,然后给本机一个响应,此时对方按照上面的字段对数据报进行填写,op此时是2,精准返回到请求方的主机,我们就知道对方的MAC地址和IP地址了
-
在收到ARP响应之后的本机会在自身的ARP表中维护一段时间的对方主机的信息,以便于继续发送消息,在经过这段时间之后,如果我们还要给对方主机发送消息,那么需要重新进行ARP请求
-
只能在局域网中进行ARP的请求
RARP数据报的工作流程
RARP的结构与ARP相同,只是更加简单,因为我们可以定向的将数据发送到指定的MAC主机,然后由这个主机再精准返回
六、详解NAT技术
1、NAT
前面详细的介绍过NAT技术,这是为了应对IP地址不足而做出的策略,将IP分为公网IP和私网IP,然后公网中不能出现私网IP,通过路由器层层转换,将私网IP转换为公网IP,但是在这里我们会有一个疑问,我们确实是发出去了,我也是唯一的,但是它回来的时候咋回来,一个局域网内有多个主机访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的,我们怎么能精准返回呢,这里就要请出NAPT来解决这个问题了
2、NAPT
NAPT使用IP地址+端口号来建立这个关系,就是我们前面在编程的时候所用到的端口号,也是我们一直没有提的,现在可以敞开说了
场景:路由器(NAPT设备)分配内网IP 192.168.1.0/24,公网IP为202.100.1.1。
-
主机A(192.168.1.2:1000)访问百度
- 原始数据包:源IP 192.168.1.2:1000 → 目标IP 180.101.49.12:80
- NAPT转换:源IP变为202.100.1.1:50001(随机端口),记录映射表:
192.168.1.2:1000 ↔ 202.100.1.1:50001
- 发送至公网:源IP+端口为202.100.1.1:50001
-
主机B(192.168.1.3:2000)同时访问百度
- NAPT转换:源IP变为202.100.1.1:50002,映射表新增:
192.168.1.3:2000 ↔ 200.100.1.1:50002
- 公网看到两个不同端口的请求,均来自202.100.1.1
- NAPT转换:源IP变为202.100.1.1:50002,映射表新增:
-
百度响应时
- 响应包目标IP+端口为202.100.1.1:50001(或50002)
- NAPT设备根据映射表,将目标转换为192.168.1.2:1000(或192.168.1.3:2000),转发回对应主机
端口号是区分不同内网主机的唯一标识,NAPT设备通过维护动态映射表(IP+端口)实现双向通信
3、NAPT vs 基本NAT
特性 | 基本NAT(一对一) | NAPT(多对一) |
---|---|---|
地址消耗 | 每个设备需独立公网IP | 多个设备共享1个公网IP |
端口处理 | 端口不变 | 端口随机或指定范围映射 |
适用场景 | 服务器对外映射 | 家庭/企业内网共享上网 |
今日分享就到这里了~