Linux 网络基础三 (数据链路层协议:以太网协议、ARP 协议)

news2025/4/25 23:03:52

一、以太网

两个不同局域网的主机传递数据并不是直接传递的,而是通过路由器 “一跳一跳” 的传递过去。

跨网络传输的本质:由无数个局域网(子网)转发的结果。

所以,要理解数据跨网络转发原理就要先理解一个局域网中数据是如何转发的,它就是以太网协议。

在同一个局域网内的两太主机是可以直接通信的。

举例:在局域网通信就好比如,老师上课的时候喊张三的名字,所有人都能听到,只不过分析发现老师喊的不是自己就忽略掉,而只有张三会处理这个老师发出来的这个消息,那么老师和张三的通信就可以看作是 1 对 1 的直接通信。

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

 1、以太网帧格式

局域网两台主机之间通信必须要封装 MAC 帧。

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

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

用红色圈出来的部分就是报头部分。中间的则是数据部分,数据部分包含上层的报头加有效载荷(HTTP、TCP、IP 的封装)。

2、MAC 帧将报头与有效载荷进行分离 & 向上交付 

如何将报头与有效载荷分离呢?

MAC 帧的分离方式就是采用定长报头。直接对前面的 14 个和后边的 4 个进行提取,剩下的就是有效载荷。

向上交付给哪个协议?

在 MAC 帧的帧头当中有 2 个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。

3、认识 MAC 地址

局域网通信,每台主机都要有自己的唯一标识(虚拟机中的 MAC 地址不是真实的 MAC 地址,可能会冲突,也有些网卡支持用户配置 MAC 地址),每一台机器都要配一张网卡,每一个网卡都有一个序列号,这个序列号就是该网卡的 MAC 地址,用来识别数据链路层中相连的节点,在全球范围内具有唯一性(其实在局域网内保证唯一性就够了),长度为 48 位(6 个字节),一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)。

注意:MAC 地址在网卡出厂时就确定了,不能修改。

4、局域网转发原理(基于协议)

假设现在要 MAC 1发送数据给 MAC7,那么首先就需要封装一个 MAC 帧

每台主机的数据链路层都会收到这个 MAC 帧,然后进行报头和有效载荷的分离,然后查看目的 IP 地址发现是 MAC7,如果发现不是自己,直接把数据帧丢弃,上层根本就不知道收到了这个数据帧;如果发现是自己,就把有效载荷向上交付。

处理结束后,MAC7 也会给 MAC1 一个应答

发送的过程同上。

结论:其实局域网所有的主机都能收到 MAC 帧,只不过如果目标 MAC 地址不等于自己的 MAC 地址,就直接在数据链路层丢弃掉。 

由此在局域网中,网卡有一种混杂模式:就是不丢弃任何的数据帧,全部向上交付,这就是局域网抓包工具的原理。
由此也可以看出 HTTPS 数据加密的必要性。

(1)数据碰撞

由于以太网中的所有的主机共享一个通信信道,所以多台主机同时发送数据,数据之间就可能会产生数据碰撞问题。

举例:在教室老师想跟李四说话,但是所有人都在互相说话,导致李四听不到老师的声音。

解决方法:在同一时刻只允许有一台主机发送数据

如何保证我在发送数据时,别人也想发送数据成功呢?

两种方法:

  1. 令牌环:谁拿牌谁就能发消息,类比互斥锁。
  2. 以太网:如果发生了碰撞,就暂时不发数据,发送主机会休息一段(随机)时间再尝试发送。这种方法叫做主机的碰撞检测和碰撞避免算法

如果我们不断向局域网发送垃圾数据并且不执行碰撞检测和碰撞避免,那么就能让局域网所有主机都无法通信。

那么就可以把局域网看成一个临界资源,通过碰撞检测 + 碰撞避免让任何时刻只有一台主机能够发送消息。

局域网中的主机越多越好,还是越少越好呢?

越少越好。

局域网数据帧发送数据的时候,数据帧是越长越好,还是越短越好呢?

数据帧越短越好。数据太长容易造成碰撞问题,但太短的话,能携带的信息就比较少,所以不能太短。

(2)交换机

