编程导航计算机基础话题讨论

计算机基础

74 参与
分享

快来分享你的内容吧~

点击登录,快来和大家讨论吧~
表情
图片
话题
打卡
综合
交流
文章
问答

我们应不应该深入学习计算机基础

## 前言 这里的计算机基础指的是经典四大件(操作系统、网络、组成原理、数据结构) 大部分同学都是做软件开发的,要不就是前端后端,要不就是Java、C艹、go等后端开发。 就拿Java举例,大部分同学都是springboot工程师,开发就在pom文件引入个依赖,写写配置文件,sql,或者调用各种API去实现某个功能。程序就轻而易举地跑起来了,什么内核、寄存器、堆栈?没听说过! 尤其是现在的AI时代,拷打AI写代码已经成了一种常态,技术似乎不再值钱,相应地,这些计算机底层技术,操作系统、网络、组成原理、数据结构等似乎也变得苍白无力了。 反正找工作嘛,写两个项目,被被八股文就结束了。 面对计算机基础,大厂选手可能还有理由深入底层提高竞争力,对于大部分只能去小公司的同学,谈论计算机基础,属实是有些。 ## 故事 先不谈论那些繁琐的计算机基础。就拿八股文举例,相信编程导航很多同学都是面试鸭的用户,或者在别的什么八股学习平台,或多或少你都得准备八股,尤其是redis 和 MySQL这两大技术。 **以MySQL举例,为什么MySQL要先写redo log。** 首先是为了事务的持久化,能实现崩溃恢复;其次是redo log 顺序I/O 比 buffer pool的随机I/O 操作快。 再拿回表举例 大部分同学都知道回表要再查一次表,性能查,但回表还有一个问题是随机I/O,因为二级索引存储的索引字段并不是在磁盘中不是连续的。 看到这有什么问题?我作为初学者,好像看不懂什么随机I/O,顺序I/O,所以也根本记不住 但是后来了解了磁盘的结构,我大概知道磁盘需要有一个磁头,有磁道、扇区等部分。如果存储在磁盘上的同一个磁道且相邻的扇区,那么根据磁盘的磁头的运行轨迹,读/写速度就很快,省略寻道时间,甚至能和内存比划比划(*^_^*)。 所以为什么我们需要从设计上就避免随机I/O的产生。 类似的设计思路有RocketMQ的commitlog,就是持久化数据的一个日志。也是顺序I/O。 至此,当你理解了这个原理,面对八股文里的各种描述,你才记忆深刻,畅通无阻。 这是技术深度的提升。 **再拿JVM里的Java虚拟机栈解释** 这是运行时数据区的一个组成部分,其核心是栈帧 ,一个栈帧从入栈到出栈, 描述的是一个方法从执行到返回的全部流程。巧了,操作系统运行时栈的描述也差不多,如果你先学过JVM,或者先学过操作系统,你会发现很多概念一脉相承,很好理解。 并且你发现,如果我们知道一个函数栈帧的位置,可以通过偏移量寻址访问这个函数的全部局部状态,说人话,就是可以实现栈追踪,这是实现bug排查工具的一个重要技术,为什么监控程序能够定位到问题代码具体位置,这是答案;你还可以说,去维护这个栈帧需要访问开销,很多追求性能的项目可能会禁用。 这能提升你对技术的广度。 **再说为什么应用程序从用户态到内核态的切换,开销很大** 你会知道用户态的权限低,内核态的权限高。权限校验的开销不少吧。 对硬盘这种硬件执行操作时(read、write、open),用户态不能直接访问,而是切换到内核态去访问,这就意味着,此时用户态的程序是被挂起的。 用户态进程需要保存现场,等底层内核态进程访问完硬件后,将数据拷贝一份到内核缓冲区,再让用户态进程读取。 内核在运作时本身也是要保存各种上下文。 所以现代计算机软件,尽量将程序的执行放在用户态,少量对安全性有挑战的操作会放在内核处理。典型的例子可以说JAVA的虚拟线程优化,避免频繁的线程上下文切换。 还有很多底层的技术,学完后你发现很多和上层技术几乎是共通的。 宏内核到微内核的转变,就好像系统从单体架构跨到微服务架构。 TCP为什么三次握手,因为放在历史重复连接,对应消息队列里解决重复消息的问题。 ## 学习底层的好处 很多同学,打开八股文,看到很多非常陌生的概念,感到阻力很大,每次看八股都很痛苦。或者稍微深入一点的扩展知识,无从下手,感觉背了忘,忘了背。很大程度上,深入了解计算机基础,能给你不一样的启发。 ## 学习时机 学习计算机基础并非要你一开始就拿着书在那啃。相反,初学者更应该去跑通一段段代码,去先把技术栈补全,把项目做好,把常见的八股都过几遍,这时你发现瓶颈了,再回头看计算机基础,很多内容你才会针对性的去学习,才有动力将其啃下来。

jsp+servlet做的超市商品管理系统

# 超市商品管理系统 ## 项目介绍 这是一个基于JavaWeb技术栈开发的超市商品管理系统,采用传统的MVC架构模式,使用Servlet作为控制器,JSP作为视图层,通过JDBC进行数据库操作。系统提供了商品管理和类别管理的基本功能,并实现了基于角色的访问控制。 ## 技术栈 - 后端:JavaWeb (Servlet + JSP) - 数据库:MySQL 5.7 - 前端:原生JavaScript + CSS - 连接池:JDBC直连 - 项目管理:Eclipse IDE ## 系统特点 1. **用户权限管理** - 支持用户注册和登录功能 - 实现了基于角色的访问控制(RBAC) - 区分普通用户和管理员权限 2. **商品管理功能** - 商品的增删改查操作 - 支持按类别管理商品 - 用户只能管理自己添加的商品 - 管理员可以查看所有商品 3. **类别管理功能** - 商品类别的增删改查操作 - 仅管理员可以管理类别 4. **界面设计** - 清晰的布局结构(header、left menu、content、footer) - 响应式设计,适配不同屏幕尺寸 - 统一的页面风格和操作体验 ## 项目结构 ``` supermarket/ ├── WebContent/ # Web资源目录 │ ├── WEB-INF/ # Web配置目录 │ │ └── web.xml # Web应用配置文件 │ ├── css/ # 样式文件 │ │ └── style.css # 全局样式 │ ├── login.jsp # 登录页面 │ ├── register.jsp # 注册页面 │ ├── product_list.jsp # 商品列表页面 │ ├── product_form.jsp # 商品编辑页面 │ ├── category_list.jsp # 类别列表页面 │ └── category_form.jsp # 类别编辑页面 ├── src/ # Java源代码目录 │ └── com/supermarket/ │ ├── entity/ # 实体类 │ │ ├── User.java │ │ ├── Product.java │ │ └── Category.java │ ├── dao/ # 数据访问层 │ │ ├── UserDao.java │ │ ├── ProductDao.java │ │ └── CategoryDao.java │ ├── servlet/ # 控制器层 │ │ ├── UserServlet.java │ │ ├── ProductServlet.java │ │ └── CategoryServlet.java │ └── util/ # 工具类 │ └── DBUtil.java # 数据库连接工具 └── supermarket.sql # 数据库脚本 ``` ## 代码特点 1. **规范的代码组织** - 采用标准的MVC分层架构 - 清晰的包结构和命名规范 - 统一的编码风格 2. **安全性考虑** - 登录状态验证 - SQL注入防护 - 权限检查机制 3. **用户体验优化** - 表单验证 - 友好的错误提示 - 操作确认提示 4. **代码复用** - 通用的数据库连接工具 - 统一的页面布局 - 可重用的CSS样式 ## 部署说明 1. 创建MySQL数据库,执行`supermarket.sql`脚本 2. 配置`DBUtil.java`中的数据库连接信息 3. 使用Eclipse导入项目 4. 配置Tomcat服务器 5. 部署运行项目 ## 注意事项 1. 请确保MySQL 5.7已正确安装并运行 2. 数据库字符集使用utf8mb4 3. 请根据实际情况修改数据库连接配置 4. 建议使用Eclipse IDE进行开发和调试 <img src="https://pic.code-nav.cn/post_picture/1900441785166540802/4TIgDP3KOcqrUDbH.png" alt="1.png" width="395px" /> <img src="https://pic.code-nav.cn/post_picture/1900441785166540802/dvgILY6Yay2Ar5Xo.png" alt="2.png" width="348px" /> <img src="https://pic.code-nav.cn/post_picture/1900441785166540802/byHxr23xx6r2YHE0.webp" alt="3.png" width="100%" /> <img src="https://pic.code-nav.cn/post_picture/1900441785166540802/eRFXTkkgdnnjK1Bn.webp" alt="4.png" width="100%" /> <img src="https://pic.code-nav.cn/post_picture/1900441785166540802/37NlR5YErZIGKvFq.webp" alt="5.png" width="100%" /> <img src="https://pic.code-nav.cn/post_picture/1900441785166540802/5g564pNy9VWujayh.webp" alt="6.png" width="100%" />

计算机网络基础 - 应用层

