【JavaEE精炼宝库】数据链路层——以太网 | ARP 协议 | DNS 协议

文章目录

  • 一、以太网
    • [1.1 以太网帧格式:](#1.1 以太网帧格式:)
    • [1.2 MAC 地址:](#1.2 MAC 地址:)
    • [1.3 MTU:](#1.3 MTU:)
      • [1.3.1 初始 MTU:](#1.3.1 初始 MTU:)
      • [1.3.2 MTU 对 IP 协议的影响:](#1.3.2 MTU 对 IP 协议的影响:)
      • [1.3.3 MTU 对 UDP 协议的影响:](#1.3.3 MTU 对 UDP 协议的影响:)
      • [1.3.4 MTU 对 TCP 协议的影响:](#1.3.4 MTU 对 TCP 协议的影响:)
  • [二、ARP 协议](#二、ARP 协议)
    • [2.1 ARP协议的作用:](#2.1 ARP协议的作用:)
    • [2.2 ARP 协议的工作原理:](#2.2 ARP 协议的工作原理:)
      • [2.2.1 在同一个局域网中进行寻址:](#2.2.1 在同一个局域网中进行寻址:)
      • [2.2.2 不同局域网中进行寻址:](#2.2.2 不同局域网中进行寻址:)
  • [三、重要应用层协议 DNS(Domain Name System)](#三、重要应用层协议 DNS(Domain Name System))
    • [3.1 DNS 背景:](#3.1 DNS 背景:)
    • [3.2 DNS 服务器:](#3.2 DNS 服务器:)
    • [3.3 DNS 工作流程:](#3.3 DNS 工作流程:)

数据链路层 :负责设备之间的数据帧的传送和识别。网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧。

一、以太网

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

1.1 以太网帧格式:

以太网的帧格式如下所示:

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是 48 位,是在网卡出厂时固化的。

  • 帧协议类型字段有三种值,分别对应 IP、ARP(将 IP 地址解析为 MAC 地址,下面有详细介绍)、RARP(和 ARP 功能相反,将链路层的 MAC 地址转换为网络层的 IP 地址)。

  • 帧末尾是 CRC 校验码。

1.2 MAC 地址:

MAC 地址的全称是媒体访问控制地址(Media Access Control Address)。如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。

可以理解为,MAC 地址是一个网络设备真正的"身份证号",IP 地址只是一种不重复的定位方式。

MAC 地址用来识别数据链路层中相连的节点。长度为 48 位(及6个字节)。一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19),在网卡出厂时就确定了,不能修改。mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址,可能会冲突)。

MAC 地址有一个特殊地址:FF-FF-FF-FF-FF-FF(全 1 地址),该地址表示广播地址。

对比理解 MAC 地址和 IP 地址:

IP 地址描述的是路途总体的起点和终点。MAC 地址描述的是路途上的每一个区间的起点和终点。

1.3 MTU:

1.3.1 初始 MTU:

MTU 相当于发快递时,对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层,产生的限制。

以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,ARP数据包的长度不够 46 字节,要在后面补填充位。

最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的 MTU。

如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU 了,则需要对数据包进行分片(fragmentation)。

不同的数据链路层标准的 MTU 是不同的。

1.3.2 MTU 对 IP 协议的影响:

由于数据链路层 MTU 的限制,对于较大的 IP 数据包要进行分包。

  • 将较大的 IP 包分成多个小包,并给每个小包打上标签。

  • 每个小包 IP 协议头的 16 位标识(id)都是相同的。

  • 每个小包的 IP 协议头的 3 位标志字段中,第2位置为 0,表示允许分片,第 3 位来表示结束标记(当前是否是最后一个小包,是的话置为 1,否则置为0)。

  • 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层。

  • 一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是 IP 层不会负责重新传输数据。

1.3.3 MTU 对 UDP 协议的影响:

一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP首部)),那么就会在网络层分成多个IP 数据报。这多个 IP 数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。

1.3.4 MTU 对 TCP 协议的影响:

TCP 的一个数据报也不能无限大,还是受制于 MTU。

TCP 的单个数据报的最大消息长度,称为 MSS(Max Segment Size)。TCP 在建立连接的过程中,通信双方会进行 MSS 协商。最理想的情况下,MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)。双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值。然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS。

MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind=2)。

MSS 和 MTU 的关系:

二、ARP 协议

虽然我们在这里介绍 ARP 协议,但是需要强调,ARP 不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。

2.1 ARP协议的作用:

ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。

2.2 ARP 协议的工作原理:

ARP 协议工作时有一个大前提,那就是 ARP 表

在一个局域网内,每个网络设备都自己维护了一个 ARP 表,ARP 表记录了某些其他网络设备的 IP 地址-MAC 地址映射关系,该映射关系以 <IP, MAC, TTL> 三元组的形式存储。其中,TTL 为该映射关系的生存周期,典型值为 20 分钟,超过该时间,该条目将被丢弃。

ARP 协议的工作原理可以分为如下两种场景:

  1. 在同一个局域网中进行寻址。
  2. 在不同局域网中进行寻址。

2.2.1 在同一个局域网中进行寻址:

假设场景:IP 地址为 137.196.7.23 的主机 A,想要给同一个局域网内 IP 地址为 137.196.7.14 的主机 B 发送 IP 报文。

  1. A 查询自己的 ARP 表,如果存在 B 的 IP 地址存在 A 的 ARP 表中,那么就能直接得到 B 的 MAC 地址,构建链路层帧给 B 发送 IP 报文。
  2. 如果查询不到 B 的 IP 地址,那么 A 会构建一个目的 MAC 地址为 FF:FF:FF:FF:FF:FF(这是一个广播地址,)的查询分组,同一个局域网内的所有设备都会收到,和自身 IP 进行对比。
  3. 如果相同(主机 B),B 就会给 A 返回一个响应分组,同时 B 自身提取查询分组,在自身 APR 表中存储了 A 的 IP - MAC 地址映射关系(方便响应)。
  4. A 收到响应分组后,提取即可得到 B 的 MAC 地址,从而发送 IP 报文。

总结来说,ARP 协议是一个广播问询,单播响应协议。

2.2.2 不同局域网中进行寻址:

路由器作为互联设备,具有多个接口,每个接口同样也应该具备不重复的 IP 地址和 MAC 地址。因此,在讨论 ARP 表时,路由器的多个接口都各自维护一个 ARP 表,而非一个路由器只维护一个 ARP 表。

在实际情况中,更多的还是在不同局域网中进行寻址。

假设一个一般场景,两台主机所在的子网(假设两个子网不存在相同 IP)由一台路由器联通。

  1. A 在自身局域网中会发送查询分组,在不同局域网的情况下,A 不会收到响应分组。
  2. 主机 A 通过查询 ARP 表,期望找到目标路由器(根据 B 的 IP 地址 分析出 B 所在子网,能够将报文转发到 B 所在子网的路由器)的本子网接口的 MAC 地址。
  3. 主机 A 如果查询不到目标路由器的 MAC 地址,就会采用 ARP 协议,问询到该 MAC 地址,这个过程和在同一个局域网中寻址一样。
  4. 主机 A 获取到目标路由器的 MAC 地址,构建链路层帧,以单播的方式,发送给目标接口。
  5. 目标接口接收到链路层帧,解析,根据目的 IP 地址,查询转发表,把该 IP 数据报发送给与主机 B 连接的接口上。
  6. 路由器接口查询 ARP 表,找不到 B 的 MAC 地址,将采用 ARP 协议,广播问询,单播响应,得到 B 的 MAC 地址。
  7. 路由器接口根据源 IP地址,源 MAC 地址,B IP 地址,B MAC 地址,构建链路层帧,单播发送。

还有一个物理层,由于这个已经离程序员的范畴有点远了,更何况我们还是 Java 程序员,主要关注应用层。所以这里直接跳过(物理层涉及硬件,也是一大摊子事)。

三、重要应用层协议 DNS(Domain Name System)

3.1 DNS 背景:

TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序。但是 IP 地址不方便记忆,于是人们发明了一种叫主机名的东西,是一个字符串,并且使用 hosts 文件来描述主机名和 IP 地址的关系。

曾经很有用,现在不再使用了,因为要存储这么多域名和 IP 的关系,需要一个很大的文件,且每天都有新的网站出现,也有旧的网站消亡,导致文件就需要频繁更新。

取而代之的是搭建了 DNS 服务器,把这样的映射关系使用 DNS 服务器来保存,这样主机上就不需要保存 hosts了,如果要访问域名,就可以通过访问 DNS 服务器的方式,查询到对应的 IP 地址了。

3.2 DNS 服务器:

DNS 服务器自底向上可以依次分为以下几个层级(所有 DNS 服务器都属于以下四个类别之一):

  • 根 DNS 服务器。根 DNS 服务器提供 TLD 服务器的 IP 地址。目前世界上只有 13 组根服务器,我国境内目前仍没有根服务器。
  • 顶级域 DNS 服务器(TLD 服务器)。顶级域是指域名的后缀,如comorgnetedu等。国家也有自己的顶级域,如ukfrca。TLD 服务器提供了权威 DNS 服务器的 IP 地址。
  • 权威 DNS 服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。
  • 本地 DNS 服务器。每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。严格说来,不属于 DNS 层级结构。

3.3 DNS 工作流程:

DNS 查询解析过程有两种模式:

模式一:

  • 主机向本地 DNS 服务器发送一个 DNS 请求,该查询报文包含要转化的域名。本地 DNS 服务器检查本机缓存,发现并无记录,于是先根服务器发送请求。

  • 根服务器注意到报文中含有 edu 顶级域(如上图),因此告诉本地 DNS,你可以去问问 TLD DNS 服务器,目标域名 IP 很可能在哪里。

  • 本地 DNS 获取到了 edu 的 TLD DNS 服务器地址,发送请求,询问目的 IP 地址。

  • edu 的服务器仍然不清楚请求域名的 IP 地址,但是注意到域名有 umass.edu 前缀,因此返回告知本地 DNS,umass.edu 的权威服务器很可能记录了目标域名的 IP 地址。

  • 以此类推,最终找到了目标 IP 地址所在的服务器,服务器成功将 IP 地址返回给本地 DNS。

  • 本地 DNS 将其返回给请求主机。

模式二:

和上面的模式一,只是顺序不一样。按照图片的序号走即可,这里就不再赘述。

参考:

结语:
其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

相关推荐
蜜獾云5 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
禁默35 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood41 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑44 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
zfoo-framework1 小时前
【jenkins插件】
java
风_流沙1 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http