如果局域网过大,就会导致碰撞的概率增加,所以就有了交换机。

  • 交换机可以识别到局部性的碰撞,对碰撞的数据不做转发。比方说交换机左侧发生了碰撞,并不会影响到 MAC3 给 MAC4 发消息。
  • 交换机对正常发送的数据也不会做转发。比方说 MAC1 是给 MAC5 发消息,那么就没必要让交换机的右侧收到消息,右侧的碰撞概率就减小了。

交换机的核心作用:划分碰撞域。

 5、对比理解 MAC 地址和 IP 地址

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

IP 就是一个大目标,MAC 就是实现大目标的每一个小目标。

因此数据在路由过程中,源 IP 地址和目的 IP 地址可以理解成是不会变化的,而数据每进行一跳后其源 MAC 地址和目的 MAC 地址都会变化

6、认识 MTU  

MTU(最大传输单元)描述的是底层数据帧一次最多可以发送的数据量,这个限制是不同的数据链路层对应的物理层产生的。以太网对应 MTU 的值一般是 1500 字节。不同的网络类型有不同的 MTU。

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

MAC 帧规定有效载荷的长度的范围是【46~1500】。ARP 数据包的长度不够 46 字节时,要在后面补填充位。

可以把 MTU 看作发快递时对包裹的大小限制,不同的数据链路层标准的 MTU 是不同的。

(1)MTU 对 IP 协议的影响

由于数据链路层 MTU 的限制,如果 IP 层一次发送的字节数超过了 MTU,就需要进行切片。

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

补充:数据在路由器转发的过程路由器也可能会进行切分,因为不同网络的 MTU 是不同的。这样我们可以把 IP 协议中的不可切分字段置为 1,如果遇到 MTU 较小的,直接舍弃掉数据,重发重新选择路径,这样就可以选出一条吞吐量大的路径

(2)MTU 对 UDP 协议的影响

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

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

(3)MTU 对于 TCP 协议的影响

TCP 作为传输控制协议,它需要控制有效载荷数据不能超过某一阈值,还是受制于 MTU。TCP 的单个数据报的最大消息长度,称为 MSS(Max Segment Size,最大报文段长度)。

TCP 在建立连接的过程中,通信双方会进行 MSS 协商。最理想的情况下,MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)。

MAC 帧的有效载荷最大为 MTU,TCP 的有效载荷最大为 MSS,由于 TCP 和 IP 常规情况下报头的长度都是 20 字节,因此一般情况下 MSS = MTU - 20 - 20,而 MTU 的值一般是 1500 字节,因此 MSS 的值一般就是 1460 字节。所以一般建议 TCP 将发送的数据控制在 1460 字节以内,此时就能够降低数据分片的可能性。

这也解释了为什么滑动窗口范围内会有多个报文段,不能直接一起发送,就是因为一次不允许发送太大的单个数据段。

双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值,然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS。

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

如何减少分片?

如果传输层控制好一次交给 IP 的数据量不要太大,那么数据在 IP 层自然也就不需要进行分片。

如果 UDP 和 TCP 携带的数据过大,超过 MTU,对于 UDP 来说就直接丢包了,对于 TCP 就是数据重传。所以可以得出切片是不好的。 

(4)MSS 和 MTU 的关系

(5)查看硬件地址和 MTU 

使用 ifconfig 命令,即可查看 ip 地址,mac 地址和 MTU:

二、ARP 协议

注意 :ARP  不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。

1、ARP 协议的作用

当跨不同子网的两太主机 A 和 B 通信,最终数据会送到主机 B 局域网中的路由器 D,我们知道 D 和 B 属于同一个局域网,那么就得封装 MAC 帧进行通信,但是报文中只含有 B 的 IP 地址,并不知道 B 的 MAC 地址。这就需要有一个过程让路由器获取主机 B 的 MAC 地址。

ARP 协议建立了主机 IP 地址和 MAC 地址的映射关系,其作用就是根据 IP 地址来获取目标主机的 MAC 地址。

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

2、ARP 协议的工作流程

举例:现在在一个教室上课,老师第一次来,不认识每个学生,只知道每个人的学号,那么老师如何知道每个人的姓名呢?—— 可以直接叫学号,然后得到这名同学的反馈,也就建立了学号和姓名的映射关系。