## 应用层 ### 网络应用的体系结构 - 客户-服务器模式(C/S:client/server) - 对等模式(P2P:Peer To Peer) - 混合体:客户-服务器和对等体系结构 #### C/S 体系结构 **服务器** - 一直运行 - 固定的 IP 地址和周知的端号(约定) - 扩展性:服务器场(数据中心进行扩展、 扩展性差) **客户端** - 主动与服务器通信 - 与互联网有间歇性的连接 - 可能是动态 IP 地址 - 不直接与其它客户端通信 **注意**:服务器 IP 也不一定是固定的,但是域名必须是固定的。可以通过 ddns 来刷新服务器的动态 ip #### P2P 体系结构 - (几乎)没有一直运行的服务器 - 任意端系统之间可以进行通信 - 每一个节点既是客户端又是服务器 - 参与的主机间歇性连接且可以改变 IP 地址 - 难以管理 **例子**:Gnutella、迅雷 #### C/S 和 P2P 体系结构的混合体 **Napster** - 文件搜索:集中 - 文件传输:P2P **即时通信** - 在线检测:集中 - 当用户上线时,向中心服务器注册其 IP 地址 - 用户与中心服务器联系,以找到其在线好友的位置 - 两个用户之间聊天:P2P ### 进程通信 #### 概述 **进程**(在主机上运行的应用程序) - 分为客户端进程、服务端进程 - 在同一个主机内,使用进程间通信机制通信 - 不同主机间,通过报文来通信 **进程寻址** 进程为了接收报文,必须有一个**标识**,即:SAP(发送也需要标识) - 主机:唯一的 32位IP地址 - 所采用的传输层协议:TCP or UDP - 端口号(Port Numbers) **层间接口必须要携带的信息** - 要传输的报文(对于本层来说:SDU) - 谁传的:对方的应用进程的标示:IP + TCP(UDP) 端口 - 传给谁:对方的应用进程的标示:对方的 IP + TCP(UDP) 端口号 如果Socket API 每次传输报文,都携带如此多的信息,太繁琐易错,不便于管理 #### 套接字(Socket) 一个进程向另一个进程发送的报文必须通过下面的网络时候,进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文,因此套接字也称为应用程序和网络之间的应用程序编程接口 API - 进程向套接字发送报文或从套接字接收报文(套接字 <=> 门户) - 发送进程将报文推出门户,发送进程依赖于传输层设施在另外一侧的门将报文交付给接受进程 - 接收进程从另外一端的门户收到报文(依赖于传输层设施) <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/RJwXmhMzX4xQQTwQ.webp" alt="image-20240814224408695" width="100%" /> #### TCP socket - TCP服务,两个进程之间的通信需要之前要建立连接 - 两个进程通信会持续一段时间,通信关系稳定 - 可以用**一个整数表示两个应用实体之间的通信关系**,本地标示 四元组:源端系统 ip 、源端系统 port 、目标端系统 ip 、目标端系统 port #### UDP socket - UDP服务,两个进程之间的通信需要之前无需建立连接 - 每个报文都是独立传输的 - 前后报文可能给不同的分布式进程 - 穿过层间接口的信息大小最小 - 只能用一个整数表示本应用实体的标示 二元组:本机 ip、本机 port 注意:但是传输报文时,必须要提供对方 ip、port ### 应用层协议 运行在不同端系统上的应用进程如何相互交换报文(协议定义规范) - 交换的报文类型:请求和应答报文 - 各种报文类型的语法:报文中的各个字段及其描述 - 字段的语义:即字段取值的含义 - 进程何时、如何发送报文及对报文进行响应的规则 - 应用协议仅仅是应用的一个组成部分 **公开协议以及专用协议** - 公开协议:由RFC文档定义允许互操作,如 HTTP、SMTP - 专用/私有协议:协议不公开,如 Skype ### 应用层需要传输层提供的服务 - 数据丢失率 - 有些应用则要求100%的可靠数据传输(如 文件) - 有些应用(如 音频)能容忍一定比例以下的数据丢失 - 吞吐 - 一些应用出于有效性考虑,对数据传输有严格的时间限制(Internet 电话、交互式游戏) - 延迟 - 一些应用(如多媒体)必须需要最小限度的吞吐,从而使得应用能够有效运转 - 一些应用能充分利用可供使用的吞吐(弹性应用) - 安全性(机密、完整性、可认证性) **常见应用对传输服务的要求** | 应用 | 数据丢失率 | 吞吐 | 时间敏感性 | | ---------- | ---------- | ------------------------------------------- | ---------- | | 文件传输 | 不能丢失 | 弹性 | 不 | | e-mail | 不能丢失 | 弹性 | 不 | | Web 文档 | 不能丢失 | 弹性 | 不 | | 实时音视频 | 容忍丢失 | 音频:5kbps ~ 1Mbps<br/>视频:0kbps ~ 5Mbps | 100 ms | | 存储音视频 | 容忍丢失 | 音频:5kbps ~ 1Mbps<br/>视频:0kbps ~ 5Mbps | 几秒之内 | | 交互式游戏 | 容忍丢失 | 0 kbps ~ 10 kbps | 100ms | ### Web 与 HTTP #### 概念 Web页由一些对象组成,对象可以是HTML文件、JPEG图像、Java小程序、声音剪辑文件等 - 多数Web页都含有一个 HTML 基本文件,该 HTML 基本文件又包含若干对象的引用(链接) - 通过URL对每个对象进行引用:访问协议,用户名,口令字,端口等 Web 的应用层协议的核心是**超文本传输协议 HTTP** - 定义了 Web 客户向 Web 服务器请求 Web 页面的方式,以及服务器向客户传送 Web 页面的方式 - 使用传输层 TCP 协议建立连接 - HTTP 是无状态的,服务器并不维护客户的信息 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240817165707660.png" alt=" " style="zoom:67%;" /> ---- #### 非持续连接和持续连接 在许多因特网应用程序中,客户和服务器在相当长的时间范围内通信,当这种客户-服务器的交互是经 TCP 进行的时候,应用程序的研制者就需要做一个重要决定 ,即每个请求/响应对是经**单独的 TCP 连接**发送,还是所有的请求应经**相同 TCP 连接**发送呢? 前者就是非持续连接,后者就是持续连接(HTTP1.0 采用的是非持续连接;HTTP1.1 采用的是持续连接) **非持续连接存在的问题** - 必须为每一个请求的对象建立和维护一个全新的连接,对于每个这样的连接,在客户和服务器中都要分配 TCP 的缓冲区和保持 TCP 变量,这给 Web 服务器带来了严重的负担,因为 Web 服务器可能同时服务于数以百计不同的客户的请求 - 每一个对象经受两倍 RTT 的交付时延,即一个 RTT 用于创建 TCP ,另一个 RTT 用于请求和接收一个对象 **响应时间模型** - **往返时间 RTT**:一个小的分组从客户端到服务器,再回到客户端的时间 - **响应时间**:发起TCP连接时间 + HTTP请求等待时间 + 传输时间 = 2RTT + 传输时间 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240817170743019.png" alt=" " style="zoom:67%;" /> --- #### HTTP报文格式 ##### 请求报文 请求报文第一行称为 **请求行**,后继的行称为 **首部行**,最后可能还有**实体对象**(实体对象会和首部行中间会有回车或者换行,注意是在特定的请求方法下才有内容,如 POST) - 请求行有三个字段:方法字段、URL 字段、HTTP 版本字段 <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/OWtsDTh2kZNSVKnv.png" alt="image-20240817171710053" width="453px" /> - 首部行指明了对象的主机域名/IP、是否继续连接、用户代理(比如浏览器版本)、语言类型等等 <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/xmpFVtnWt25chvTS.webp" alt="image-20240817171933273" width="356px" /> - 一个HTTP请求报文的通用格式 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240817172400390.png" alt="image-20240817172400390" style="zoom:67%;" /> ##### 响应报文 它也是由三部分组成:一个**初始状态行**,**首部行** , 然后是**实体对象** - 状态行有 3 个字段:协议版本字段、状态码和相应状态信息 <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/ptCXXfG4JCsC0gT5.png" alt=" " width="228px" /> - 首部行指明了是否继续连接、服务器产生并发送该响应报文的日期和时间、用户代理(比如浏览器版本)、上次对象创建或者最后修改的日期和时间等等 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240817220439467.png" alt="image-20240817220439467" style="zoom:67%;" /> - 一个HTTP 响应报文的通用格式 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240817220728619.png" alt="image-20240817220728619" style="zoom:67%;" /> **响应状态码** - **200 OK** :请求成功 - **301 Moved Permanently** - 请求的对象已经被永久转移了;新的URL在响应报文的 Location(首部行中指定) - 客户端软件自动用新的 URL 去获取对象 - **400 Bad Request** :一个通用的差错代码,表示该请求不能被服务器理解 - **404 Not Found** :请求的文档在该服务上没有找到 - **505 HTTP Version Not Supported**:服务器不支持请求报文使用的 HTTP 协议版本 --- #### Cookie 用于维护客户和服务器之间的状态(HTTP 是无状态的) <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240817221119552.png" alt="image-20240817221119552" style="zoom:67%;" /> **缺点** 尽管 cookie 常常能简化用户的因特网活动,但是它的使用仍具有争议,因为它们被认为是对用户隐私的一种侵害;如我们刚才所见,结合 cookie 和用户提供的账户信息,Web 站点可以知道许多有关用户的信息,并可能将这些信息卖给第三方 --- #### Web 缓存 Web 缓存器 (Web cache) 也叫代理服务器,不访问原始服务器,就能满足客户的请求 - 代理服务器既是服务器又是客户端 - 浏览器将所有的 HTTP 请求发给代理服务器 - 在缓存中的对象,直接返回对象 - 如果不在缓存中,代理服务器请求原始服务器,然后再将对象返回给客户端 <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/33hOdIytiwJCuFxT.webp" alt="image-20240817221336106" width="100%" /> **如何判断放在代理服务器中的对象是否是陈旧的?** 通过获取请求头的方式获取到 If-Modified-Since 信息(上次对象创建或者最后修改的日期和时间),进而可以判断出代理服务器中的对象在源服务器中是否有被修改过 ### FTP 与 EMail #### 文件传输协议 FTP - 有状态的协议 - 向远程主机上传输文件或从远程主机接收文件 - ftp服务器端口号为 21 **FTP客户端与FTP服务器上传下载过程** - FTP客户端与FTP服务器通过端口 21 联系,并使用TCP作为传输协议 - 客户端通过控制连接获得身份确认 - 客户端通过控制连接发送命令浏览远程目录并上传/下载文件 - 收到一个文件传输命令时,服务器打开一个到客户端的数据连接 - 一个文件传输完成后,服务器关闭连接 - 服务器打开第二个TCP数据连接用来传输另一个文件 注意:建立的控制连接和数据连接不在同一个进程端口上 **建立数据连接的模式** - 主动模式时,服务器的20号端口主动与客户端的随机端口建立传递数据的连接 - 被动模式时,服务器告知客户端,让其与服务器的某一指定端口建立数据连接,但客户端的端口依然是随机的 #### 电子邮件 EMail 电子邮件是一种异步通信媒介,现代电子邮件具有许多强大的特性,包括具有附件、超链接、 HTTP 格式文本和图片的报文 ##### 主要组成部分 - **用户代理** 又名 “邮件阅读器” - 撰写、编辑和阅读邮件 如 Outlook、Foxmail - 输出和输入邮件保存在服务器上 - **邮件服务器** - 邮箱中管理和维护发送给用户的邮件 - 输出报文队列保持待发送邮件报文 - **简单邮件传输协议 SMTP** - 客户:发送方邮件服务器 - 服务器:接收端邮件服务 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240822222417842.png" alt="image-20240822222417842" style="zoom:67%;" /> ##### SMTP ###### 概述 SMTP 是因特网电子邮件的核心,用于从发送方的邮件服务器发送报文到接收方的邮件服务器 - 持久性连接 - 报文必须为7位 ASCII 码 - 使用TCP在客户端和服务器之间传送报文,端口号:25 - 直接传输:从发送方服务器到接收方服务器,传输的3个阶段 - 握手 - 传输报文 - 关闭 ###### SMTP 与 HTTP1.1 相同点是两者都使用持续连接的方式 不同点: - HTTP 协议主要是一个 PULL 的协议,STMP 基本上是一个 PUSH 的协议 - SMTP 要求每个报文采用7位 ASCII 码,而 HTTP 并没有这种限制 - SMTP 可以将一个既包含文本又包含图片的文件放在同一个报文中,但是 HTTP 不行 ##### 邮件报文格式 ###### 报文格式 **报文的首部行**:每个首部必须含有一个 From 首部行和一个 To 首部行;一个首部也许包含一个 Subject(其他可选的首部行) <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240823131820135.png" alt="image-20240823131820135" style="zoom:67%;" /> ###### 多媒体扩展 MIME 一种用于扩展电子邮件消息功能的标准,允许电子邮件不仅限于文本,还可以包含各种格式的内容如图像、音频、视频等 - 它在多媒体内容传输和Web应用中也被广泛应用 - MIME定义了内容类型(如 `text/html`、`image/png`、`audio/mpeg` 等)以及内容编码方式,从而使得浏览器和其他应用程序能够正确处理和显示这些内容 - 报文的格式 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240824105017006.png" alt="image-20240824105017006" style="zoom:80%;" /> ##### 邮件访问协议 ###### 概述 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240823132238282.png" alt="image-20240823132238282" style="zoom:67%;" /> - SMTP: 传送到接收方的邮件服务器 - 邮件访问协议:从服务器访问邮件 - POP3:邮局访问协议(Post Office Protocol),用户身份确认 (代理 <=> 服务器) 并下载 - IMAP:Internet 邮件访问协议(Internet Mail Access Protocol),在服务器上处理存储的报文 - HTTP ###### POP3 一个极为简单的邮件访问协议(本地管理文件夹) **工作过程** 当用户代理打开了一个到邮件服务器(服务器)端口 110 上的 TCP 连接后, POP3就开始工作了 1. 用户代理发送用户名和口令(以明文形式)以鉴别用户 2. 用户代理取回报文,同时在这个阶段用户代理还能进行如下操作,对报文做删除标记,取消报文删除标记,以及获取邮件的统计信息 3. 在客户发出了 quit 命令之后,目的是结束该 POP3 会话(这个时候该邮件服务器删除那些被标记为删除的报文) **注意** - 可以使用下载并删除、下载并保留两种模式 - 下载并删除模式:如果改变客户机,客户就不能阅读邮件 - 下载并保留模式:不同客户机上为报文进行拷贝 - 在用户代理与邮件服务器之间的POP3会话期间,该POP3服务器保留了一些状态信息,特别是记录了哪些用户报文被标记为删除了;然而,POP3服务器并不在POP3会话过程中携带状态信息,会话中不包括状态信息大大简化了POP3服务的实现(在会话中是无状态的) ###### IMAP 一种用于电子邮件客户端与邮件服务器之间通信的协议(远程管理文件夹) 它允许用户在服务器上管理和访问电子邮件,而不仅仅是下载到本地客户端;IMAP特别适合于需要在多个设备上访问相同邮箱的场景,例如在手机、电脑和其他设备上查看邮件 - IMAP 服务器将每个报文与一个文件夹联系起来 - 允许用户用目录来组织报文 - 允许用户读取报文组件 - 在会话过程中保留用户状态: 目录名、报文ID与目录名之间映射 ### DNS #### 概述 为其他应用提供服务的应用 - 运行在UDP之上端口号为53的应用服务 - 核心的 Internet 功能,但以应用层协议实现,在网络边缘处理复杂性 **DNS 主要用来做什么?** **主要目的** ip 地址(ip 地址标识主机、路由器)不好记忆,不便人类使用,一般倾向于使用一些有意义的字符串来标识 Internet上的设备,例如:百度 https://www.baidu.com/baidu 然而路由器则喜欢定长的、有着层次结构的 ip 地址,例如:127.0.0.1 因此为了折中这些不同的方式,需要一种能进行主机名到 ip 地址转换的应用服务 **其它目的** - 主机别名到规范名字的转换 - 邮件服务器别名到邮件服务器的正规名字的转换 - **负载均衡**:当客户对映射到某地址集合的名字发出一个 DNS 请求时,即服务器用 ip 地址的整个集合进行响应,但在每个回答中循环这些地址次序 #### 域名结构 - 每个(子)域下面可划分为若干子域,树叶是主机 - 域名:从本域往上,直到树根;中间使用 “.” 间隔不同的级别,例如:www.baidu.com **域与物理网络无关** - 域遵从组织界限,而不是物理网络 - 一个域的主机可以不在一个网络 - 一个网络的主机不一定在一个域 - 域的划分是逻辑的,而不是物理的 #### 工作机理 ##### 集中式设计 客户直接将所有查询直接发往单一的 DNS 服务器,同时该 DNS 服务器直接对所有的查询客户做出响应。尽管这种设计的简单性非常具有吸引力,但它不适用于当今的因特网,因为因特网有着数量巨大的主机,存在如下问题 - **单点故障**:如果该 DNS 服务器崩溃,整个因特网随之瘫痪 - **通信容量**:单个 DNS 服务器不得不处理所有的 DNS 查询(上亿台) - **远距离的集中式数据库**:单个 DNS 服务器不可能"邻近"所有查询客户 - **维护**:单个 DNS 服务器将不得不为所有的因特网主机保留记录 ##### 分布式、层次数据库 为了处理扩展性问题, DNS 使用了大量的 DNS 服务器 ,它们以层次方式组织,并且分布在全世界范围内。大致分成3种类型的 DNS 服务器,**根 DNS 服务器**、**顶级域 DNS 服务器**和**权威 DNS 服务器** <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240825141335109.png" alt="image-20240825141335109" style="zoom:67%;" /> ###### 根 DNS 服务器 根名字服务器由 13个不同的组织管理(根名字服务器提供 TLD 服务器的 ip 地址) ###### 顶级域 DNS 服务器 对于每个顶级域和所有国家的顶级域都有 TLD 服务器(或服务器集群) (TLD 服务器提供了权威 DNS 服务器的 ip 地址) - 通用的(.com、.edu、.int 等等) - 国家的(.cn、.us、.nl等等) <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240824151117670.png" alt="image-20240824151117670" style="zoom:67%;" /> ###### 权威 DNS 服务器 组织机构的DNS服务器, 提供组织机构服务器(如Web和mail)可访问的主机和 ip 之间的映射(组织机构可以选择实现自己维护或由某个服务提供商来维护) <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240825142055334.png" alt="image-20240825142055334" style="zoom:67%;" /> ###### 本地DNS服务器 严格说来,一个本地DNS服务器并不属于该服务器的层次结构,但它对DNS层次结构是至关重要 主机的本地DNS服务器通常“邻近”本主机。当主机发出DNS请求时,该请求被发往本地DNS服器,它起着**代理**的作用,并将该请求转发 到DNS服务器层次结构中,详细的调用过程如下两种 **递归查询** 名字解析负担都放在当前联络的名字服务器上,解决方式: 迭代查询 <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/wg2o2GvYieWq9pYr.webp" alt="image-20240825143810226" width="377px" /> **迭代查询** - 根(及各级域名)服务器返回的不是查询结果,而是下一个 DNS 的地址 - 最后由权威名字服务器给出解析结果 <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/A8TZPnm7phaJ0JPL.webp" alt="image-20240825143430490" width="398px" /> ##### DNS 缓存 为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术 - DNS缓存的原理非常简单。在一个请求链中,当某DNS服务器接收一个DNS回答(包含某主机名到 ip 地址的映射)时,它能将映射缓存在本地存储器中 - 由于主机和主机名与 ip 地址间的映射并不是永久的,DNS服务器在一段时间后(通常设置为两天)将丢弃缓存的信息 #### 记录和报文 ##### 资源记录 - 作用:维护域名 - ip 地址(其它)的映射关系 - 位置:Name Server的分布式数据库中 - RR格式: (Domain_name,Ttl,Type,Class,Value) - Domain_name: 域名 - Ttl: time to live : 生存时间,决定了资源记录应当从缓存中删除的时间 - Class 类别 :对于Internet,值为 IN - Value 值:可以是数字,域名或ASCII串 - Type 类别:资源记录的类型 对于不同的 Type 类型,转换的方式不同,如下 - Type = A:Name 为主机;Value 为 ip 地址 - Type = CHAME:Name 为规范名字的别名;Value 为规范名字 - Type = NS:Name 为域名;Value 为该领域的权威服务器的域名 - Type = MX:Name 为邮件服务器的规范名字的别名;Value 为邮件服务器的规范名字 ##### 报文 DNS 只有这两种报文,并且查询和回答报文有着相同的格式 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240826130110784.png" alt="image-20240826130110784" style="zoom:80%;" /> - 前 12 个字节是首部区域。第一个字段(标识符)是一个 16 比特的数,用于标识该查询(类似于订单号的作用) - 问题区域包含着正在进行的查询信息该区域包括:①名字字段 ②类型字段 - 回答区域包含了对最初请求的名字的资源记录 - 权威区域包含了其他权威服务器的记录 ---- ### P2P 应用 - 没有(或极少)一直运行的服务器 - 任意端系统都可以直接通信 - Peer 节点间歇上网,每次 ip 地址都有可能变化 **例子** - 文件分发 (BitTorrent) - 流媒体 (KanKan) - VoIP (Skype) #### P2P 体系结构的扩展性 **分发时间**是所有对等方得到该文件的副本所需要的时间 如图所示,对于客户一服务器体系结构,随着对等方数量的增加,分发时间呈线性增长并且没有界。然而,对于P2P体系结构,最小分发时间不仅总是小于客户 - 服务器体系结构的分发时间,并且对于任意的对等方数量N,总是小于1小时(计算) <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240829201304498.png" alt=" " style="zoom:80%;" /> 因此,具有P2P体系结构的应用程序能够是自扩展的。这种扩展性的直接成因是:**对等方除了是比特的消费者外还是它们的重新分发者** #### BitTorrent 协议 BitTorrent是一种用于文件分发的流行P2P协议【Chao 2011】 ##### torrenl 洪流 参与一个特定文件分发的所有对等方的集合 - 在一个洪流中的对等方彼此下载等长度的文件块 (chunk) ,典型的块长度为 256KB - 当一个对等方首次加入一个洪流时,它没有块随着时间的流逝,它累积了越来越多的块 当它下载块时,也为其他对等方上载了多个块。一旦某对等方获得了整个文件,它也许(自私地)离开洪流,或(大公无私地)留在该洪流中并继续向其他对等方上载块 - 任何对等方可能在任何时候仅具有块的子集就离开该洪流,并在以后重新加入该洪流中 ##### BitTorrent 运行的过程 **概述** 每个洪流具有一个基础设施节点,称为**追踪器**( tracker) 当一个对等方加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中,假设当一个新的对等方 Alice 加入该洪流时,追踪器随机地从参与对等方的集合中选择对等方的一个子集 ,并将这些对等方的 ip 地址发送给 Alice <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240830191634898.png" alt="image-20240830191634898" style="zoom: 50%;" /> **具体过程** - 在任何给定的时间,每个对等方将具有来自该文件的块的子集,并且不同的对等方具有不同的子集(文件被分成 256KB 的块,每个对等放会用 bitmap 来记录每个块的状态,并相互询问每个邻近对等方它们所具有的块列表) - 将使用**最稀缺优先技术**(最稀缺的块就是那些在她的邻居中副本数量中最少的块)来优先请求哪些块,这样,最稀缺块得到更为迅速的重新分发,其目标是(大致地)均衡每个块在洪流中的副本数量 - 为了决定她响应哪个请求, BitTorrent 使用了一种机灵的对换算法。根据当前能够以最高速率向她提供数据的邻居,确定以最高速率流入的 4 个邻居并给出其主优先权 - 每过 10秒将重新确认该 4 个邻居(这 4 个对等方被称为疏通),重要的是,每过 30 秒,她也要**随机**地选择另外一个邻居并向其发送块,如果发现该块最高速率优于之前选择的 4 个邻居,将会在下个周期替代 4 个邻居中速率最低得那一个(除这 5 个之外,其他块都必须进入到阻塞的状态) #### P2P文件共享应用 **存在的问题** - 如何定位所需资源 - 如何处理对等方的加入与离开 ##### 非结构化 P2P - 集中化目录 - 完全分布式 - 混合体 **集中化目录** 最初的 **Napster** 设计,当对等方连接时,它告知中心服务器: ip 地址、 内容 **存在的问题**:文件传输是分散的,而定位内容则是高度集中的 - 单点故障 - 性能瓶颈 - 侵犯版权 **查询洪泛:Gnutella** - 全分布式,没有中心服务器 - 限制范围的洪泛查询(通常所连接的节点少于10个) - 开放文件共享协议 - 许多 Gnutella 客户端实现了Gnutella协议(类似HTTP有许多的浏览器) **利用不匀称性:KaZaA** - 每个对等方要么是一个组长,要么隶属于一个组长 - 组长跟踪其所有的孩子的内容 - 组长与其他组长联系(转发查询到其他组长、获得其他组长的数据拷贝) <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/dIQfhPMgsRLrqrn0.png" alt="image-20240902215526896" width="306px" /> **查询过程** - 客户端向其组长发送关键字匹配描述的方式查询(每个文件有一个散列标识码和一个描述符) - 组长用匹配进行响应,对每个匹配:元数据、散列标识码和 ip 地址 - 如果组长将查询转发给其他组长,其他组长也以匹配进行响应 - 客户端选择要下载的文件,向拥有文件的对等方发送一个带散列标识码的 HTTP 请求 ##### DHT 结构化 P2P(了解) 树形、环形等 --- ### 视频流和内容分发网 #### 视频流化服务 视频是一系列的图像,通常以 种恒定的速率(如每秒 24、30 张图像)来展现;一幅未压缩、数字编码的图像由像素阵列组成(其中每个像素是由一些 比特编码来表示亮度和颜色) - 视频流量:占据着互联网大部分的带宽(例如:Netflix, YouTube: 占据37%, 16% 的ISP下行流量) - 到目前为止,对流式视频的最为重要的性能度量是**平均端到端吞吐量** - 不同用户拥有不同的能力(例如:有线接入和移动用户;带宽丰富和受限用户) **解决方案**:分布式的,应用层面的基础设施 #### HTTP 流和 DASH - 在HTTP 流中 ,视频只是存储在 HTTP 服务器中作为一个普通的文件、每个文件有一个特定的 URL (尽管 HTTP 流在实践中已经得到广泛部署,,但它具有严重缺陷,即所有客户接收到**相同编码**的视频) - 出现了一种新型基于 HTTP 的流的研发,它常常被称为经 HTTP 的**动态适应性流 DASH** - 在 DASH 中,视频编码为几个不同的版本,其中每个版本具有不同的比特率,对应于不同的质量水平 **服务器** - 将视频文件分割成多个块 - 每个块独立存储,编码于不同码率(8-10种) - 告示文件: 提供不同块的URL **客户端** - 先获取告示文件 - 周期性地测量服务器到客户端的带宽 - 查询告示文件,在一个时刻请求一个块,HTTP头部指定字节范围 - 如果带宽足够,选择最大码率的视频块 - 会话中的不同时刻,可以切换请求不同的编码块(取决于当时的可用带宽) **动态适应性流 DASH 的优点** - 动态估计带宽、当前缓存情况,DASH 通常能够做到持续播放 - 减轻服务器的负担,可扩展性强 #### 内容分发网 CDN ##### 面临挑战 服务器如何通过网络向上百万用户同时流化视频内容? - 建立单一的大规模数据中心,在数据中心中存储其所有视频,并直接从该数据中心向世界范围的客户传输流式视频 - 服务器到客户端路径上跳数较多,瓶颈链路的带宽小导致停顿 - “二八规律”决定了网络同时充斥着同一个视频的多个拷贝,效率低(付费高、带宽浪费、效果差) - 单点故障点,性能瓶颈 评述:相当简单,但是这个方法不可扩展 - 通过CDN,全网部署缓存节点,存储服务内容,就近为用户提供服务,提高用户体验 - 将CDN服务器深入到许多接入网(更接近用户,数量多,离用户近,管理困难) - 部署在少数(10个左右)关键位置,如将服务器簇安装于 POP 附近 ##### CDN 概述 CDN 管理分布在多个地理位置上的服务器,在它的服务器中存储视频(和其他类型的 Web 内容,包括文档、图片和音频)的副本,并且所有试图将每个用户请求定向到一个将提供最好的用户体验的 CDN 位置 - CDN 可以是专用 CDN,即它由内容提供商自己所拥有 - CDN 可以是第三方 CDN,它代表多个内容提供商分发内容 CDN 通常采用两种不同的服务器**安置原则** - **深入**,该原则是通过在遍及全球的接入ISP中部署服务器集群来深入到ISP的接入网中。其目标是靠近端用户,通过减少端用户和 CDN 集群之间链路和路由器的数量,从而改善了用户感受的时延和吞吐量 - **邀请做客**,该原则是通过在少量(例如10个)关键位置建造大集群来邀请到 ISP 做客。不是将集群放在接入ISP 中,这些 CDN 通常将它们的集群放置在因特网交换点(XP) - 与深入设计原则相比,邀请做客设计通常产生较低的维护和管理开销,可能以对端用户的较高时延和较低吞吐量为代价 ##### CDN 操作过程 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240913132044581.png" alt="image-20240913132044581" style="zoom:67%;" /> 1. 用户访问位于 NetCinema 的 Web 网页 2. 当用户点击链接 http://video.netcinema.com/6Y7B23V 时,该用户主机发送了一个对于 video.netcinema.com 的 DNS 请求 3. 用户的本地 DNS 服务器(LDNS)将该 DNS 请求中继到一台用于 NetCinema 的权威 DNS 服务器,该服务器观察到主机名 video.netcinema.com 中的字符串“video”。为了将该 DNS 请求移交给 KingCDN,NetCinema 权威 DNS 服务器并不返回一个 IP 地址,而是向 LDNS 返回一个 KingCDN 域的主机名,如 a11O5.kingedn.com 4. DNS 请求进入了 KingCDN 专用 DNS 基础设施。用户的 LDNS 则发送第二个请求,此时是对 a11O5.kingedn.com 的 DNS 请求,KingCDN 的DNS系统最终向LDNS 返回 KingCDN 内容服务器的 IP 地址。所以正是在这里,在 KingCDN 的 DNS 系统中,指定了 CDN 服务器,客户将能够从这台服务器接收到它的内容 5. LDNS 向用户主机转发内容服务 CDN 节点的 IP 地址 6. 一旦客户收到 KingCDN 内容服务器的 IP 地址,它与具有该 IP 地址的服务器创建了一条直接的TCP连接,并且发出对该视频的 HTTP 请求。如果使用了DASH 服务器将首先向客户发送具有 URL 列表的告示文件,每个URL对应视频的每个版本,并且客户将动态地选择来自不同版本的块 ##### 集群选择策略 任何CDN部署,其核心是集群选择策略,即动态地将客户定向到 CDN 中的某个服务器集群或数据中心的机制 - 一种简单的策略是指派客户到地理上**最为邻近的集群**。使用商用地理位置数据库,每个 LDNS IP地址都映射到一个地理位置。此外,这种简单的策略忽略了时延和可用带宽随因特网路径时间而变化,总是为特定的客户指派相同的集群 - 为了基于当前流量条件为客户**决定最好的集群**,CDN能够对其集群和客户之间的时延和丢包性能执行周期性的**实时测量**。例如,CDN能够让它的每个集群周期性地向位于全世界的所有 LDNS 发送探测分组(例如,ping报文或DNS请求) - 给客户端一个CDN服务器的列表,让客户端来选择CDN服务器 ---- ### 套接字编程 #### Socket 编程 应用进程使用传输层提供的服务才能够交换报文,实现应用协议,实现应用 - 地点:界面上的 SAP (Socket) - 方式:Socket API **套接字**:分布式应用进程之间的门,传输层协议提供的端到端 **传输层服务的 socket 类型** - TCP:可靠的、字节流的服务 - UDP:不可靠(数据UDP数据报)服务 --- #### UDP 套接字编程 为客户端和服务器提供不可靠的字节组的传送服务,在客户端和服务器之间没有连接,没有握手(传送的数据可能乱序,也可能丢失) - 发送端在每一个报文中明确地指定目标的 IP 地址和端口号 - 服务器必须从收到的分组中提取出发送端的 IP 地址和端口号 **演示 UDP 套接字编程** 1. 客户从其键盘读取一行字符(数据)并将该数据向服务器发送 2. 服务器接收该数据并将这些字符转换为大写 3. 服务器将修改的数据发送给客户 4. 客户接收修改的数据并在其监视器上将该行显示出来 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240918132225931.png" alt="image-20240918132225931" style="zoom:80%;" /> --- #### TCP 套接字编程 在客户端和服务器进程之间提供了可靠的、字节流(管道) **服务器首先运行,等待连接建立** - 创建 Welcome socket - 和本地端口捆绑 - 在 Welcome socket 上阻塞式等待接收用户的连接 **客户端主动和服务器建立连接** - 创建客户端本地套接字(隐式捆绑到本地port)指定服务器进程的 IP 地址和端口号,与服务器进程连接 - 连接API调用有效时,客户端 IP 与服务器建立了TCP连接 **当与客户端连接请求到来时,服务器接受来自用户端的请求,解除阻塞式等待,返回一个新的socket(与 Welcome socket 不一样)** - 与客户端通信,允许服务器与多个客户端通信 - 使用源 IP 和源端口来区分不同的客户端 注意:区别下欢迎套接字和连接套接字 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240918194934333.png" alt="image-20240918194934333" style="zoom:50%;" /> **演示 UDP 套接字编程** 1. 客户从其键盘读取一行字符(数据)并将该数据向服务器发送 2. 服务器接收该数据并将这些字符转换为大写 3. 服务器将修改的数据发送给客户 4. 客户接收修改的数据并在其监视器上将该行显示出来 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240918195128412.png" alt="image-20240918195128412" style="zoom:67%;" />

