【网络原理】数据链路层协议与DNS

💐个人主页初晴~

📚相关专栏:计算机网络那些事


一、以太网

以太网(Ethernet)主要用于在局域网(LAN)中进行数据传输。它定义了物理层和数据链路层的规范,允许连接到同一网络的设备之间进行通信。可以使用多种不同的物理介质来传输数据,包括双绞线、同轴电缆以及光纤等。

CSMA/CD(载波侦听多址/冲突检测)机制:

  • 载波侦听(Carrier Sense):在发送数据之前,设备会侦听介质是否空闲。
  • 多址接入(Multiple Access):多个设备可以同时尝试发送数据。
  • 冲突检测(Collision Detection):如果两个设备同时发送数据,会产生冲突,设备会停止发送并发送干扰信号(Jam Signal)以通知其他设备。

帧格式:

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的
  • 帧协议类型字段有三种值,分别对应IP,ARP,RARP

0080:IP数据报

0806:ARP 报文

0835:RARP 报文

  • 帧末尾是CRC校验码

二、MAC地址

MAC地址(Media Access Control Address),也称为物理地址或硬件地址,是在数据链路层(OSI模型的第二层)中用来唯一标识网络设备的地址。

  • MAC地址⽤来识别数据链路层中相连的节点
  • ⻓度为48位,及6个字节。⼀般⽤16进制数字加上冒号的形式来表⽰(例如: 08:00:27:03:fb:19)
  • 在⽹卡出⼚时就确定了,不能修改。mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地址,可能会冲突; 也有些⽹卡⽀持⽤⼾配置mac地址)

mac 地址和 IP 地址的区别:
1、mac 地址使用 6 个字节,IP 地址 4 个字节

空间范围比 IP 地址大了 6w 多倍
mac 地址当前仍然可以给每个设备都分配一个唯一的 mac 地址。一般一个网卡在出厂时,就会分配一个唯一的 mac 地址,不能修改

2、mac 地址使用在数据链路层,用来实现两个设备之间的数据转发------微观
IP 地址使用在网络层,立足于整个转发流程,进行路经规划 ------宏观

理论上来说,搞一套地址也能完成宏观和微观地址上的所有工作,IP 地址和 mac 地址留一组就可以了,但实际上两个都留下来了,分配了不同的任务(不是技术问题,而是历史遗留问题)。

IP 地址和 mac 地址是两伙人,在同一个时间段各自独立提出的。两伙人都觉得自己的东西好,于是大家就综合一下,你这个地址负责这块;你那块地址负责那块就可以了

举个栗子:从西安到吉林省白城市安广镇

第一步:路径规划(网络层)

西安--->北京--->长春--->白城--->安广

西安--->北京--->沈阳--->白城--->安广

西安--->长春--->白城--->安广

...

第二步:实施(选择第一条线路)

坐飞机

源 IP:西安;目的 IP:安广;

源 mac:西安;目的 mac:北京

坐高铁

源 IP:西安;目的 IP:安广

源 mac:北京;目的 mac:长春

坐大巴

源 IP:西安;目的 IP:安广

源 mac:长春;目的 mac:白城

坐出租车

源 IP:西安;目的 IP:安广

源 mac:白城;目的 mac:安广

.

上述场景不考虑 NAT,源 IP 和目的 IP 始终都是固定的。以太网数据帧里面的 mac 地址,会随着转发的过程,时刻发生改变(每经过一个交换机/路由器就会产生上述变化),牢牢抓住了下一个数据要往哪传输这样的要点

三、ARP协议

ARP(Address Resolution Protocol,地址解析协议)是一个在TCP/IP网络中使用的链路层协议,是一种用于将网络层的IP地址转换为物理层的MAC地址的协议。
ARP协议建⽴了主机 IP地址 和 MAC地址 的映射关系:

  • 在⽹络通讯时,源主机的应⽤程序知道⽬的主机的IP地址和端⼝号,却不知道⽬的主机的硬件地址
  • 数据包⾸先是被⽹卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃
  • 因此在通讯前必须获得⽬的主机的硬件地址

ARP的工作原理:

  1. ARP请求

    • 当主机需要发送数据给另一个主机,但它不知道目标主机的MAC地址时,它会发送一个ARP请求广播。这个广播包含发送者的IP地址、发送者的MAC地址以及目标主机的IP地址。
    • ARP请求的格式如下:
      • 源MAC地址:发送者的MAC地址。
      • 目标MAC地址:全1广播地址(FF:FF:FF:FF:FF:FF)。
      • 类型:ARP协议的类型(0x0806)。
      • 操作码:1表示ARP请求。
  2. ARP响应

    • 局域网内的所有主机都会接收到ARP请求广播,但只有目标主机(拥有请求中指定的IP地址)会回应。
    • 目标主机会发送一个ARP响应,告诉请求者它的MAC地址。
    • ARP响应的格式如下:
      • 源MAC地址:目标主机的MAC地址。
      • 目标MAC地址:请求者的MAC地址。
      • 类型:ARP协议的类型(0x0806)。
      • 操作码:2表示ARP响应。
  3. 缓存ARP映射

    • 请求者接收到ARP响应后,会将目标主机的IP地址和MAC地址添加到自己的ARP缓存表中,以便将来快速查找。
    • ARP缓存表记录了IP地址到MAC地址的映射,这样在同一局域网内的后续通信就不需要再次发送ARP请求。
  • 每台主机都维护⼀个ARP缓存表,可以⽤arp -a命令查看。缓存表中的表项有过期时间(⼀般为20分钟),如果20分钟内没有再次使⽤某个表项,则该表项失效,下次还要发ARP请求来获得⽬的主机的硬件地址