当路由器收到数据要发送给目标主机的时候,就会封装 ARP 报文,广播报文,寻找匹配的目标 IP,目标主机收到 ATP 后会封装一个 ARP 应答,该应答里包含了自己的 MAC 地址。由此路由器就知道了目标主机的 MAC 地址,然后才会把数据包封装 MAC 帧进行发送。

  • 源主机发出 ARP 请求,询问 “IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播)。
  • 目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中。
  • 每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。

(1)ARP 的请求过程

假设现在路由器 A 构建 ARP 请求发送给 B。

构建 ARP 请求:

  • 硬件类型指链路层的网络类型,1 为以太网。
  • 协议类型指要转换的地址类型,0x0800 为 IP 地址。
  • 硬件地址长度对于以太网地址为 6 字节,因为 MAC 地址是 48 位的。
  • 协议地址长度对于 IP 地址为 4 字节,因为 IP 地址是 32 位的。
  • op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。

以太网地址和发送端 IP 地址,对应就是路由器 A 的 MAC 地址和 IP 地址。
目的以太网地址和目的 IP 地址,对应就是主机 B 的 MAC 地址和 IP 地址,因为不知道主机 B 的 MAC 地址,所以填全 F。

这个报文实际上是在 ARP 层封装的:

报文要先向下交付数据链路层进行封装才会发送到局域网。
所以现在需要添加以太网帧的报头:

  • 目的 MAC 地址并不知道,所以填全 F。
  • 源地址就填路由器 A 的 MAC 地址。
  • 类型就填 0806,因为 MAC 帧当中的帧类型字段设置为 0806。
  • 最后要加上 CRC 校验。

MAC 帧封装完毕后,路由器 A 就可以将封装好的 MAC 帧以广播的方式发送到局域网当中了。

假设现在 MAC2 主机收到了这个报文,解包后发现目标 MAC 是全 F,就是广播的,当识别到 MAC 帧当中的帧类型字段为 0806 后,便知道这是一个 ARP 的请求或应答的数据包,于是会将 MAC 帧的有效载荷向上交付给 ARP 层。
当 ARP 收到数据包后,先比对 op 字段,判断是请求还是响应。发现是 1 就是请求,然后提取目的IP字段,发现不是自己,就在 ARP 层直接丢弃数据包。

 (2)ARP 的应答过程

构建 ARP 响应:

  • op 填 2,表示应答。
  • 目标 MAC 就填路由器 A。
  • 其他同理 ARP 请求。

为了发送到局域网,所以加下来封装 MAC 帧报头:

MAC 帧封装完毕后,主机 B 就可以将封装好的 MAC 帧发送到局域网当中了。

所有主机都会收到这个 MAC 帧,看到 MAC 帧报头中的目的 IP 如果不是自己的,就直接丢弃了,不会传递到 ARP 层。
当路由器 A 的 ARP 层收到这个数据包后,先看的 op 字段为 2,于是判定这是一个 ARP 应答,然后就会提取发送端以太网的地址和发送端 IP 地址,此时路由器 D 就拿到了主机 B 的 MAC 地址。

结论: 

  • 任何主机可能之前向目标主机发送过 ARP 请求,也就注定了未来一定会收到对应的 ARP 应答。
  • 任何一台主机也有可能收到别人发起的 ARP 请求。

所以,局域网中,任何一台主机收到 ARP 的时候,可能是一个应答,也可能是一个请求。

总结:所有 ARP 层收到数据包后,都会先看 op 字段,如果是 1 请求,那么就构建应答,如果是 2 应答,那么就提取源 IP 和源 MAC 地址就可以知道对方的 IP 和 MAC 地址了。

是不是只会在目标最终的子网中进行 ARP,其它地方是否会发生 ARP 呢?

会,ARP 可能在网络中的任意一条路径中发生。

 3、ARP 数据报的格式

因为 ARP 里面包含了 IP,所以 ARP 协议协议属于 MAC 帧的上层协议

所以 MAC 帧在封装的时候,不仅仅有 IP 报文,还有可能是 ARP 请求/应答。

注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。