#资源# #分享# #计算机基础# 我来分享资源了:https://shimo.im/docs/PJAUY30F1uYksv0h/read

计算机中常见的系统变量、Path环境变量配置有什么用?何时需要进行配置

<html> <head></head> <body> <div class="content ql-editor"> <div class="milkdown-editor"> <div class="milkdown"> <div class="ProseMirror prose dark:prose-invert outline-none dark:!bg-[#20242A] box-border milkdown-theme-nord editor ProseMirror-focused"> <p>在计算机系统中,系统变量和Path环境变量是常见的配置选项,它们对于软件开发和系统运行起着重要作用。本文将介绍系统变量和Path环境变量的作用以及何时需要进行配置。</p> <h3 id="">系统变量的作用和配置</h3> <p>系统变量是在操作系统级别设置的全局变量,可以在整个操作系统中访问。它们的主要作用包括:</p> <ol> <div> <li class="flex flex-column gap-2 items-start"><span class="flex items-center"><span class="text-nord8">1.</span></span> <div class="min-w-0"> <div style="white-space;"> <p><strong>统一管理路径和配置信息</strong>:通过设置系统变量,可以统一管理各种路径和配置信息,如软件安装路径、Java开发工具包(JDK)路径等。</p> </div> </div></li> </div> <div> <li class="flex flex-column gap-2 items-start"><span class="flex items-center"><span class="text-nord8">2.</span></span> <div class="min-w-0"> <div style="white-space;"> <p><strong>方便维护和更新</strong>:当软件安装路径发生变化时,只需修改相应的系统变量,而不需要逐个修改依赖该路径的应用程序或配置文件。</p> </div> </div></li> </div> </ol> <p>举例来说,当我们安装了Java开发工具包(JDK)时,可以通过配置一个名为JAVA_HOME的系统变量来指定JDK的安装路径。这样,在需要引用JDK路径的地方,可以使用%JAVA_HOME%变量,而不需要每次都输入完整的路径。</p> <h3 id="path">Path环境变量的作用和配置</h3> <p>Path环境变量是一个特殊的系统变量,它告诉操作系统在执行命令时应该去哪些目录查找可执行文件。Path环境变量的主要作用包括:</p> <ol> <div> <li class="flex flex-column gap-2 items-start"><span class="flex items-center"><span class="text-nord8">1.</span></span> <div class="min-w-0"> <div style="white-space;"> <p><strong>简化命令执行</strong>:将常用程序的路径添加到Path环境变量中,可以直接在命令行中输入命令名称,而不必输入完整路径。</p> </div> </div></li> </div> <div> <li class="flex flex-column gap-2 items-start"><span class="flex items-center"><span class="text-nord8">2.</span></span> <div class="min-w-0"> <div style="white-space;"> <p><strong>提高操作系统的可用性</strong>:Path环境变量使得操作系统更加用户友好,用户可以直接使用命令而不必担心找不到可执行文件的问题。</p> </div> </div></li> </div> </ol> <h3 id="">何时需要进行配置</h3> <p>通常情况下,我们需要配置系统变量和Path环境变量的场景包括:</p> <ol> <div> <li class="flex flex-column gap-2 items-start"><span class="flex items-center"><span class="text-nord8">1.</span></span> <div class="min-w-0"> <div style="white-space;"> <p><strong>安装开发工具或软件</strong>:当安装诸如JDK、Python、Maven等开发工具或软件时,需要配置相应的系统变量和Path环境变量,以便在开发过程中使用。</p> </div> </div></li> </div> <div> <li class="flex flex-column gap-2 items-start"><span class="flex items-center"><span class="text-nord8">2.</span></span> <div class="min-w-0"> <div style="white-space;"> <p><strong>需要在命令行中执行命令</strong>:如果需要在命令行中频繁执行某些命令,例如编译Java程序、运行Python脚本等,就需要将相应的可执行文件路径添加到Path环境变量中。</p> </div> </div></li> </div> <div> <li class="flex flex-column gap-2 items-start"><span class="flex items-center"><span class="text-nord8">3.</span></span> <div class="min-w-0"> <div style="white-space;"> <p><strong>多个项目共享同一配置</strong>:如果有多个项目需要共享同一配置(如相同版本的JDK、Python等),则可以通过配置系统变量来实现统一管理。</p> </div> </div></li> </div> </ol> <p>总的来说,系统变量和Path环境变量的配置能够极大地简化软件开发和使用过程,提高工作效率。在安装软件或工具、需要在命令行中执行命令、多个项目共享同一配置等情况下,我们都需要进行相应的配置。</p> </div> <div id="tippy-1" style="z-index;visibility;position;inset; margin: 0px;transform;"> <div class="tippy-box" style="max-width;transition-duration;"> <div class="tippy-content" style="transition-duration;"> <div class="w-6 bg-slate-200 rounded hover:bg-slate-300 cursor-grab"></div> </div> </div> </div> </div> </div> </div> </body> </html>