四、MTU

MTU(Maximum Transmission Unit,最大传输单元)是指在一个网络层协议中,可以通过物理层一次传输的最大数据报文大小。这个值不包括任何网络层或传输层的头部信息,仅指用户数据的最大长度。
一般和硬件直接相关。不同的硬件设备,对应到不同的数据链路层协议,其 MTU 也是不同的。

  • 对于以太网而言,标准的MTU值是1500字节。这意味着在以太网中,除去以太网帧头和帧尾,最大的用户数据负载部分是1500字节。

这个长度是非常小的。UDP/IP至少都是 64KB。这就使得 MTU 的限制。会直接对上层协议产生影响。
比如 IP协议的拆包组包机制,事实上更多的就是为了应对 MTU 的限制,当一个 IP 数据包长度达到 1500 以上时就会自动拆包了。

  • 将较⼤的IP包分成多个⼩包,并给每个⼩包打上标签
  • 每个⼩包IP协议头的 16位标识(id) 都是相同的
  • 每个⼩包的IP协议头的3位标志字段中,第2位置为0,表⽰允许分⽚,第3位来表⽰结束标记(当前是否是最后⼀个⼩包,是的话置为1,否则置为0)
  • 到达对端时再将这些⼩包,会按顺序重组,拼装到⼀起返回给传输层
  • ⼀旦这些⼩包中任意⼀个⼩包丢失,接收端的重组就会失败。但是IP层不会负责重新传输数据