这里的前三个字段是 MAC 帧的报头,所以真实的 ARP 请求只有后面的部分:

  • 硬件类型指链路层的网络类型,1 为以太网。
  • 协议类型指要转换的地址类型,0x0800 为 IP 地址。
  • 硬件地址长度对于以太网地址为 6 字节,因为 MAC 地址是 48 位的。
  • 协议地址长度对于 IP 地址为 4 字节,因为 IP 地址是 32 位的。
  • op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。

 后边四个字段就是用来 ARP 的请求和响应的。如果后边一些字段不清楚,例如目的 MAC 地址,就可以填成全 F 标识没有被设置。

4、ARP 缓存表

局域网通信要用到 MAC 地址,所以要使用 ARP 协议通过 IP 得到 MAC 地址,ARP 看起来至少进行一个请求和一个应答,难道每一次发送数据都要用这个流程吗?

不是,arp 请求成功之后,请求方会暂时将 IP:MAC 地址的映射关系保存起来。

每次发起 ARP 请求后都会建立对应主机 IP 地址和 MAC 地址的映射关系,每台主机都维护了一个 ARP 缓存表,我们可以用命令:arp -a 进行查看。

注意:缓存表中的表项有过期时间,这个时间一般为 20 分钟。如果 20 分钟内没有再次使用某个表项,那么这个表项就会失效,下次使用时就需要重新发起 ARP 请求来获得目的主机的硬件地址,这主要是因为 IP 地址是会发生变化的。 

5、RARP 协议

RARP(反向地址转换协议),是根据 MAC 地址获取 IP 地址的协议。

在同一局域网内知道了 MAC 地址就可以直接向给主机发送消息了,因此我们可以直接发消息询问对方的 IP 地址就行了。

6、ARP 欺骗

假设现在有一个局域网,每个主机内部都有 ARP 缓存表如下:

但此时来了一个中间人,它封装大量假的 ARP 请求发送给 MAC1,里面写的是 IP4:MAC3,同理给路由器发送 IP1:MAC3。

这样 MAC3 就成为了中间人,这种操作就叫作 ARP 欺骗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

16.QT-Qt窗口-菜单栏|创建菜单栏|添加菜单|创建菜单项|添加分割线|添加快捷键|子菜单|图标|内存泄漏(C++)

Qt窗⼝是通过QMainWindow类来实现的。 QMainWindow是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃QWidget类,并且提供了⼀个预定义的布局。QMainWindow包含⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部…

[特殊字符] 分布式定时任务调度实战:XXL-JOB工作原理与路由策略详解

在微服务架构中,定时任务往往面临多实例重复执行、任务冲突等挑战。为了解决这一问题,企业级调度框架 XXL-JOB 提供了强大的任务统一调度与执行机制,特别适合在分布式系统中使用。 本文将从 XXL-JOB 的核心架构入手,详细讲解其调…

java面试题及答案2020,java最新面试题(四十四)

java面试题及答案2020 二面-2020/3/18 1、自我介绍项目比赛 2、java集合框架全部介绍。。从list set queue到map 3、hashmap底层扩容线程安全问题 4、如果-一个对象要作为hashmap的key需要做什么 5、Threadlocal类以及 内存泄漏 6、线程同步方式,具体每一个怎么做的 7、jvm类加…

oracle 锁的添加方式和死锁的解决

DML锁添加方式 DML 锁可由一个用户进程以显式的方式加锁,也可通过某些 SQL 语句隐含方式实现。 DML 锁有三种加锁方式:共享锁方式、独占锁方式、共享更新。 共享锁,独占锁用于 TM 锁,共享锁用于 TX 锁。 1)共享方式的表级锁 共享方…

基于Hadoop的音乐推荐系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本毕业生数据分析与可视化系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java语言、爬虫技术进行编写,使用了Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括&#xff…

Java查询数据库表信息导出Word

参考: POI生成Word多级标题格式_poi设置word标题-CSDN博客 1.概述 使用jdbc查询数据库把表信息导出为word文档, 导出为word时需要下载word模板文件。 已实现数据库: KingbaseES, 实现代码: 点击跳转 2.效果图 2.1.生成word内容 所有数据库合并 数据库不合并 2.2.生成文件…

RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)

目录 前言:v4l-utils简介 一:查找当前的摄像头设备 二:查看当前摄像头支持的v4l2-ctl调试参数 三根据提示设置对应参数,在提示范围内设置 四:常用调试命令 五:应用内执行命令方法 前言:v4l-utils简介 v4l-utils工具是由Linu…

