目录
[1. 数据链路层的主要功能](#1. 数据链路层的主要功能)
[2. MAC帧报文](#2. MAC帧报文)
[3. 局域网通信原理 && 数据碰撞问题](#3. 局域网通信原理 && 数据碰撞问题)
[4. MAC 帧的 MTU 与 TCP 协议的 MSS](#4. MAC 帧的 MTU 与 TCP 协议的 MSS)
[5. ARP 协议](#5. ARP 协议)
[① ARP 协议的原理](#① ARP 协议的原理)
[② ARP 协议的报头](#② ARP 协议的报头)
[③ 模拟一次 ARP 过程](#③ 模拟一次 ARP 过程)
[④ ARP 协议的相关问题](#④ ARP 协议的相关问题)
[⑤ 基于 ARP 的中间人模式](#⑤ 基于 ARP 的中间人模式)
[6. DNS 与 ICMP](#6. DNS 与 ICMP)
[① DNS 协议](#① DNS 协议)
[② ICMP 协议](#② ICMP 协议)
[7. NAT 技术与代理服务器](#7. NAT 技术与代理服务器)
[① NAT 技术](#① NAT 技术)
[② 代理服务器](#② 代理服务器)
[③ 两者的区别](#③ 两者的区别)
1. 数据链路层的主要功能
前面我们说网络层的功能是提供一种能够将数据跨网络从A主机传输到B主机的能力,而数据链路层解决的是直接相连的主机之间(如电脑与路由器)进行数据交付的问题!
2. MAC帧报文
MAC 地址用于区分在同一个局域网中的不同的主机。接下来让我们来看看 MAC 帧的报文,这里举例几种,如图所示
要学习协议我们得先搞懂几个问题
MAC 帧如何解包与封装呢?------通过定长报文解决!
如何确定交给上层的哪个协议呢?------报头中有一个协议字段,如上图所示,类型为 0800 表示要交付给 IP 协议,类型为 0806 表示要交付给 ARP 协议。
3. 局域网通信原理 && 数据碰撞问题
我们先前提到过以太网通信原理(见Linux网络------网络初识),如图所示
在这个局域网通信的过程中,其实有很多的主机都能收到这个报文!这样就会产生数据碰撞的问题,也就需要我们提出碰撞避免的算法,即让双方都等一等,然后重新发送。可以看到,局域网中主机越多,发生碰撞的概率就越大,那我们该怎么办呢?------划分碰撞域,减少局域网碰撞!因此出现了交换机这一设备,举个例子
假如在 H3 与 H8 之间存在一个交换机, H1 与 H7 都在交换机的左边,就会让报文不传递到交换机右边,以此来划分碰撞域从而降低碰撞概率。
4. MAC 帧的 MTU 与 TCP 协议的 MSS
从 MAC 帧的报文中我们可以看到数据的范围是 [46, 1500] 这里的 1500 实际上就是 MTU 的大小,虽然我们在 IP 层有讲过分片的概念,但是分片是一个不太好的操作(容易引起重发降低效率),因此我们在协议层应该尽量减少分片,而产生分片问题的根源在 TCP 协议!因此我们从下向上推,如图所示
通过计算,我们计算出了确保发送的数据包不会超过接收方和中间网络设备能够处理的最大尺寸(1460),从而避免在IP层进行分片,这个最大尺寸就是我们所说的 MSS(Maximum Segment Size) ,即最大报文段长度。
5. ARP 协议
所谓的将数据发送到目标网络,本质上是通过无数个连续的子网来实现的。我们来看下面这个情况
主机 A 想向网络中的主机 B 发送数据,但是主机 A 要想将数据交给主机 B,前提是要先知道主机 B 的 MAC 帧(网络协议栈是这样规定的!),那我们如何知道主机 B 的 MAC 帧呢?------通过 ARP 协议!
ARP(Address Resolution Protocol)即地址解析协议,它用于将网络层的IP地址解析为数据链路层的MAC地址。
① ARP 协议的原理
如图所示
② ARP 协议的报头
如图所示,我们可以看到
- 源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次。对于数据链路层为以太网的情况是多余的,但如果数据链路层是其它类型的协议则有可能是必要的
- 硬件类型指链路层的网络类型,1 为以太网
- 协议类型指要转换的地址类型,0x0800 为 IP 地址
- 硬件地址长度若为以太网地址则为 6 字节
- 协议地址长度若为 IP 地址则为 4 字节
- op 字段为 1 表示 ARP 请求;op 字段为 2 表示 ARP 应答
此外,虽然 ARP 协议属于 MAC 帧的上层,但是我们也将其归属到数据链路层。
③ 模拟一次 ARP 过程
如图
此时,主机 R 想知道主机 B 的 MAC 地址,因此它发出了一个 ARP 请求报文,如图
同时,对于任意一台主机而言,它既有可能会收到应答,也有可能对别人发起 ARP 请求,因此在接收/发送报文时,会先看 op 字段,如果为 1 则表示这是个 ARP 请求报文;若为 2 则表示这是个 ARP 应答报文。
在局域网中,当主机 B 收到了一个 ARP 请求报文(发现 op 置为 1)时,会将目的 IP 与自己的 IP 进行对比,若相同就会发送 ARP 应答报文,反之则丢弃。其发送的 ARP 应答报文如下
然后主机 R 捕获到这个应答报文,ARP 完成!在 ARP 的整个过程中
收到的任何 ARP 报文,都要优先看 op 字段
op 决定了什么东西呢?------ ARP 的类型,如果发现是请求报文就会查看它的目的 IP 和目的 MAC;如果是应答报文就会查看它的源 IP 和源 MAC。
④ ARP 协议的相关问题
ARP 后,目标主机的 MAC 地址和 IP 地址会被当前主机缓存起来,临时保存好。所以
ARP 并不需要每次都做,只有在缓存失效的时候才会进行
可以通过自己的 IP 和 子网掩码得到自己的网络号,然后拼接 IP 地址,ping 所有的主机,从而得到所有主机的 IP 地址和 MAC 地址
如果收到多次同样的 ARP 应答,会以最新的应答报文为准
除了 ARP 协议外,还有一种 RARP 协议,它与 ARP 协议类似,只不过它的功能是根据 MAC 地址来找 IP地址。
⑤ 基于 ARP 的中间人模式
如果主机 A 想给路由 R 发送 ARP 请求,但在这个过程中请求报文被主机 M 拦截并替换成 自己的 IP 地址与 MAC 地址,如图所示
这样,对于主机 M 来说,可以通过将主机 A 发出来的所有报文都丢失从而达到一种定向断网的效果。我们将这种基于 ARP 的中间人模式称为 ARP 欺骗。
6. DNS 与 ICMP
① DNS 协议
DNS(Domain Name System,域名系统)协议是互联网上用于将域名和IP地址相互映射的一个分布式数据库系统。
举个例子,当我们访问 www.qq.com 时,会发生如下所示的事
浏览器一般都内置了 DNS 服务的服务器 IP 地址,因此在收到一个域名时,会先使用 DNS 服务获取域名 IP 地址,然后再直接访问!
② ICMP 协议
ICMP(Internet Control Message Protocol,互联网控制消息协议)是一种网络层协议,用于在IP主机、路由器之间传递控制消息。ICMP消息用于提供有关网络通信的反馈,如无法到达目的地、时间超过等。
比如我们可以在应用层使用 ping 命令来进行网络诊断,如图
实际上,我们使用的 ping 命令绕过了 TCP/UDP 转而直接使用 ICMP 协议,而 ICMP 获取到结果后也不向上交付,而是直接返回结果。因为 ping 命令是基于 ICMP 协议,而 ICMP 处于网络层,所以并不需要关心端口号这样的信息!
7. NAT 技术与代理服务器
① NAT 技术
之前在介绍 IP 协议时我们就曾提到过 NAT 技术(见Linux网络------网络层⑦私有子网小节),如图
我们将私有 IP 不断被替换的技术称为 NAT 技术,它是路由器的一个重要功能。那现在加入有 10.0.0.10、10.0.0.11、10.0.0.12 同时向外发送报文,那回来的时候 IP 报文相同怎么办呢?------路由器中会构建一张映射表(NAPT 转化表),事实上, NAT 操作如图所示
也就是说,NAT 在替换的时候,不仅会替换 IP地址,也会替换端口号,从而做到一一对应转换!
那如果是公网上的两个私有子网如何互相访问呢?
先将一个机器借公共服务器建立 TCP 长连接,然后把请求发给服务器,服务器通过特定映射将指令发送给该机器
我们将从外部网络(如互联网)访问位于内网(局域网)中的资源 这样的技术称为 内网穿透。比如,我们可以使用 FRP 这一反向代理应用来操作。
② 代理服务器
要讲代理服务器,我们可以使用一个最简单的例子来举例------校园网,如图所示
我们想要使用校园网上网都要先进行登录认证,那么登录认证是在干啥呢?------获取局域网 IP 地址!像学校服务器这种代理服务器属于正向代理,那有没有反向代理呢?有的,举个例子
有些时候,主机在访问一个服务器时,只会访问一台机器,这会导致只有一台机器在工作,而其他机器处于闲置状态,即会造成负载不均衡的情况,此时我们将这个服务器作为代理服务器,将任务按一定的规则分发给不同的机器,从而达到负载均衡,这种代理服务器就属于反向代理,我们前面提到的内网穿透软件 FRP 就属于反向代理服务器!再举个例子
常规情况下,HTTP 默认携带的是非 HTTP 的其他数据,但当我们使用 XX 时,就可以使用上图的方式,我们将这种技术称为 HTTP的隧道技术!
③ 两者的区别
NAT(网络地址转换)和代理服务器都是网络技术,它们都可以隐藏内部网络的细节,但它们在实现方式和用途上有所不同。它们的主要区别如下
NAT(网络地址转换)
地址转换:NAT的主要功能是将私有(内部)IP地址转换为公共(外部)IP地址,使得多个设备可以共享单个公共IP地址访问互联网。
透明性:对于终端设备来说,NAT通常是透明的,不需要对终端设备进行配置或修改应用程序。
路由器功能:NAT通常在路由器上实现,自动为经过路由器的所有出站流量进行地址转换。
一对一或一对多映射:NAT可以实现一对一或一对多的地址映射,即一个公共IP可以映射到多个私有IP。
无状态操作:NAT操作通常是无状态的,即它不维护连接状态信息,每个数据包的地址转换是独立的。
代理服务器
中间人:代理服务器作为客户端和服务器之间的中间人,接收客户端的请求并转发到目标服务器,然后再将服务器的响应返回给客户端。
非透明性:客户端需要知道代理服务器的存在,并且通常需要在客户端配置代理服务器的地址和端口。
应用层操作:代理服务器在应用层工作,它可以处理特定的协议,如HTTP、FTP等,并可能对数据进行缓存、过滤或修改。
一对一映射:代理服务器通常为每个客户端连接提供一个单独的映射,而不是像NAT那样多个连接共享一个公共IP。
有状态操作:代理服务器通常维护连接状态信息,可以跟踪会话和事务。
功能扩展:代理服务器可以提供额外的功能,如负载均衡、缓存、压缩、SSL加密等。