分片的标志位:

  • MF(More Fragments)位:如果一个分片不是最后一个分片,MF位将被设置为1。当MF位为0时,表示这是最后一个分片。
  • DF(Don't Fragment)位:如果DF位被设置为1,则路由器不能对该数据包进行进一步的分片。如果设置了DF位的数据包太大以至于不能被传输,那么该数据包将会被丢弃,并且可能向源发送ICMP消息(不可达消息)。

MTU的重要性:

  1. 避免分片:如果数据包的大小超过了MTU,那么这个数据包就需要被分割成更小的数据包片段。这增加了网络传输的开销,因为每个片段都需要有自己的头部信息,并且在目的地需要重新组装。

  2. 性能优化 :适当的MTU设置可以避免不必要的分片,提高网络传输效率。如果MTU设置得太小,会导致过多的分片,增加了网络负担;如果设置得过大,则可能导致数据包因超出链路的MTU而被丢弃。

  3. 兼容性:不同的网络技术和设备可能支持不同的MTU值。例如,以太网的标准MTU是1500字节,而点对点协议(PPP)的MTU通常为576字节。因此,在跨不同类型的网络连接时,需要考虑MTU的兼容性问题。

MTU的确定:

MTU的值通常由网络设备和链路层协议决定,并且在设备间建立连接时进行协商。在网络配置过程中,有时也需要手动设置MTU值,特别是在涉及不同类型的网络连接或使用隧道技术时。

MTU测试:

可以通过ping命令发送大于默认MTU大小的数据包来测试网络路径上的MTU。例如,在Windows系统中,可以使用命令 ping -f -l 1500 <destination> 来测试,其中 -f 表示禁止分片,-l 后跟要发送的数据包大小。如果数据包太大而无法通过网络路径,通常会收到ICMP不可达消息。

上图中我们设置的 1500字节的数据量就超过了网络路径上的MTU,导致数据包太大而无法通过网络路径,使得发出的四个包都发生了丢包

MTU与IPv4和IPv6:

  • IPv4:IPv4支持分片,并且分片通常在路由器中完成。如果一个数据包的大小超过了下一跳的MTU,路由器会将数据包分片。

  • IPv6:IPv6的设计倾向于避免分片,因为分片可能会导致性能下降和安全问题。因此,默认情况下,IPv6不允许路由器对数据包进行分片,而是依靠路径MTU发现(Path MTU Discovery)机制来确保数据包的大小适合整个路径。

路径MTU发现:

为了避免传输途中过多的分片影响传输效率,我们最好能确定到达目的地之间的网络路径上最小的 MTU,以便我们更合理地设置数据包的大小,避免由于数据包长度超过中间路径的MTU强制分包二降低效率。

  • 路径MTU发现(Path MTU Discovery,简称 PMTU Discovery)就是一种网络技术,用于自动确定两个端点之间的最大传输单元(MTU)大小。目的是避免数据包因太大而需要分片的情况,从而提高网络性能和可靠性

总结来说,MTU是网络配置中的一个重要参数,它影响数据包的传输效率和网络的整体性能。合理设置MTU可以避免不必要的分片,提高网络的传输效率。

五、DNS应用层协议

DNS(Domain Name System,域名系统)是一种用于将人类可读的域名转换为计算机可识别的IP地址的分布式数据库系统。DNS协议的主要作用是在互联网上实现域名解析,即通过查询DNS服务器来获得特定域名对应的IP地址。

简单来说,TCP/IP 中使用 IP地址与端口号来确定网络上的一台主机的一个程序。但是 IP地址并不方便人类理解与记忆。于是⼈们发明了⼀种叫 主机名(域名) 的东西, 是⼀个字符串, 并且使⽤hosts⽂件来描述主机名和IP地址的关系

比如我们想要访问b站,并不需要在地址栏输入具体的 IP地址与端口号,只要输入对应域名 "www.bilibili.com" ,就会自动通过查询 DNS 服务器的方式获取对应的IP地址,从而实现对目标网站的访问

  • 域名就是网址,域名代表了 IP 地址

DNS服务器类型

  • 根域名服务器:顶级域名的权威服务器,如com、org等。
  • 顶级域名服务器:负责特定顶级域名的服务器,如.com服务器。
  • 权威名称服务器:负责特定域名的服务器,如example.com服务器。
  • 递归DNS服务器:为用户提供全面查询服务的服务器,常见于ISP或企业内部。

镜像服务器

全世界有这么多的设备上网,每时每刻都在访问 DNS 服务器,DNS 服务器能顶住这么大的访问量吗?

  • 多弄一些 DNS 服务器就可以了
  • 多高出来的 DNS 服务器称为"镜像服务器"
  • 事实上,世界上有数不清的镜像服务器,往往是一些运营商/互联网公司维护。每个人上网的时候,就会就近访问 DNS 服务器

一旦有数据变更,就需要约定以某个服务器的数据为基准,一旦有变更,就修改这个基准服务器的数据,其他服务器从基准的服务器同步数据,基准服务器称为"根服务器"

工作流程

  1. 客户端查询

    • 当用户试图访问一个网站时,例如在浏览器中输入网址 www.bilibili.com,操作系统中的DNS客户端会向其配置的递归DNS服务器发起查询请求。
  2. 递归DNS服务器

    • 递归DNS服务器负责帮助客户端查找域名对应的IP地址。如果递归服务器的缓存中有该域名的信息,则直接返回结果;如果没有,则递归服务器会向其他DNS服务器发起查询请求,直到找到答案为止。
  3. 权威DNS服务器

    • 如果递归DNS服务器没有缓存相关信息,则会向权威DNS服务器查询。权威DNS服务器是负责特定域名区域的服务器,它们存储了该区域内的所有域名记录。
    • 根据查询的结果,权威DNS服务器会返回相应的A记录(IPv4地址)或AAAA记录(IPv6地址),或者其他类型的记录,如MX记录(邮件交换记录)、CNAME记录(别名记录)等。
  4. 根DNS服务器

    • 如果递归DNS服务器不知道哪个权威DNS服务器负责该域名,它会首先查询根DNS服务器。根DNS服务器会告诉递归DNS服务器去询问哪个顶级域(TLD)服务器。
    • TLD服务器再告知递归DNS服务器去询问具体的权威DNS服务器。
  5. 缓存

    • 在整个过程中,递归DNS服务器会缓存查询结果,这样未来的相同查询可以更快地得到响应。
      一旦把某个国家的域名的数据从根服务器中删除掉,就意味着这个国家的网络就会陷入瘫痪

总之,DNS协议是互联网基础设施的核心组件之一,它使得用户可以通过易于记忆的域名来访问网站和服务。


那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

相关推荐
daily_23339 分钟前
数据结构——小小二叉树第二幕(二叉树链式结构的实现以及二叉树的遍历)超详细!!!
数据结构·c++
z54183814 分钟前
装饰器---python
开发语言·python
时光の尘16 分钟前
C语言菜鸟入门·关键字·void的用法
c语言·开发语言·c++·算法·c#·c·关键字
Eric.Lee202119 分钟前
图像上显示中文文本 - python 实现
开发语言·python
小林熬夜学编程21 分钟前
【Linux系统编程】第四十九弹---日志系统构建指南:从基础结构到时间处理与Log类实现
linux·运维·服务器·c语言·开发语言·c++
网络安全King23 分钟前
网络安全设备系列--安全隔离网闸
网络·安全·web安全
慕卿扬24 分钟前
基于python的机器学习(三)—— 关联规则与推荐算法
python·学习·机器学习·推荐算法
DeepAlchemy26 分钟前
ROSSERIAL与Arduino IDE交叉开发(UBUNTU环境,包含ESP32、arduino nano)
c++·单片机·ros·rosserial
HP-Patience33 分钟前
【机器学习】- 模型复杂度vs模型误差
python·算法·机器学习
程序猿小D34 分钟前
第三百三十节 Java网络教程 - Java网络UDP服务器
java·开发语言·网络·网络协议·udp·多线程