在Linux中,使用read函数去读取写入文件空洞部分时,读取出来的内容是什么?为什么这样操作,以及应用场景?

使用 read 函数读取文件空洞(hole)部分时,读取到的内容会被系统填充为 \0(即零字节)。文件空洞是稀疏文件中未实际分配磁盘空间的区域,但逻辑上表现为连续的零字节。 1.在指定空洞部分后,写入数…

Qt6笔记-对Qt6中对CMakeLists.txt的解析

首先,新建Qt Console Application项目。 下面对CMakeLists.txt进行次理解。新建好后,Qt Creator会生成CMakeLists.txt,具体内容如下: cmake_minimum_required(VERSION 3.16)project(EasyCppMain LANGUAGES CXX)set(CMAKE_AUTOUIC…

CIFAR10图像分类学习笔记(三)---数据加载load_cifar10

新创建一个load_cifar10源文件 需要导入的包 import glob from torchvision import transforms from torch.utils.data import DataLoader ,Dataset import os #读取工具 from PIL import Image import numpy as np 01同样定义10个类别的标签名数组 label_name ["airpl…

计算机视觉cv入门之答题卡自动批阅

前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识,这里我们以答题卡自动批阅这一案例来实操一下。 大致思路 答题卡自动批阅的大致流程可以分为这五步:图像预处理-寻找考试信息区域与涂卡区域-考生信息区域OCR识别-涂卡区域填涂答案判断…

Java学习手册:JSON 数据格式基础知识

1. JSON 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。它最初来源于 JavaScript,但如今已被许多语言所采用,包括 Java、Python、C 等。JSON 以…

《重塑AI应用架构》系列: Serverless与MCP融合创新,构建AI应用全新智能中枢

在人工智能飞速发展的今天,数据孤岛和工具碎片化问题一直是阻碍AI应用高效发展的两大难题。由于缺乏统一的标准,AI应用难以无缝地获取和充分利用数据价值。 为了解决这些问题,2024年AI领域提出了MCP(Model Context Protocol模型上…

深度图可视化

import cv2# 1.读取一张深度图 depth_img cv2.imread("Dataset_depth/images/train/1112_0-rgb.png", cv2.IMREAD_UNCHANGED) print(depth_img.shape) cv2.imshow("depth", depth_img) # (960, 1280) print(depth_img)# 读取一张rgb的图片做对比 input_p…

微软Edge浏览器字体设置

前言 时间:2025年4月 自2025年4月起,微软Edge浏览器的默认字体被微软从微软雅黑替换成了Noto Sans,如下图。Noto Sans字体与微软雅黑风格差不多,但在4K以下分辨率的显示器上较微软雅黑更模糊,因此低分辨率的显示器建议…

Vue生命周期详细解析

前言 Vue.js作为当前最流行的前端框架之一,其生命周期钩子函数是每个Vue开发者必须掌握的核心概念。本文将全面解析Vue的生命周期,帮助开发者更好地理解Vue实例的创建、更新和销毁过程。 一、Vue生命周期概述 Vue实例从创建到销毁的整个过程被称为Vue…

基于c#,wpf,ef框架,sql server数据库,音乐播放器

详细视频: 【基于c#,wpf,ef框架,sql server数据库,音乐播放器。-哔哩哔哩】 https://b23.tv/ZqmOKJ5

前端项目搭建集锦:vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展,开箱即用,附带项目搭建教程

前端项目搭建集锦:vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展,开箱即用,附带项目搭建教程 前言:一、Vue项目下载快速通道二、React项目下载快速通道三、BrowserPlugins项目下载快速通道四、项目搭建教…

什么是Maven

Maven的概念 Maven是一个一键式的自动化的构建工具。Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。Maven 是目前最流行的自动化构建工具&#xff0…

neo4j中节点内的名称显示不全解决办法(如何让label在节点上自动换行)

因为节点过多而且想让节点中所有文字都显示出来而放大节点尺寸 从neo4j中导出png,再转成PDF来查看时,要看清节点里面的文字就得放大5倍才行 在网上看了很多让里面文字换行的办法都不行 然后找到一个比较靠谱的办法是在要显示的标签内加换行符 但是我的节点上显示的是…