基础不牢 地动山摇 打卡第一天

各位大佬们好,我刚刚毕业,上岸了211电子信息,本科期间有计算机基础,自己学习了javase、mysql、springboot+vue的相关前后端开发等知识,目前的问题是从0到1开发一个系统很困难,但是由1拓展自己能做到,看得懂业务流程但是自己独立构建非常吃力,想趁着暑假学习一下,望各位大佬指点迷津。`(*>﹏<*)′

夯实基础 - DHCP 协议(二)

<html> <head></head> <body> <div class="content ql-editor"> <p>书接上回,我们继续说</p> <p><br></p> <p><a href="https://articles.zsxq.com/id_v3m5zjcs2bes.html" target="_blank">https://articles.zsxq.com/id_v3m5zjcs2bes.html</a></p> <p><br></p> <p>现在 DHCP 的组件你了解后,下面我就要和你聊聊 DHCP 的工作机制了。</p> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">DHCP 工作机制</strong></h2> <p><br></p> <p>在聊 DHCP 工作机制前,先来看一下 DHCP 的报文消息</p> <p><br></p> <h3><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">DHCP 报文</strong></h3> <p><br></p> <p>DHCP 报文共有一下几种:</p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><strong>DHCP DISCOVER</strong> :客户端开始 DHCP 过程发送的包,是 DHCP 协议的开始。</li> <li data-list="bullet"><span class="ql-ui"></span><strong>DHCP OFFER</strong> :服务器接收到 DHCPDISCOVER 之后做出的响应,它包括了给予客户端的 IP 租约过期时间、服务器的识别符以及其他信息。</li> <li data-list="bullet"><span class="ql-ui"></span><strong>DHCP REQUEST</strong> :客户端对于服务器发出的 DHCPOFFER 所做出的响应。在续约租期的时候同样会使用。</li> <li data-list="bullet"><span class="ql-ui"></span><strong>DHCP ACK</strong> :服务器在接收到客户端发来的 DHCPREQUEST 之后发出的成功确认的报文。在建立连接的时候,客户端在接收到这个报文之后才会确认分配给它的 IP 和其他信息可以被允许使用。</li> <li data-list="bullet"><span class="ql-ui"></span><strong>DHCP NAK</strong> :DHCPACK 的相反的报文,表示服务器拒绝了客户端的请求。</li> <li data-list="bullet"><span class="ql-ui"></span><strong>DHCP RELEASE</strong> :一般出现在客户端关机、下线等状况。这个报文将会使 DHCP 服务器释放发出此报文的客户端的 IP 地址。</li> <li data-list="bullet"><span class="ql-ui"></span><strong>DHCP INFORM</strong> :客户端发出的向服务器请求一些信息的报文。</li> <li data-list="bullet"><span class="ql-ui"></span><strong>DHCP DECLINE</strong> :当客户端发现服务器分配的 IP 地址无法使用(如 IP 地址冲突时),将发出此报文,通知服务器禁止使用该 IP 地址。</li> </ol> <p><br></p> <p>DHCP 的工作机制比较简单,无非就是客户端向服务器租借 IP ,服务器提供 IP 给客户端的这个过程呗。嗯,你很聪明,大致是这样的,不过有一些细节需要注意下,下面我通过两张图来和你聊一下。</p> <p><br></p> <p>关于从 DHCP 中获取 IP 地址的流程,主要分为两个阶段。</p> <p><br></p> <p>第一个阶段是 DHCP 查找包的阶段</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/s3jrqeiu.jpeg"></span></p> <p>查找包的阶段主要分为两步:第一步是 DHCP 发现包,第二步是 DHCP 提供包。</p> <p><br></p> <p>DHCP 客户端在通信链路上发起广播,看看链路上有没有能提供 DHCP 包的服务器,然后通信链路上的各个节点会检查自己是否能够提供 DHCP 包,这时 DHCP 服务器说它能够提供 DHCP 包,然后 DHCP 就发出一个 DHCP 包沿着通信链路返回给 DHCP 客户端。</p> <p><br></p> <p>第二个阶段是 DHCP 的请求阶段。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/qwyspxsv.jpeg"></span></p> <p><br></p> <p>DHCP 的请求包也分为两步:第一步是 DHCP 请求包,第二步是 DHCP 确认包。</p> <p><br></p> <p>DHCP 客户端在通信链路上发起 DHCP 请求包,请求包主要是告诉 DHCP 服务器,它想要用上一步提供的网络设置,然后 DHCP 服务器向 DHCP 客户端发送确认包,表示允许 DHCP 客户端使用第二步发送的网络设置。</p> <p><br></p> <p>至此,DHCP 的网络设置就结束了,然后通信链路上的主机之间就可以进行 TCP/IP 通信了。</p> <p><br></p> <p>当不需要 IP 地址时,可以发送 DHCP 解除包(DHCP RELEASE)进行解除。另外,DHCP 的设置中通常会有一个租期时间的设定,DHCP 客户端在这个时限内可以发送 DHCP 请求包通知想要延长这个期限。</p> <p><br></p> <h3><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">DHCP 状态机</strong></h3> <p><br></p> <p>我们上面知道 DHCP 会发送几种请求包,我们知道,动作肯定伴随着状态的更改,DHCP 也是一样的,在 DHCP 发送/接收各种包的时候,其状态也在发生相应的改变。DHCP 协议可以在客户端和服务器上运行状态机。状态决定了协议接下来要处理的消息类型。</p> <p><br></p> <p>状态之间的转换(箭头)是由于接收和发送消息或者计时器到期才发生的转换。下面是 DHCP 的状态轮转图。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/gy25j5lt.jpeg"></span></p> <p>客户端在开始时没有消息,此时处于 INIT 状态,然后客户端会在通信链路上发起一个广播 DHCP DISCOVER。</p> <p>在 Selecting 选择状态下,客户端会收集 DHCPOFFER 消息,直到确定要使用的地址和服务器为止。</p> <p><br></p> <p>一旦 DHCP 客户端做好选择后,它就会发送 DHCPREQUEST 消息并进入 Requesting 状态,在这个状态下它很可能收到并不需要的 ACK 响应,如果这个状态下没有找到合适的地址的话,那么客户端就会发送DHCPDECLINE 并恢复为 INIT 状态,但是这种发生的概率比较小。</p> <p><br></p> <p>在处于 Requesting 状态下的客户端很可能接受发送过来的 DHCPACK 消息,获取超时时间 T1 和 T2,然后进入 Bound 绑定状态,在这个状态下可以使用地址直到地址过期。</p> <p><br></p> <p>在第一个计时器 T1 到期时,客户端会进入 renewing 续订状态,并重新尝试建立租约时间,如果收到新的 ACK 消息就表示续订成功,然后就恢复为 Bound 状态。</p> <p><br></p> <p>如果没有收到 ACK 那么 T2 会最终过期进入 Rebinding 状态,进入这个状态的客户端会重新尝试获取地址,如果最终的租约到期,那么客户端必须放弃租约地址,并且如果没有其他地址或网络连接要使用,客户端将断开连接。</p> <p><br></p> <h3><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">DHCP 冲突</strong></h3> <p><br></p> <p>现在我们讨论一下 DHCP 冲突的问题,DHCP 冲突其实就是 IP 重了,当一个子网中两个或者更多主机配置了相同的 IP 地址时,就会发生 IP 冲突的现象。发生这种情况可能导致的后果是两个冲突的主机混在一起,一台主机可能接收了另一台主机的数据包。</p> <p><br></p> <p>那么造成这种情况的原因是啥呢?</p> <p><br></p> <p>造成这种情况的原因有很多,这里我列举两个可能出现的情况:</p> <ol> <li data-list="bullet"><span class="ql-ui"></span>第一种情况是一台主机配置了静态 IP 地址,这台主机联网后,其 IP 地址不会在 DHCP 服务器中,然后另外一个主机入网,DHCP 服务器给这台主机自动分配了相同的 IP 地址,这两个地址就产生了 IP 冲突。</li> <li data-list="bullet"><span class="ql-ui"></span>第二种情况是,客户端从 DHCP 服务器获得了 IP 地址,然后这台主机下线了,随着租约到期,DHCP 会将这个 IP 地址又分配给了其他主机,等到这个主机重新上线后,由于某种原因,计算机无法访问 DHCP 服务器,这种情况下会造成 IP 冲突。</li> </ol> <p>当检测到 IP 冲突时,通常 Windows 系统和 Mac 系统会弹出 IP 冲突的弹窗。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/hmmxnjnx.jpeg"></span></p> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">DHCP 中继代理</strong></h2> <p><br></p> <p>常规家庭网络(土豪除外)中大多数都只有一个以太网,也就是 LAN 网段,一个 DHCP 服务器完全可以满足 LAN 中的客户机使用。但是,在更复杂的网络中,比如企业或者学校,一台 DHCP 服务器显然就无法满足了。因此,这种情况下,往往需要 DHCP 的统一管理,具体实现方式可以通过 DHCP 中继代理 来转发 DHCP 流量,如下图所示。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/q38uf4uy.jpeg"></span></p> <p>如上图所示,存在两个网段 A 和网段 B,DHCP 客户机和 DHCP 服务器不在一个网段内,所以我们在通信链路上架设了一个中继代理,DHCP 客户机通过访问中继代理以达到访问 DHCP 服务器的目的。</p> <p><br></p> <p>使用这种方式,我们不再需要在每个网段都设置一个 DHCP 服务器,只需要在每个网段架设一个中继代理即可。它可以设置 DHCP 服务器的 IP 地址,从而可以在 DHCP 服务器上为每个网段注册 IP 地址的分配范围。</p> <p><br></p> <p>DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包之后再以单播的形式发送给 DHCP 服务器。服务器收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包发送给 DHCP 客户端。</p> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">DHCP 认证</strong></h2> <p><br></p> <p><strong>我们总是假想所有情况都能够顺利进行,害怕出问题,这也许意味着我永远只是个初级程序员吧</strong>。我们上面探讨的 DHCP 服务器都是合理的、合法的,但是互联网是一把双刃剑,不是所有人都是合法公民。如果假设了一个未经授权的 DHCP 服务器怎么办?它很可能会对网络造成影响。</p> <p><br></p> <p>为了避免这些问题,在 [RFC3118] 中指定了一种认证 DHCP 消息的方法。 它定义了一个 DHCP 选项,即Authentication 选项,如下所示</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/sz578dsw.jpeg"></span></p> <p>认证选项的主要目的就是<strong>确定 DHCP 消息是否来自一个授权的发送方</strong>。</p> <p><br></p> <p>身份验证的代码(code)属性值是 90,而长度(Length)给出了选项中的字节数(不包括代码和长度字段的字节)。如果协议(Protocol)和算法(Algorithm)属性被设置为 0 ,则认证信息字段将保存一个简单的共享配置的 token,token 大家开发应该都接触过把,就是一条认证信息。只要配置令牌在客户端和服务器上匹配,这条消息就会被接受。</p> <p><br></p> <p>我们上面聊到的只是其中的一种,还有一种更安全的方法是涉及所谓的延迟身份认证,如果协议和算法都被设置为 1,就表示使用了延迟身份认证。在这种情况下,客户端的 DHCPDISCOVER 消息或 DHCPINFORM 消息包括身份验证选项,并且服务器以其 DHCPOFFER 或 DHCPACK 消息中包含的身份验证信息进行响应。这个认证信息中包括一个消息认证码,它提供对发送方的认证和消息的完整性校验。RDM 表示中继检测,中继检测包括一个单项递增的值,只要经过一个代理中继,那么这个中继检测的值就会 + 1。</p> <p><br></p> <p>虽然 DHCP 认证能够确保安全性,但是它没有被广泛使用,原因有两点:</p> <ol> <li data-list="bullet"><span class="ql-ui"></span>首先,该方法要求在 DHCP 服务器和每个需要身份验证的客户端之间分配共享密钥。</li> <li data-list="bullet"><span class="ql-ui"></span>其次,在 DHCP 已经被广泛使用之后,才指定了 Authentication 选项。</li> </ol> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">总结</strong></h2> <p><br></p> <p>这篇文章我和你探讨了计算机网络中一个比较容易忽视的概念,为什么说他容易忽视呢?因为我们平常开发过程中基本上不会管 IP 地址的配置的,也就是环境搭建的时候会用到一些,但是要系统学习计算机网络的话,DHCP 的重要性不可忽视,DHCP 包括工作机制、DHCP 报文消息,DHCP 状态机、DHCP 认证这些都是需要你了解并掌握的。</p> </div> </body> </html>

夯实基础 - DHCP 协议(一)

<html> <head></head> <body> <div class="content ql-editor"> <p>假如你现在站在地铁上或者坐在办公室中,你的手机也好,电脑也好都有一个 IP 地址,<strong>这个 IP 地址是你动输入的</strong>,你需要写下面这些东西 ......</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/rcbj2sz0.jpeg"></span></p> <p>电脑配置这些还好,直接咔咔咔的配置完了,如果你用的是手机,那么你需要点到 IP 地址,输入 IP 地址,点到子网掩码,输入子网掩码,点到默认路由,输入路由,点到 DNS 服务器,输入 DNS 服务器 ...... 这玩意这么麻烦啊,恰好你刚配置完,领导叫你开会,得嘞,刚配置好的地址白瞎了。换了一个环境,需要重新配置 IP 地址,于是你把上面的步骤再重复了一遍,这时候散会了,然后你炸了。。。。。。</p> <p><br></p> <p>我们还省去了你有可能配置错误的时候。</p> <p><br></p> <p>上面这段描述最让人恼火的就是你需要手动配置 IP 地址,woc,为啥不能设置成自动配置 IP 地址呢?谁说不能的,能!那就是用 DHCP, 这也是我们下面要聊的内容。</p> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">认识 DHCP</strong></h2> <p><br></p> <p>DHCP 的全称是 Dynamic Host Configuration Protocol 动态主机配置协议。使用 DHCP 就能实现自动设置 IP 地址、统一管理 IP 地址分配。也就是不管你是在开会还是在工位干活,都省去了手动配置 IP 地址这一步繁琐的操作,同时 DHCP 也大大减少了可能由于你手动分配 IP 地址导致错误的几率。</p> <p><br></p> <p>DHCP 与 IP 密切相关,它是 IP 网络上所使用的协议。如果你想要使用 DHCP 提供服务的话,那么在整条通信链路上就需要 DHCP 服务器的存在,连接到网络的设备使用 DHCP 协议从 DHCP 服务器请求 IP 地址。DHCP 服务器会为设备分配一个唯一的 IP 地址。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/svo9fe4r.jpeg"></span></p> <p>除了 IP 地址外,DHCP 服务器还会把子网掩码,默认路由,DNS 服务器告诉你。</p> <p><br></p> <h3><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">DHCP 服务器</strong></h3> <p><br></p> <p>现在,你不需要手动配置 IP 地址,也不再需要管理 IP 地址了,管理权已经移交给了 DHCP 服务器,DHCP 服务器会维护 IP 地址池,在网络上启动时会将地址租借给启用 DHCP 的客户端。</p> <p><br></p> <p>由于 IP 地址是<strong>动态的(临时分配)</strong>而不是<strong>静态的(永久分配)</strong>,因此不再使用的 IP 地址会自动返回 IP 地址池中进行重新分配。</p> <p><br></p> <p>那么 DHCP 服务器由谁维护呢?</p> <p><br></p> <p>网络管理员负责建立 DHCP 服务器,并以租约的形式向启用 DHCP 的客户端提供地址配置,啊,既然不需要我管理,那就很舒服了~</p> <p><br></p> <p>好了,现在你能舒舒服服的开发了,你用 postman 配了一条 192.168.1.4/x/x 的接口进行请求,请求能够顺利进行,但是过了一段时间后,你发现 192.168.1.4/x/x 这个接口请求不通了,这是为啥呢?然后你用 ipconfig 查询了一下自己的 IP 地址,发现 IP 地址变成了 192.168.1.7,怎么我用着用着 IP 地址还改了?DHCP 是个垃圾,破玩意!!@#¥%¥%……¥%</p> <p><br></p> <p>其实,这也是一个 DHCP 服务器的一个功能,DHCP 服务器通常为每个客户端分配一个<strong>唯一的动态 IP 地址</strong>,当该 IP 地址的<strong>客户端租约到期</strong>时,该地址就会更改。</p> <p><br></p> <p>唯一意思说的就是,如果你手动设置了一个静态 IP,同时 DHCP 服务器分配了一个动态 IP,这个动态 IP 和静态 IP 一样,那么必然会有一个客户端无法上网。</p> <p><br></p> <p>我就遇到过这种情况,我使用虚拟机配置的静态 IP 是192.168.1.8,手机使用 DHCP 也同样配置了 192.168.1.8 的 IP 地址,此时我的虚拟机还没有接入网络,当我接入网络时,我怎样也连不上虚拟机了,一查才发现 IP 地址冲突了 ......</p> <p>虽然 DHCP 服务器能提供 IP 地址,但是他怎么知道哪些 IP 地址空闲,哪些 IP 地址正在使用呢?</p> <p><br></p> <p>实际上,这些信息都配置在了数据库中,下面我们就来一起看一下 DHCP 服务器维护了哪些信息。</p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>网络上所有有效的 TCP/IP 配置参数</li> </ol> <p>这些参数主要包括<strong>主机名(Host name)、DHCP 客户端(DHCP client)、域名(Domain name)、IP 地址IP address)、网关(Netmask)、广播地址(Broadcast address)、默认路由(default rooter)</strong>。</p> <ol> <li data-list="bullet"><span class="ql-ui"></span>有效的 IP 地址和排除的 IP 地址,保存在 IP 地址池中等待分配给客户端</li> <li data-list="bullet"><span class="ql-ui"></span>为某些特定的 DHCP 客户端保留的地址,这些地址是静态 IP,这样可以将单个 IP 地址一致地分配给单个DHCP 客户端</li> </ol> <p><br></p> <p>好了,现在你知道 DHCP 服务器都需要保存哪些信息了,并且看过上面的内容,你应该知道一个 DHCP 的组件有哪些了,下面我们就来聊一聊 DHCP 中都有哪些组件,这些组件缺一不可。</p> <p><br></p> <h3><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">DHCP 的组件</strong></h3> <p><br></p> <p>使用 DHCP 时,了解所有的组件很重要,下面我为你列出了一些 DHCP 的组件和它们的作用都是什么。</p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>DHCP Server,DHCP 服务器,这个大家肯定都知道,因为我们上面就一直在探讨 DHCP 服务器的内容,使用 DHCP ,是一定要有 DHCP 服务器的,要不然谁给你提供服务呢?</li> <li data-list="bullet"><span class="ql-ui"></span>DHCP Client,DHCP 客户端,这个大家应该也知道,毕竟只有一个服务端不行啊,没有客户端你为谁服务啊?DHCP 的客户端可以是<strong>计算机、移动设备或者其他需要连接到网络的任何设备,默认情况下,大多数配置为接收 DHCP 信息</strong>。</li> <li data-list="bullet"><span class="ql-ui"></span>Ip address pool: 你得有 IP 地址池啊,虽然说你 DHCP 提供服务,但是你也得有工具啊,没有工具玩儿啥?IP 地址池是 DHCP 客户端可用的地址范围,这个地址范围通常由最低 -&gt; 最高顺序发送。</li> <li data-list="bullet"><span class="ql-ui"></span>Subnet:这个组件是子网,IP 网络可以划分一段一段的子网,子网更有助于网络管理。</li> <li data-list="bullet"><span class="ql-ui"></span>Lease:租期,这个表示的就是 IP 地址续约的期限,同时也代表了客户端保留 IP 地址信息的时间长度,一般租约到期时,客户端必须续约。</li> <li data-list="bullet"><span class="ql-ui"></span>DHCP relay:DHCP 中继器,这个一般比较难想到,DHCP 中继器一般是路由器或者主机。DHCP 中继器通常应对 DHCP 服务器和 DHCP 客户端不再同一个网断的情况,如果 DHCP 服务器和 DHCP 客户端在同一个网段下,那么客户端可以正确的获得动态分配的 IP 地址;如果不在的话,就需要使用 DHCP 中继器进行中继代理。</li> </ol> <p><br></p> </div> </body> </html>

夯实基础 - 一文讲透 ARP 协议(二)

<html> <head></head> <body> <div class="content ql-editor"> <p>上一篇文章 <a href="https://articles.zsxq.com/id_tkppvwtk00ja.html" target="_blank">https://articles.zsxq.com/id_tkppvwtk00ja.html</a></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);"><br></strong></h2> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">ARP 结构</strong></h2> <p><br></p> <p>我们上面说到,ARP 对想要知道 MAC 地址的目标主机会首先发送 ARP 请求,那么这个请求中都携带哪些信息呢?下面 cxuan 就来和你聊一下。下面是在以太网中转换一个 IPv4 的地址常用的 ARP 请求或响应的报文格式。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/0kl87sxo.jpeg"></span></p> <p>前面 14 个字节构成标准以太网的首部,前两个字段 DST 和 SRC 分别表示 以太网的目的地址 和 以太网的源地址,以太网的目的地址如果是 ff:ff:ff:ff:ff:ff 全部为 1 表示广播地址,在同一广播域中的所有以太网接口可以接收这些帧。后面紧跟着的是 ARP 请求的长度/类型,ARP 请求 和 ARP 应答这个值为 0x0806。</p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>硬件类型表示硬件地址的类型,硬件地址常见的有 MAC 物理或者以太网地址,对于以太网来说,此值为 1。</li> <li data-list="bullet"><span class="ql-ui"></span>协议类型 指出映射的协议地址类型,对于 IPv4 地址,这个值是 0x0800。</li> <li data-list="bullet"><span class="ql-ui"></span>硬件大小和 协议大小 分别指出硬件地址和协议地址的字节数。对于以太网中使用 IPv4 的 ARP 请求或应答,它们的值分别是 6 和 4。</li> <li data-list="bullet"><span class="ql-ui"></span>Op 字段指出如果是 ARP 请求,Op = 1,ARP 应答 ,Op = 2,RARP 请求 Op = 3,RARP 应答,Op = 4。</li> <li data-list="bullet"><span class="ql-ui"></span>紧跟在 Op 之后的是 发送方硬件地址(MAC 地址),发送方的协议地址(IPv4 地址),目的硬件地址 和 目的协议地址。</li> </ol> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">ARP 抓包实战</strong></h2> <p><br></p> <p>我们分别演示在 Mac 和 Linux 下的 ARP 报文的截获</p> <p><br></p> <p>在 Mac 环境下,我这边使用的是 WireShark 进行抓包,你可以从官网下载,地址如下</p> <p><a href="https://links.jianshu.com/go?to=https%3A%2F%2Fwww.wireshark.org%2Fdownload.html" target="_blank" style="color: rgb(66, 185, 131);">https://www.wireshark.org/download.html</a></p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/aah9xa1p.jpeg"></span></p> <p>下载完成后阅读安装说明的手册,阅读后会发现需要安装两个插件,根据提示安装即可,然后我们打开 WireShark ,开始报文拦截,下面是我截获的 ARP 数据包。</p> <p><br></p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/pbmpfbpr.jpeg"></span></p> <p>这款软件很好的一个地方是对不同的数据包会有不同的颜色标识,这点非常好。</p> <p><br></p> <p>然后我们查看 ARP 请求</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/i75dn1e6.jpeg"></span></p> <p>可以看到,这就是一个完整的 ARP 请求包,我们使用的硬件类型是以太网,协议类型是 IPv4 ,默认值是 0x0800,然后硬件大小是 6 个字节,协议大小占用 2 个字节,Op 的全称是 Opcode ,Op = 1 表示这是一个 ARP 请求,然后是发送方的硬件地址和协议地址,接收方的硬件地址和协议地址。</p> <p><br></p> <p>ARP 响应如下</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/mirk6r3o.jpeg"></span></p> <p>可以看到 Op = 2,表示这是 ARP 响应。</p> <p><br></p> <p>在 Linux 环境下,你可以使用 tcpdump 截获 ARP 数据包,如果 tcpdump not found 的话,你可以使用 yum install -y tcpdump 安装。</p> <p><br></p> <p>使用 tcpdump -i ens33 可以打印出在 ens33 地址下的数据包,下面是我截取的 ARP 数据包。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/6pbungk5.jpeg"></span></p> <p>更多关于 tcpdump 的用法,你可以参考这篇博客</p> <p><a href="https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html" target="_blank" style="color: rgb(66, 185, 131);">https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html</a></p> <p>大佬写的很详细,这里就不再说明了。</p> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">ARP 缓存超时</strong></h2> <p><br></p> <p>缓存超时通常与 ARP 缓存中的项有关系,arp 命令可以允许管理员设置永不超时。ARP 把保存在高速缓存中的每一映射地址都设置生存时间,一般为 20 分钟。如果是不完整的映射,那么缓存超时时间为 3 分钟,不完整的映射通常会强制发送一条不存在主机的 ARP 请求。</p> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">RARP</strong></h2> <p><br></p> <p>与 ARP 相对的,<strong>RARP(Reverse Address Resolution Protocol)</strong> 是将 ARP 反过来,从 MAC 地址定位 IP 地址的一种协议,将打印机服务器等小型嵌入式设备接入网络时会使用到。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/y4q8n36z.jpeg"></span></p> <p>平常我们设置 IP 地址一般会有两种方式,手动设置 和 DHCP 动态获取</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/85oncc67.jpeg"></span></p> <p>但是对于嵌入式设备来说,它没有任何输入接口,也无法通过 DHCP 获取动态地址。</p> <p><br></p> <p>在这种情况下,就要使用到 RARP 了,你需要准备一个 RARP 服务器,在这个服务器上注册设备的 MAC 地址和 IP 地址,然后将设备接入网络,设备会发出一条 IP 和 MAC 地址的查询请求给服务器,服务器会告诉设备其 IP 地址和 MAC 地址。</p> <p><span class="ql-font-monospace"><img src="https://pic.code-nav.cn/planet_post_image/1796381395438190593/tf3zygig.jpeg"></span></p> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">ARP 攻击</strong></h2> <p><br></p> <p><strong>ARP 是一种非常不安全的协议</strong>,目前已经有很多涉及 ARP 的攻击,最主要的就是使用代理 ARP 功能假扮主机,对 ARP 请求作出应答,通过伪造 ARP 数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害。</p> <p><br></p> <h3><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">ARP 攻击分类</strong></h3> <p><br></p> <p>ARP 主要攻击方式分为下面这几种</p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>ARP 泛洪攻击:通过向网关发送大量 ARP 报文,导致网关无法正常响应。首先发送大量的 ARP 请求报文,然后又发送大量虚假的 ARP 响应报文,从而造成网关部分的 CPU 利用率上升难以响应正常服务请求,而且网关还会被错误的 ARP 缓存表充满导致无法更新维护正常 ARP 缓存表,消耗网络带宽资源。</li> <li data-list="bullet"><span class="ql-ui"></span>ARP 欺骗主机攻击:ARP 欺骗主机的攻击也是 ARP 众多攻击类型中很常见的一种。攻击者通过 ARP 欺骗使得局域网内被攻击主机发送给网关的流量信息实际上都发送给攻击者。主机刷新自己的 ARP 使得在自己的ARP 缓存表中对应的 MAC 为攻击者的 MAC,这样一来其他用户要通过网关发送出去的数据流就会发往主机这里,这样就会造成用户的数据外泄。</li> <li data-list="bullet"><span class="ql-ui"></span>欺骗网关的攻击: 欺骗网关就是把别的主机发送给网关的数据通过欺骗网关的形式使得这些数据通过网关发送给攻击者。这种攻击目标选择的不是个人主机而是局域网的网关,这样就会攻击者源源不断的获取局域网内其他用户韵数据.造成数据的泄露,同时用户电脑中病毒的概率也会提升。</li> <li data-list="bullet"><span class="ql-ui"></span>中间人攻击: 中间人攻击是同时欺骗局域网内的主机和网关,局域网中用户的数据和网关的数据会发给同一个攻击者,这样,用户与网关的数据就会泄露。</li> <li data-list="bullet"><span class="ql-ui"></span>IP地址冲突攻击: 通过对局域网中的物理主机进行扫描,扫描出局域网中的物理主机的 MAC 地址,然后根据物理主机的 MAC 进行攻击,导致局域网内的主机产生 IP 地址冲突,影响用户的网络正常使用。</li> </ol> <p><br></p> <h2><strong style="background-color: rgb(255, 255, 255); color: rgb(52, 73, 94);">总结</strong></h2> <p><br></p> <p>ARP 是 TCP/IP 实现中的一个基本协议,它通常在应用程序或用户没有察觉到的情况下运行。ARP 可以用于映射 IP 地址为 MAC 地址。</p> <p>这篇文章我们主要讲了 ARP 的基本原理,ARP 的帧结构,ARP 的工作机制,以及 ARP 代理、ARP 攻击、RARP 和 ARP 的区别等。</p> </div> </body> </html>

下载 APP