编程导航计算机网络话题讨论

计算机网络

42 参与
分享

快来分享你的内容吧~

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

05 Java后端面试八股合集 - 涵盖计网、JVM、Spring及RabbitMQ

# 00 引言 ## 写在最前面的话 本文是本人秋招时自用的八股准备文档,相较于八股网站繁多的内容,做了内容的压缩与高频考点的提炼,亲测覆盖面试 90% 以上的相关八股问题,分享出来以供大家参考。 另外本人已写 **Java后端完整版学习路线**(仔细讲解每个技术栈怎么学,学到什么程度可以投实习/面试)+ **各大厂真实面试问题和参考答案** + **Redis核心考点/面试真题深度梳理** + **MySQL高频考点深度梳理**(覆盖MySQL实习/校招面试95%以上的问题) 4篇高质量长文,如有需要欢迎大佬们自取(如果可以的话顺手点个赞👍),后续还会更新更多八股梳理、有趣的原创项目或实用的工具分享等内容,欢迎关注。 ### **其他优质内容导航:** **面试八股相关:** [01 非科班转码拿下大厂Offer,花费一天整理的Java后端完整版学习路线](https://www.codefather.cn/post/2005544965425446914) [02 盘点2025遇到的各大厂面试真题总结](https://www.codefather.cn/post/2005573237194469377) [03 一文吃透 Redis 核心考点,面试真题深度梳理](https://www.codefather.cn/post/2006203053207732225) [04 MySQL面试八股看这一篇就够了——深度梳理MySQL面试问题](https://www.codefather.cn/post/2008053544355131393) **工具分享**: [超实用的AI工具合集分享,赶快收藏起来吧 ](https://www.codefather.cn/post/2008402573266022402) **原创项目**: [01 基于用户画像和多模态需求驱动的多智能体推荐系统 - 技术文档](https://www.codefather.cn/post/2010000937266987009) (项目暂未开源,后续会开源,小伙伴可以关注一下) [02 ContentGuard Pro - 一套针对文本内容安全检测和风控的解决方案](https://www.codefather.cn/post/2010604558601961474) [Github链接](https://github.com/Mrchen-1600/Content-Guard-Pro) 03 TouchFish | 摸鱼神器(离线版)(最近即将推出,小伙伴们可以关注一下) 大致功能描述:是一款基于 Python 开发的高性能桌面隐私保护应用。它利用计算机视觉(CV)和离线语音识别(ASR)技术,实时监控用户周围环境。当检测到陌生人出现在摄像头内、用户离开品目前或触发特定语音关键词时,系统将毫秒级响应,执行静音、隐藏窗口并自动全屏打开用户提前设置的伪装工作软件/文件,为用户的“摸鱼”时光提供全方位保护。 ### 本文内容概述 **Notebook LM总结:** > 这份参考资料是一份详尽的计算机技术面试八股文合集,核心涵盖了计算机网络、JVM、Spring框架以及RabbitMQ四大技术模块。在网络层面,它详细拆解了从输入URL到页面展示的完整流程,并深入剖析了TCP可靠传输机制与HTTP/HTTPS的区别。针对Java虚拟机,文中深入探讨了内存区域划分、垃圾回收算法及对象创建过程,并提供了实用的JVM调优建议。框架部分重点解释了Spring IOC与AOP的核心原理,以及声明式事务在并发场景下的应用。最后,针对消息中间件,资料归纳了RabbitMQ如何处理消息丢失、重复消费及分布式事务一致性等实战难题。 # 计算机网络部分 01 从输入URL到页面展示到底发生了什么? ---------------------- 第一步是**用户输入URL**,并按下回车。此时,浏览器开始**解析URL**,将其分解为**协议**(例如HTTP或HTTPS)、**域名**、**路径**(例如/home)等部分。 第二步是进行**DNS解析**。浏览器通过DNS解析域名,**查找对应的IP地址**。若该域名的IP地址**已被缓存**,浏览器会**直接使用缓存的IP地址**;若**未缓存**,则浏览器会向DNS服务器**发送请求,获取IP地址**。 第三步是通过三次握手**建立TCP连接**。获取到IP地址后,浏览器通过**TCP/IP协议**与目标服务器**建立连接**。在HTTPS请求中,浏览器还会通过**SSL协议进行加密**,确保通信的安全性。 第四步是**客户端发送HTTP请求**。TCP连接建立后,浏览器会发送HTTP请求到服务器。请求包括**请求行、请求头和请求体**。**请求行包含请求方法(如GET、POST)、请求的路径和HTTP版本**。请求头包括目标域名、浏览器身份标识、可以处理的内容类型等信息。**请求体则用于发送数据(如POST表单提交数据)**。 第五步是**服务器处理请求**。服务器接收到请求后,首先会解析请求头并**根据请求的URL路径**选择合适的处理方式。 第六步是**服务器发送HTTP响应**。服务器处理完请求后,构造HTTP响应并返回给浏览器。**响应包含响应行、响应头和响应体**。**响应行指示处理结果(如200 OK、404 NotFound)**,响应头包含响应体的数据类型、响应体的长度等信息,**响应体则是实际的页面内容(HTML、CSS、JavaScript、图片等)**。 第七步是**浏览器解析和渲染页面**。浏览器接收到响应后,开始解析响应体中的HTML内容。 第八步是通过四次挥手**关闭TCP连接**。 02 TCP的粘包和拆包? ------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/pCYodELIICOqH9Ky.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/osnCBERJKRi6esBU.webp) 03 常见的HTTP状态码? -------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/LB09jvOnZeTDYsXX.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/B3LqJrMOA8fggsdI.webp) 04 TCP和UDP的区别? -------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/meJ0dwU6ObTXfRyB.webp) 05 GET和POST的区别 -------------- GET和POST的5点主要区别: 第一个是数据传输方式的区别:GET请求**通过URL传递数据**,数据被附加在URL后面,以键值对的形式传输。而POST请求将数据**放在请求体中传递**,数据不会显示在URL中。 第二个是数据大小限制的区别:GET**请求的数据大小有限制**,通常为2至8KB。而POST请求的数据没有固定限制,**可以传输大量数据**,理论上只有Web服务器的配置限制。 第三个是安全性的区别:GET请求的数据通过URL传递,**数据泄露**给第三方,安全性较差。而POST请求的数据**保存在请求体中**,不会显示在URL中,**相对更安全**一些。 第四个是使用场景的区别:GET请求**通常用于获取资源或数据,适用于查询操作**。而POST请求通常用于**提交数据或进行数据更改**操作,适用于表单提交、用户注册、登录、文件上传等场景。 第五个是**幂等性**和缓存的区别:GET请求是幂等的,即同样的请求多次发送,服务器的响应不会发生变化,且可以被**缓存**。而POST请求是非幂等的,每次请求都会产生变化,因此不能缓存。 06 TCP超时重传机制为了解决什么问题? --------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/ExKduv8fDLZDkkmA.webp) 07 HTTP1.0、2.0和3.0的区别 --------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/TN38emSO7LwXvQco.webp) 08 服务器如何解析HTTP请求的数据 ------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/npRsrXkw0L8zuZDz.webp) 09 三次握手和四次挥手? ------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/2xCB6Z8TmJgkE2dQ.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/uWF80TO7PTlZO3Wf.webp) 10 为什么要等2MSL?为什么是等待2MSL? ------------------------ (1)确保客户端最后的ACK能够被成功接收。因为如果这个ACK丟失了,服务器没有收到确认包,会重新发送FIN报文,而MSL是TCP报文在网络中可以存活的最大时间,服务器重发FIN,客户端收到之后重发ACK,这一来一回就需要2MSL的时间。 (2)防止旧的报文干扰新的连接。TCP连接关闭之后,可能会有一些延迟的或者已经失效的报文还在网络中传输,如果我们立即用相同的IP地址和端口建立新的连接,可能会受到这些旧的报文的干扰。 11 TCP实现可靠传输的原理 --------------- 首先是**连接管理机制**,TCP通过**三次握手建立连接**,确保双方通信正常,并用**四次挥手终止连接**,防止数据残留或资源浪费。 第二个是数据分块与序号标识机制,发送端将**数据分割为合适大小的报文段**,每个段分配**唯一序号**,**标识数据的顺序**;接收端**通过序号重组乱序到达的段**,确保数据完整性。 第三个是**确认应答与超时重传机制**,接收端对每个接收到的段返回确认应答,发送端如果超时未收到ACK就会触发超时重传,解决数据丢失问题。 第四个是**流量控制**机制,接收端**通过窗口大小告知发送端可接收的数据量**,**避免缓冲区溢出**。滑动窗口机制允许连续发送多个段,提升传输效率。 第五个是**拥塞控制**机制,能够根据网络负载情况**动态调整发送速率**,防止网络瘫痪。 12 HTTP怎么实现流量控制(滑动窗口算法) ----------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/ziNUt9vkTcw7PW5J.webp) ## 13 TCP每次连接时序列号都一样吗?为什么不一样,有什么作用? ![](https://pic.code-nav.cn/post_picture/1734931576698986498/hudQe8PQ1V4ahl0M.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/HslMLHido6eHVqJW.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/5aj5cM7x4RgGMDme.webp) 14 HTTPS协议和HTTP协议的区别? --------------------- (1)数据传输安全性: http:明文传输,容易被窃听、篡改 https:通过SSL/TSL协议对数据进行加密传输,提供数据机密性和完整性保障。 (2)端口号: http:默认端口号80 https:默认端口号443 (3)性能: http:无加密过程,连接建立速度稍快。 https:基于http上又加了SSL或TSL协议来实现的加密传输,加解密过程增加了计算开销,握手时间较长。 ![](https://pic.code-nav.cn/post_picture/1734931576698986498/xOMUGyCHCGhpm1rC.webp) 15 DDOS攻击 --------- DDOS攻击(Distributed Denial of Service,**分布式拒绝服务攻击**)是一种通过大量恶意流量淹没目标服务器、网络或服务,使其无法正常响应合法用户请求的网络攻击方式。 **基本原理** **拒绝服务(DoS)**:攻击者通过耗尽目标的带宽、计算资源(如CPU、内存)或应用处理能力,导致服务瘫痪。 **分布式(Distributed)**:攻击流量来自全球大量被控制的设备(如僵尸网络中的电脑、IoT设备等),而非单一来源,难以追踪和防御。 **常见攻击类型** **流量洪泛** 例如:UDP洪水,通过垃圾流量塞满目标带宽。 **协议攻击** 例如:SYN洪水(耗尽TCP连接资源)、DNS放大攻击(利用DNS协议缺陷放大流量)。 **应用层攻击** 例如:HTTP洪水(模拟大量合法请求耗尽服务器资源),更隐蔽且难以识别。 **防御措施** **流量清洗**:通过云安全服务(如Cloudflare、阿里云高防IP)过滤恶意流量。 **黑名单/IP限速**:识别并拦截异常IP。 **冗余架构**:分布式服务器分散流量压力。 # JVM部分 01 GC 怎么知道哪些是垃圾?(垃圾搜索的算法) ------------------------- 垃圾回收需要知道哪些对象是垃圾(垃圾的搜集算法),主要是两种方式: (1)**引用计数法:**每个对象都有一个**引用计数器**,每当有一个引用指向他,计数器就加1,所以GC只要去看对象的计数器是不是0就行,是0的就可以直接回收,但是这个方法最大的问题就是,如果**两个对象相互引用**,那就永远不能被回收,所以就需要方法2 (2)**可达性分析算法** 从**GC Roots**出发,看看哪些对象是可达的,可达的即存在引用,不可达的就可以直接回收(GC Roots可以是栈中引用的对象,类静态属性引用的对象,常量引用的对象以及本地方法引用的对象) 02 GC Roots包含哪些对象 ----------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/pLO04pQRrcUFNz2g.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/cSFMxY6ffjFb6ALS.webp) 标记出垃圾之后就是进行回收了,下面是回收的算法: 03 GC垃圾回收算法 ----------- **1.标记清除算法** 当垃圾回收器进行内存扫描后会标记出所有的垃圾,然后**直接清除这些带标记**的垃圾对象即可,但是因为垃圾在内存上是分散的,这样清理就会**产生大量的内存碎片**,使得内存利用率越来越低; **2.复制算法** **准备两块一模一样的内存空间**,当第一块剩余空间不足时,可以将**所有需要保留的对象拷贝**至另一块空内存,然后将**前一块内存全部清空**,这样即做到了垃圾回收,又做到了碎片整理,但是这样**内存空间就会有一半被浪费**。 **3.标记整理法** 标记整理算法就是在清理垃圾的基础上,多了一步碎片整理的工作,因为整理是比较耗时的,所以显然这种垃圾回收机制不适合高频率的执行。 知道了常见的垃圾回收算法,再介绍下常见的垃圾回收器: 04 JVM常见的垃圾回收器 -------------- 最早期的就是**Serial和SerialOld**,但是这种垃圾回收器是**单线程的**,不支持并发,**开始垃圾回收后所有用户线程都必须暂停**。 后面是**parallel**的垃圾回收器,垃圾回收可以**多线程执行**,但是当开始垃圾回收的时候依然会**触发所有用户线程暂停**。 再之后就是**CMS**,CMS虽然在**初始标记的时候也会触发用户线程暂停**,但是因为CMS**初始标记只会标记第一层的根对象**,所以时间很短,**真正的标记阶段,打标记是和用户线程并行的**;为了避免并行过程中可能的错标,还有第三个**重新标记的阶段**,**这个阶段也会让用户线程暂停,然后通过多线程的方式去检查并且修正错误标记。**但是这个算法也有问题,就是**清理垃圾的时候用户线程也在运行,因此新产生的垃圾没办法及时清理**,需要等下一次回收。 再就是**G1回收器**,G1回收器会**把整个堆内存划分成若干相等大小的区域**,然后**对这些区域进行价值排序**,垃圾越多,回收需要的时间也越多,但是G1回收器可以**根据我们设定的用户线程暂停时间来调整策略**,会尽量**满足我们设定的时间去回收价值高的区域**。另外**G1还把大对象单独存放在了一个区域**,避免了整理时候**频繁移动大对象**。 补充一个新生代和老年代的知识: 05 新生代和老年代? ----------- 区分新生代和老年代主要是为了提高垃圾回收效率,大多数的对象存活时间短,很快就会变成垃圾不再使用,这些短生命周期的对象就会分配在新生代;少部分对象长期存活,不会很快被回收,就晋升到老年代。 针对不同的分区的垃圾回收算法也不一样,**新生代通常采用复制算法**,**老年代**通常采用**标记整理算法或标记清除算法**。 06 什么是FullGC?什么情况下触发?怎么解决? -------------------------- Full GC(完全垃圾回收)是指对整个JVM**堆(包括新生代、老年代)**以及**方法区(元空间)**进行的全面垃圾回收。Full GC会暂停所有应用线程(Stop-The-World),通常耗时更长。 **触发的场景**: 1. 老年代空间不足,且通过old GC仍然不足 2. 元空间或者永久代内存不足 3. 使用了System.gc()命令 4. 新生代对象要晋升到老年代,但是老年代空间不够 **频繁full GC的问题**: 长时间的Stop-The-World暂停会导致应用响应变慢,大量的CPU时间用于GC而非业务处理,也会导致业务吞吐量下降,可能会导致OOM或者服务超时 **解决**: 增加堆大小、调整新生代与老年代的比例、选择合适的垃圾回收器(比如G1替代CMS)、代码优化(及时释放不再使用的对象,减少大对象的频繁创建) 07 JVM的内存区域? ------------ 首先是**线程共享**的部分,一共有两个: 一个是**堆(Heap)**,所有**对象实例和数组**都在这里分配内存,垃圾回收器(**GC**)也主要在堆中工作。堆中还包含了**字符串常量池**(String Constant Pool)。 另一个是**元空间(Method Area)**:用于**存储类信息、常量、静态变量、方法字节码**等。其中运行时常量池(Runtime Constant Pool)是元空间的一部分,用于存储编译期生成的各种字面量和符号引用。 ### 字符串常量池的作用? **为什么需要字符串常量池?** String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); 如果没有常量池:s1会创建一个新的String对象。s2会再创建一个内容完全相同的新String对象。s3通过new关键字,毫无疑问也会创建一个新对象。这样,内存中就会有三个内容完全相同的"Hello"对象,这是极大的浪费。 字符串常量池就是为了解决这个问题而生的。**工作原理(核心机制):**当在代码中直接使用字符串字面量(用双引号包裹)时,例如String s = "Hello";,JVM会首先去字符串常量池中查找是否已经存在一个内容为"Hello"的字符串对象。 **如果存在**:JVM不会创建新的对象,而是直接返回池中已有对象的引用。这样,所有相同的字面量都指向同一个内存地址。 **如果不存在**:JVM会在字符串常量池中创建一个新的String对象,内容为"Hello",然后返回这个新对象的引用。 new String()**的创建**:当使用new关键字(如String s = new String("Hello");)时,JVM的行为会有所不同:new关键字会**强制**在Java堆的**非常量池区域**创建一个全新的、独立的String对象。这个新对象的内容会初始化为"Hello",但它和常量池中的那个"Hello"是两个不同的对象。 ![](https://pic.code-nav.cn/post_picture/1734931576698986498/lkFjjQ5ioMyI7U3c.webp) 然后是**线程私有**的部分,一共有三个, 第一个是**虚拟机栈**(VM Stack),**每个线程启动时都会创建一个虚拟机栈**,它存储方法调用过程中产生的栈帧,包括**局部变量、方法返回地址**等,**每个方法调用都会创建一个新的栈帧**,方法执行结束后栈帧出栈。 第二个是**本地方法栈**(Native Method Stack),专门用于存储**本地方法**(Native Method)的调用信息,与虚拟机栈类似,但用于JNI(Java Native Interface)调用。 第三个是**程序计数器**(Program Counter Register),**记录当前线程正在执行的字节码指令地址**。它是JVM运行时最小的内存区域,每个线程都有一个独立的程序计数器。 在JDK1.8时 JVM的内存结构主要有两点不同: 一个是方法区(Method Area)在JDK 1.8被替换为元空间(Metaspace)实现,且元空间使用本地内存(原因:元空间可以动态调整大小,能够避免Out of Memory的错误,并且提高了GC回收效率) 另一个是运行时常量池(Runtime Constant Pool)在JDK1.7属于方法区的一部分,而在JDK 1.8变成元空间的一部分。 08 对象创建的过程了解吗? -------------- 第一步是进行**类加载检查**,当程序执行到new指令时,JVM会**先检查对应的类是否已经被加载**、解析和初始化过。如果类尚未加载,JVM会按照类加载机制(加载、验证、准备、解析、初始化)完成类的加载过程。这一步**确保了类的元信息(如字段、方法等)已经准备好**,为后续的对象创建奠定基础。 第二步是进行**内存的分配**,JVM会为新对象分配内存空间。对象所需的内存大小在类加载完成后就可以确定,因此**分配内存的过程就是从堆中划分一块连续的空间**,主要有两种方式: 一种是通过指针碰撞,**如果堆中的内存是规整的**(已使用和空闲区域之间有明确分界),JVM可以**通过移动指针来分配内存**。另一种是通过空闲列表,如果**堆中的内存是碎片化的**,JVM会维护一个**空闲列表**,记录可用的内存块,并从中分配合适的区域。 第三步是将**零值初始化**,JVM会对分配的内存空间进行初始化,将其所有字段设置为零值(如int为0,boolean为false,引用类型为null)。这一步确保了对象的实例字段在未显式赋值前有一个**默认值**,从而避免未初始化的变量被访问。 第四步是**设置对象头**,其中包含Mark Word、Klass Pointer和数组长度。Mark Word用于**存储对象的哈希码、GC分代年龄**等信息。Klass Pointer指向对象所属类的元数据(即Person.class的地址)。 第五步是**执行构造方法**,用**<init>方法完成对象的初始化**。构造方法会根据代码逻辑对对象的字段进行赋值,并调用父类的构造方法完成继承链的初始化。这一步完成后,对象才真正可用。 09 JVM相关的配置与调优专题 ---------------- ### **一、堆配置:** **1.1.配置项** `-Xms`:初始堆大小 `-Xmx`:最大堆大小 `-XX:NewSize=n`:设置年轻代大小 `-XX:NewRatio=n`:设年轻代和年老代的比值。如:为3表示年轻代和年老代比值为1:3,年轻代占整个年轻代年老代和的1/4,默认为2 `-XX:SurvivorRatio=n`:年轻代中Eden区与两个survivor区的比值,注意Survivor区有两个,默认8。如:3表示Eden:3 Survivor:2,一个Survivor区占整个年轻代的1/5 `-XX:MaxPermSize=n`:设置持久代大小 **1.2.说明** 1、一般初始堆和最大堆设置一样,因为:现在内存不是什么稀缺的资源,但是如果不一样,从初始堆到最大堆的过程会有一定的性能开销,所以一般设置为初始堆和最大堆一样。64位系统理论上可以设置为无限大,但是一般设置为4G,因为如果再大,JVM进行垃圾回收出现的暂停时间会比较长,这样全GC过长,影响JVM对外提供服务,所以不能太大。一般设置为4G。 2、`-XX:NewRaio`和`-XX:SurvivorRatio`这两个参数,第一是设置年轻代的大小,二个是设置年轻代的比值、理论上设置一个即可以满足需求(因为有默认值) **1.3. 概念解释** 年轻代:包括Eden区和Survivor区,用于管理新创建的对象。 老年代:用于存放从年轻代中存活下来的对象。 * Eden区:新对象首先被分配到这里。 * Survivor区:用于存放从Eden区中存活下来的对象,通过两个Survivor区的交替使用减少内存碎片。 **年轻代(Young Generation)** 年轻代是对象最初被分配的地方。大多数对象在年轻代中创建,并且大多数对象在年轻代中死亡(即不再被引用)。年轻代的主要特点是: Eden区:新创建的对象首先被分配到Eden区。Eden区是年轻代的主要部分,通常占据年轻代的大部分空间。 Survivor区:Survivor区分为两个部分,通常称为From Survivor区和To Survivor区。在每次Minor GC(年轻代垃圾回收)后,存活的对象会被移动到Survivor区中的一个,而另一个Survivor区则被清空。这种设计有助于减少内存碎片。(复制算法) **老年代(old Generation)** 老年代用于存放从年轻代中存活下来的对象。当对象在年轻代中经过多次Minor GC后仍然存活,它们会被晋升到老年代。老年代的特点是: Major GC(Full GC):老年代的垃圾回收称为Major GC或Full GC。Full GC通常比Minor GC更耗时,因为它需要扫描整个堆内存。 **Eden区与Survivor区** Eden区:新对象首先被分配到Eden区。当Eden区满时,会触发一次Minor GC,将存活的对象移动到Survivor区中的一个(通常是From Survivor区)。 Survivor区:Survivor区用于存放从Eden区中存活下来的对象。在每次Minor GC后,存活的对象会被移动到另一个Survivor区(To Survivor区),而原来的Survivor区(From Survivor区)则被清空。这种设计有助于减少内存碎片,提高内存利用率。 ### **二、调优总结** **年轻代大小选择:** * **响应时间优先的应用:** 尽可能设置大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时减少到达年老代的对象。 * **吞吐量优先的应用:** 尽可能的设置大,可能到达Gbit的程度,因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8核CPU以上应用。 **年老代大小选择:** * **响应时间优先的应用:** 年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可能会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得: * 1、并发垃圾收集信息 * 2、持久代并发收集次数 * 3、传统GC信息 * 4、花在年轻代和年老代回收上的时间比例,减少年轻代和年老代花费的时间,一般会提高应用的效率。 * **吞吐量优先的应用:** 一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期对象,而年老代尽存放长期存活的对象 **较小堆引起的碎片问题:** 因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置: `-XX:+UseCMSCompactAtFullCollection`:使用并发收集器时,开启对年老代的压缩 `-XX:CMSFullGCsBeforeCompaction=0`:上面配置开启的情况下,这里设置多少次FullGc后,对年老代进行压缩。 ### **三、内存泄露检查** 根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。 **持久代占满处理:** 1、`-XX:MaxPermSize=16m`设置持久代大小 2、换JDK、比如:JRocket **系统内存被占满:** 一般是因为没有足够的资源产生线程造成的,系统创建线程时,除了要在Java堆中分配内存外,操作系统本身也需要分配资源来创建线程。因此,当线程数量大的一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,出现异常; 分配给Java虚拟机的内存越多,系统剩余的资源就越少,因此,当系统内存固定时,分配给Java虚拟机的内存越多,那么,系统总共能够产生的线程也就越少,两者成反比。同时,可以通过修改-Xss来减少分配给单个线程的空间,也可以增加系统总共生产的线程数。 ### **四、GC使用与性能优化管理** (1)不要显式调用System.gc()。此函数建议JVM进行主动GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主动GC的频率、也即增加了间歇性停顿的次数。大大的影响系统性能。 (2)尽量减少临时对象的使用。临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而减少了主GC的机会。 (3)对象不用时最好显式置为Null。一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。 (4)尽量使用StringBuffer,而不用String来累加字符串。由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如`Str5=Str1+Str2+Str3+Str4`,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer是可变长的、它在原有基础上进行扩增,不会产生中间对象。 (5)能用基本类型如int,long,就不用Integer,Long对象。基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。 (6)尽量少用静态对象变量。静态变量属于全局变量,不会被GC回收,它们会一直占用内存 (7)注意分散对象创建或删除的时间,集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存、JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片,从而增加主GC的频率。集中删除对象,道理也是一样的。 ### **五、JVM调优参数参考** 1.针对JVM堆的设置,一般可以通过`-Xms -Xmx`限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,通常把最大、最小设置为相同的值; 2.年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代 比如年轻代,通过: `-XX:newSize-XX:MaxNewSize`来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把`-XX:newSize-XX:MaxNewSize`设置为同样大小。 3.年轻代和年老代设置多大才算合理 * 更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的FullGC * 更小的年轻代必然导致更大年老代,小的年轻代会导致普通GC很频繁,但每次的GC时间会更短:大的年老代会减少FullGC的频率 如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性。 在抉择时应该根据以下两点: (1)本着FullGC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理。 (2)通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响FullGC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间。 4.在配置较好的机器上(比如多核、大内存),可以为年老代选择并行收集算法-`XX+UseParallelOldGC`。 5.线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用。 理论上,在内存不变的情况下,减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统。 ### **六、触发Full GC的几种情况** **1.老年代空间不足** (1)年轻代晋升:当年轻代中的对象经过多次Minor GC后仍然存活,会被晋升到老年代。如果老年代空间不足,无法容纳这些晋升的对象,就会触发Full GC。 (2)大对象直接分配:如果应用程序直接分配大对象(超过年轻代Eden区的大小),这些对象会直接进入老年代。如果老年代空间不足,也会触发Full GC。 **2.方法区(元空间或永久代)空间不足** (1)类加载:如果应用程序动态加载大量类,导致方法区(Metaspace或永久代)空间不足,会触发Full GC。 (2)元数据回收:Metaspace或永久代中的元数据(如类信息、方法信息等)不再被引用时,需要通过Full GC进行回收。 **3.System.gc()调用** 显式调用:应用程序中显式调用System.gc()或Runtime.getRuntime().gc()会建议JVM执行Full GC。不过JVM不一定会立即执行,具体行为取决于JVM的实现和配置。 **4.垃圾回收器策略** (1)CMS GC的并发模式失败:在使用CMS(Concurrent Mark-Sweep)垃圾回收器时,如果在并发标记过程中老年代空间不足,会触发Full GC。 (2)G1 GC的疏散失败:在使用G1(Garbage-First)垃圾回收器时,如果在疏散(Evacuation)阶段无法找到足够的空闲区域来存放存活对象,会触发Full GC。 **5.堆内存分配失败** 内存泄漏:如果应用程序存在内存泄漏,导致堆内存中大量对象无法被回收,最终堆内存耗尽,会触发Full GC # Java集合部分 01 HashMap的原理 ------------- HashMap在jdk1.7和1.8实现上是有些不一样的,先介绍1.7。在1.7中,底层是通过**数组+链表**来实现的,当我们插入元素的时候,会计算key的hash值,也就是**对数组长度取模**,得到插入位置的下标,如果该位置为空,就插入元素,**如果不为空,就会以链表的形式存储**,会去遍历链表,如果找到了相同的key,就替换value,表示修改操作;如果没有相同的key,就把新的entry**插入到链表的头部**。在1.7中,扩容机制是,比如默认数组容量是16,加载因子0.75,所以当我们插入第13个元素的时候就会触发扩容,**扩容会重新对所有元素进行hash计算,去把元素放到新的数组中去**。 但是1.7中存在一些问题:首先就是**哈希冲突比较严重的时候链表会变得很长**,链表的查询效率是O(n),这就会影响性能。另外,**头插法虽然比较快,但是在多线程环境可能就会形成环形链表,陷入死循环**(比如现在链表是A->B->C,线程A和线程B同时去操作链表,如果线程A先去操作时候发现需要扩容,通过头插法扩容A先放入新数组,然后是B和C,顺序就变成了C->B->A,这个时候线程B再去操作,线程B还以为是原链表,即A指向B,但是现在实际已经变成了B指向A,就形成了死循环);再就是扩容,1.7是对所有元素重新计算,这个也比较复杂。 针对这3个问题,首先一点,1**.8改成了尾插法**,**扩容不会反转链表**,所以避免了死循环的产生;第二点,**1.8中采用数组+链表+红黑树的结构**。当我们插入数据,如果对应位置已经有元素,会先存储成链表,但是如果**链表的长度已经等于8**了,就需要看**数组长度是否大于64**,**如果没有就优先扩容数组**;**如果数组元素已经大于64,就把链表转换成红黑树存储**,这个转换的契机就是链表长度大于8,然后**如果元素少于6个,就从二叉树再退化回链表**。1.8里的扩容契机和1.7一样,除了前面提到的链表长度那里以外,也是判断数组存储的元素是否超过临界值。但是1.8的扩容不是全部重新计算hash,而是**通过元素的hash和老数组的长度进行&运算来计算出元素是处于高位还是低位**,**如果结果是0就把元素留在原来位置不移动,否则就移动到原来索引位置加上老数组容量的位置去**,显著提升了扩容的速度。 ![](https://pic.code-nav.cn/post_picture/1734931576698986498/BQs0w7d9uF41OrSl.webp) 注意:声明初始容量的时候需要考虑集合的实现类型,如果是hashmap或者hashset(实际就是hashmap,只不过value为空),那初始容量实际要声明成100W/扩容因子(默认0.75),如果是非hashmap实现,比如arraylist,直接声明成100W就可以了,因为arraylist是存满再扩容,没有扩容因子。 02 ArrayList和LinkedList的区别? --------------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/Dn5EXGcLxbwBrVWW.webp) 03 常见的集合有哪些? ------------ ![](https://pic.code-nav.cn/post_picture/1734931576698986498/YLiRbWx5BxIGcULB.webp) 04 1亿量级的ArrayList数据去重? ---------------------- (1)直接hashset,但是注意初始化容量,避免频繁扩容(可以初始化成ArrayList.size() / 0.75 + 1) (2)排序+遍历去重,排序完之后,一遍扫过去,只要和前一个不一样就保留; (3)bitmap,先遍历一遍arraylist,用一个二进制位去把arraylist里元素值对应位置的bit值改为1,遍历完再遍历位图,收集所有标记为1的位置下标(如果是0-1亿之间的数字,bitmap只需要12MB的内存,如果是int范围512MB也够了) # SSM框架部分 01 Spring IOC ------------- IoC即控制反转。 例如:现有类A依赖于类B 传统的开发方式:往往是在类A中手动通过new关键字来new一个B的对象出来;使用IoC思想的开发方式:不通过new关键字来创建对象,而是通过IoC容器(Spring框架)来帮助我们实例化对象。我们需要哪个对象,直接从IoC容器里面去取即可。 从以上两种开发方式的对比来看:我们“丧失了一个权力” (创建、管理对象的权力),从而也得到了一个好处(不用再考虑对象的创建、管理等一系列的事情) 为什么叫控制反转? 控制:指的是对象创建(实例化、管理)的权力 反转:控制权交给外部环境(IoC容器) ### IoC解决了什么问题? IoC的思想就是对象之间不互相依赖,由第三方容器来管理相关资源。这样有什么好处呢? 1、降低了对象之间的耦合度或者说依赖程度; 2、资源变的容易管理;比如用Spring容器提供的话很容易就可以实现一个单例。 例如:现有一个针对User的操作,利用Service和Dao两层结构进行开发,在没有使用IoC思想的情况下,Service层想要使用Dao层的具体实现的话,需要通过new关键字在UserService的实现类中手动new出UserDao的具体实现类。如果后续接到新的需求,针对UserDao接口需要开发另一个新的实现类,我们就需要手动修改UserService实现类中new的对象。如果有许许多多的地方都引用了UserDao的具体实现的话,那修改起来就会非常的繁琐。 使用IoC的思想,我们将对象的控制权(创建、管理)交由IoC容器去管理,我们在使用的时候直接向IoC容器 “要”就可以了(通过注解去标识,按照类型/名称去进行注入)。 ### IoC和DI有区别么? IoC是一种设计思想或者说是某种模式。这个设计思想就是**将原本在程序中手动创建对象的控制权交给第三方比如IoC容器。**对于我们常用的Spring框架来说,IoC容器实际上就是个Map(key,value),Map中存放的是各种对象。 IoC最常见的实现方式叫做依赖注入简称DI。 02 Spring自动装配原理 --------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/ALVvh0rZcAqWrQDT.webp) 通过注解或者一些简单的配置就能在Spring Boot的帮助下快速实现某块功能。 在传统Spring中,我们需要在XML或Java配置中显式地定义很多Bean(如数据源等)。而在Spring Boot中,只引入了特定的依赖,Spring Boot就会自动配置好这些组件。举个例子:要使用JDBC,只需在pom.xml中引入spring-boot-starter-jdbc依赖,并在yml文件中配置一些连接信息即可。 **自动装配的实现:** 核心机制:条件化装配 这是自动装配的基石。Spring Boot不会盲目地配置所有东西,它只在某些**条件满足**的情况下才进行配置。这是通过一系列@Conditional注解来实现的。 条件注解: 1. 如果没有引入web启动依赖,所有与web相关的自动配置类都不会被加载; 2. 用户自定义的加了@Bean注解的都会被优先加载; 3. 在yml等配置文件中我们可以自定义配置属性,比如内置的tomcat启动端口是8080,如果我们配置成其他端口,就会按照我们的配置进行自动装配。 自动装配的过程可以概括为以下几个步骤: 1. **启动注解:**@SpringBootApplication 每个Spring Boot主类上都标有@SpringBootApplication,它是一个复合注解,其中@EnableAutoConfiguration注解就启用自动配置的。 1. **启用自动配置:**@EnableAutoConfiguration 这个注解的作用是启用Spring Boot的自动配置机制。它背后是通过一个import选择器的类实现的(AutoConfigurationImportSelector.class)。 1. **加载自动配置列表:** 会通过import选择器类读Classpath下所有JAR包中的META-INF/spring.factories文件。 1. **关键文件:** META-INF/spring.factories 这个文件是一个标准的Java配置文件,内容是**键=值**对的形式。这个列表定义了**所有可能被自动配置的类**。 1. **过滤与条件判断:** Import选择器不会直接加载所有可能的配置类。而是通过**条件注解**对列表中的配置类进行筛选。只有满足条件的配置类,才会被真正解析,将其中的Bean定义加载到Spring容器中。 03 Spring AOP ------------- AOP(Aspect Oriented Programming)即面向切面编程,AOP是OOP(面向对象编程)的一种延续,二者互补,并不对立。 AOP的目的是将一些分散在多个类或对象中的公共行为(如日志记录、事务管理、权限控制、接口限流等)从核心业务逻辑中分离出来,通过动态代理技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。 AOP之所以叫面向切面编程,是因为它的核心思想就是将横切关注点从核心业务逻辑中分离出来,形成一个个的切面(Aspect)。 ### AOP常见的通知(增强)类型 ![](https://pic.code-nav.cn/post_picture/1734931576698986498/YVfKWVMQS1yHXpFm.webp) ### AOP解决了什么问题? OOP不能很好地处理一些分散在多个类或对象中的公共行为(如日志记录、事务管理、权限控制、接口限流、接口幂等等),这些行为通常被称为横切关注点。如果我们在每个类或对象中都重复实现这些行为,那么会导致代码的冗余、复杂和难以维护。 AOP可以将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,实现关注点的分离。 比如日志记录,没有AOP之前,我们需要对需要加日志记录的地方挨个去写代码,全是重复的逻辑;但是有AOP技术之后,我们就可以把日志记录的逻辑封装成一个切面,然后通过切点和通知来指定具体在哪些方法中加入日志。在指定方法中只需要加一行注解就可以实现日志记录。 ### AOP的应用场景 **日志记录:** 自定义日志记录注解,利用AOP,给业务方法上加一行注解即可实现日志记录。 **性能统计:** 利用AOP在目标方法的执行前后统计方法的执行时间,方便优化和分析。 **事务管理:** @Transactional注解可以让Spring为我们进行事务管理比如回滚异常操作,免去了重复的事务管理逻辑。@Transactional注解就是基于AOP实现的。 **权限控制:** 利用AOP在目标方法执行前判断用户是否具备所需要的权限,如果具备,就执行目标方法,否则就不执行。 **接口限流:** 利用AOP在目标方法执行前通过具体的限流算法对请求进行限流处理。 ### AOP动态代理 Spring AOP是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用**JDK代理**,去创建代理对象,而对于没有实现接口的对象,就无法使用JDK去进行代理了,这时候Spring AOP会使用CGLIB生成一个被代理对象的子类来作为代理。 04 Spring事务 ----------- 事务是逻辑上的一组操作,要么都执行,要么都不执行。 我们系统的每个业务方法可能包括了多个原子性的数据库操作,比如转账就是经典的事务场景。事务能否生效数据库引擎是否支持事务是关键。比如常用的MySQL数据库默认使用支持事务的innodb引擎。但是,如果把数据库引擎变为myisam,那么程序也就不再支持事务了! ### Spring对事务的支持 (1)编程式事务管理 通过TransactionTemplate或者TransactionManager手动管理事务,实际应用中很少使用,但是对于你理解Spring事务管理原理有帮助。 (2)声明式事务管理 推荐使用(代码侵入性最小),实际是通过AOP实现(基于@Transactional的全注解方式使用最多)。 ![](https://pic.code-nav.cn/post_picture/1734931576698986498/YWmCHpJHLPmc1itU.webp) ### 声明式事务在多线程场景下的问题 ![](https://pic.code-nav.cn/post_picture/1734931576698986498/MHnvmlO7BZJMf020.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/cxDIuSFdlW2N7ZBS.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/gA7vFgkShodB92ii.webp) ### 事务的属性 事务属性包含了5个方面:隔离级别、传播行为、回滚规则、是否只读、事务超时 **只读模式** @Transactional(readOnly = false) 只读模式可以提升查询事务的效率,推荐事务中只有查询代码时,使用只读模式。默认是false,一般情况下,都是在类上添加@Transactional注解,针对类下的查询方法可以通过再次添加@Transactional注解,设置为只读模式,从而提高查询的效率(因为查询并不会改变数据库的数据,所以本身就不需要事务)。 **超时时间** @Transactional(timeout = 3) 默认值是-1,代表永远不超时,设置timeout = 时间(秒数),超过时间,就会回滚事务和报异常(TransactionTimedOutException),如果类上设置了,方法也设置了事务注解,方法上的注解会覆盖掉类上的注解! **指定事务异常回滚规则** @Transactional(rollbackFor=Exception.class, noRollbackFor=FileNotFoundException.class) 默认只针对运行时异常回滚(error也会回滚),编译时异常不回滚。可以指定: rollbackFor属性:指定哪些异常类才会回滚,默认是RuntimeException and Error 异常方可回滚; noRollbackFor属性:指定哪些异常不会回滚,默认没有指定,如果指定,应该在rollbackFor的范围内! 为了让发生所有异常都进行事务的回滚,我们可以指定Exception异常来控制所有异常都回滚!即:rollbackFor = Exception.class **事务隔离级别** _@Transactional(isolation = Isolation.READ_COMMITTED)_ Spring支持的隔离级别枚举: Isolation.DEFAULT:使用数据库默认隔离级别。 Isolation.READ_UNCOMMITTED:读未提交。 Isolation.READ_COMMITTED:读已提交。 Isolation.REPEATABLE_READ:可重复读。 Isolation.SERIALIZABLE:串行化。 数据库事务的隔离级别是指在多个事务并发执行时,数据库系统为了保证数据一致性所遵循的规定。常见的隔离级别包括: * 读未提交(Read Uncommitted):事务可以读取未被提交的数据,容易产生脏读、不可重复读和幻读等问题。实现简单但不太安全,一般不用。 * 读已提交(Read Committed):事务只能读取已经提交的数据,可以避免脏读问题,但可能引发不可重复读和幻读。(大多数数据库的默认隔离级别) * 可重复读(Repeatable Read):确保在同一事务中多次读取同一数据时,结果一致,不管其他事务对数据做了什么修改。可以避免脏读和不可重复读,但仍有幻读的问题。(MySQL的默认隔离级别) * 串行化(Serializable):最高的隔离级别,完全禁止了并发,只允许一个事务执行完毕之后才能执行另一个事务。可以避免以上所有问题,但效率较低,不适用于高并发场景。 **事务传播行为** _@Transactional(propagation = Propagation.REQUIRED)_ 事务传播行为定义了**多个事务方法相互调用时,事务应该如何传播**。Spring提供了7种事务传播行为,通过@Transactional注解的propagation属性进行配置。 | 传播行为类型 | 说明 | | --- | --- | | REQUIRED(默认) | 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务,保证最后仅有一个事务。 REQUIRES_NEW | 无论当前是否存在事务,都创建一个新事务,并挂起当前事务(挂起事务的意思是在当前事务执行过程中,暂时将其暂停,并开启一个新的事务;挂起事务后,当前事务的状态会被保存,直到新事务执行完毕后再恢复),最后会有多个独立的事务,所以如果后面的事务报异常了,前面事务已经修改的数据并不会跟着一起回滚,适用于独立事务的场景,比如日志记录。 SUPPORTS | 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行,适用于查询方法,不需要强制事务。 NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,则挂起该事务,适用于不需要事务支持的操作。 MANDATORY | 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常,强制要求必须开启事务。 NEVER | 以非事务方式执行操作,如果当前存在事务,则抛出异常,强制要求不能开始事务。 NESTED | 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新事务,适用于需要部分回滚的场景。 | ### 事务失效的场景 1. 数据库引擎不支持事务,比如mysql数据库使用的是MyISAM引擎; 2. 事务注解所在的方法是非public的,因为SpringAOP默认使用CGLIB代理,无法给非public的方法创建代理,导致事务切面无法切入; ![](https://pic.code-nav.cn/post_picture/1734931576698986498/sPA8bWcCQfHjKI2b.webp) 1. 异常类型不正确或被捕获,默认只回滚运行时异常和error,受检异常(IO异常,SQL异常)被视为业务异常,默认会提交事务;另外事务代理会通过捕获目标方法抛出的异常来决定是回滚还是提交,如果异常在方法内部被catch捕获且没有被重新抛出,代理会认为方法执行成功,从而提交事务; 2. 一个没有事务注解的方法调用了同一个类中有注解的方法,这种情况下使用的是this对象,是真实的对象,而不是代理对象; 3. 错误配置了事务传播属性,比如配置成以非事务方式运行,事务也会不生效; 4. 试图在final或static方法上使用事务,CGLIB代理是通过生成目标类的子类来实现的,它无法重写final和static方法。 05 Spring设计模式 ------------- ### 工厂模式 Spring使用工厂模式可以通过BeanFactory或ApplicationContext创建bean对象。 **两者对比:** BeanFactory:延迟注入(使用到某个bean的时候才会注入),相比于ApplicationContext来说会占用更少的内存,程序启动速度更快。 ApplicationContext:容器启动的时候,不管你用没用到,一次性创建所有bean。BeanFactory仅提供了最基本的依赖注入支持,ApplicationContext扩展了BeanFactory, 除了有BeanFactory的功能还有额外更多功能(比如:支持基于观察者模式的事件驱动编程,另外Java EE的标准注解,如@Resource也自动支持),所以一般开发人员使用ApplicationContext会更多。 ### 单例设计模式 在我们的系统中,有一些对象其实我们只需要一个,比如说:线程池、缓存、日志对象等。事实上,这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生,比如:资源使用过量、或者结果不一致性。 **使用单例模式的好处**: 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些大对象而言,是非常可观的一笔系统开销; 由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。 **Spring中bean的默认作用域就是singleton(单例)的。** 除了singleton作用域,Spring中bean还有下面几种作用域: * **prototype**:每次获取都会创建一个新的bean实例。也就是说,连续getBean()两次,得到的是不同的Bean实例。 * **request**(仅Web应用可用):每一次HTTP请求都会产生一个新的bean(请求bean),该bean仅在当前HTTP request内有效。 * **session**(仅Web应用可用):每一次来自新session的HTTP请求都会产生一个新的bean(会话bean),该bean仅在当前HTTP session内有效。 * **global-session**(仅Web应用可用):每个Web应用在启动时创建一个Bean(应用Bean),该bean仅在当前应用启动时间内有效。 ### 代理模式 **一个经典的例子就是AOP,** 能够将那些与业务无关,却为业务模块所共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度。 Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用**JDK**去创建代理对象,而对于没有实现接口的对象,Spring AOP会使用**Cglib**生成一个被代理对象的子类来作为代理。 ### 观察者模式 观察者模式表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,依赖这个对象的所有对象也会做出反应。Spring事件驱动模型就是观察者模式很经典的一个应用。比如我们每次添加商品的时候都需要重新更新商品索引,这个时候就可以利用观察者模式来解决这个问题。 ### 适配器模式 适配器模式(Adapter Pattern)可以将一个接口转换成我们希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。 # RabbitMQ部分 01 RabbitMQ的底层架构 ---------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/pmWJVvFqIw7n1XCB.webp) 02 消息什么情况下会进入死信队列? ------------------ ![](https://pic.code-nav.cn/post_picture/1734931576698986498/2Pzh38RoCaYzjzoH.webp) 03 RabbitMQ怎样实现延迟队列? -------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/gh05HXfvlKne74x0.webp) 04 RabbitMQ中无法路由的消息会去哪里? ------------------------ ![](https://pic.code-nav.cn/post_picture/1734931576698986498/50mkHs7WwXVEbK1D.webp) 05 如何避免重复处理消息? -------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/9rr0CzAmtyQxhV4M.webp) 06 RabbitMQ的推和拉模式? ------------------ 推模式: 推模式也称为订阅模式。消息是主动推送给消费者的,消费者会预先注册一个回调函数(消费者处理器),消息到达队列后会立刻推送给消费者,消费者设置预取数量来控制流量。这样的话消息的实时性高,到达后立即推送,减少了不必要的请求开销;缺点的话可能因处理能力不足导致消息堆积,需要合理设置预取数量以避免过载。适用于实时性要求高,消息量稳定的场景。 拉模式: 拉模式需要消费者主动从队列中获取消息。消费者主动请求,可以精确控制获取消息的时机和数量,适用于消息处理耗时较长或需要批量处理的场景。消费者可以按照自身能力获取消息,避免消息积压在消费者端,适合处理耗时任务。但是实时性较差,需要轮询去获取消息,大量的获取请求浪费可能增加了网络请求开销。适用于处理耗时,需要精确控制的场景。 07 消费者消费失败的常见因素? ---------------- (1)消息处理逻辑错误:比如消息内容是订单支付成功通知,但是消费者处理时因逻辑错误(比如金额计算错误)导致异常;也可能是外部依赖的异常,比如消息需要调用第三方的API,但是接口返回超时或者错误响应 (2)消费者也可能因为服务突然宕机,导致正在处理的消息未确认;或者消费者处理消息时执行耗时操作(比如生成大型图表),长时间未返回ACK触发RabbitMQ的超时机制。 (3)网络或中间件问题:消费者与RabbitMQ之间的网络抖动,导致心跳超时或通道(Channel)关闭;或者集群中某个节点宕机,消费者未正确切换到其他节点,导致消息无法投递。 08 消费者怎么保证消息消费的可靠性? ------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/z4yLyUf2tuL1uepC.webp) 09 RabbitMQ消息丟失的3种情况和对应解决? -------------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/9qzzoOy2mnhlk0tm.webp) (1)生产者弄丢数据 生产者将数据发送到RabbitMQ的时候,可能数据在半路弄丢了(比如网络问题之类的)。RabbitMQ有两种解决方式:1、生产者发送数据之前开启RabbitMQ的**事务功能**,如果消息没有成功被MQ接收到,那么生产者就会收到异常报错,此时就可以回滚事务,然后**重试发送消息**,但是问题是事务机制是同步的,提交一个事务之后就会阻塞等待事务处理完,所以吞吐量会下降,比较消耗性能; 2、开启MQ的**confirm模式**,这样每次写的消息都会分配一个唯一的id,然后如果写入了RabbitMQ中,MQ就会回传一个ack消息,告诉生产者这个消息ok了,如果MQ没能处理这个消息就会回调生产者的nack接口,告诉生产者消息接收失败了,然后可以进行重发。这个过程是异步的,发送完这个消息之后可以紧接着发生下一个消息。 (2)RabbitMQ弄丢了数据 这个我们需要开启RabbitMQ的持久化,保证消息写入之后会**持久化**到磁盘,这样即使RabbitMQ自己挂了,恢复之后也可以自动读取之前存储的数据。(需要在创建队列的时候给queue设置为持久化,并且还需要给消息也设置为持久化的) (3)消费者弄丢了数据 比如消息刚收到消费者就宕机了,这种情况我们需要**关闭MQ的默认ack机制**(因为默认是收到了就会触发ack确认),我们应该在消费者这边**业务处理完成之后再手动去ack确认**,这样即使消费者宕机没能处理消息,消息也不会被ack,所以消息可以重新入队处理。 10 RabbitMQ消息怎么传输? ------------------ ![](https://pic.code-nav.cn/post_picture/1734931576698986498/nRxNO1tQ5PXbUDLR.webp) 11 RabbitMQ怎么保证消息的顺序性? ---------------------- **方案一:单队列单消费者(FIFO最简单模式)** 这是最直接但也限制最大的方法。 **原理**: * **生产者**:将需要保证顺序的所有消息发送到**同一个队列**中。 * **消费者**:该队列**只能有一个消费者**,并且设置channel.basicQos(1),即每次只取一条消息,处理完一条再取下一条。 **优点**: * 实现简单,充分利用了RabbitMQ队列本身的FIFO(先进先出)特性。 **缺点**: * **无法水平扩展**:单个消费者是性能瓶颈,吞吐量低。 * **单点风险**:如果该消费者宕机,虽然消息不会丢,但处理会完全停止。 * **适用场景**:消息量非常小,对吞吐量要求不高的场景。 **方案二:根据消息ID或业务键进行分组(路由到同队列)** 这是最常用且合理的方案,核心思想是:**将需要保证顺序的消息通过路由键确保它们进入同一个队列,并被同一个消费者顺序处理**。 **原理**: * **消息分组**:对消息进行分组。例如,订单ID为order_123的所有消息(创建、付款、发货)必须顺序处理。 * **生产端**:使用**一致性哈希交换器**或**自定义路由键**,将同一组的消息总是路由到同一个队列。 **例如**:使用x-modulus-hash这类交换器,以订单ID order_123作为路由键,计算出的哈希值总会将其路由到队列queue_2。 * **消费端**:为**每个队列启动一个消费者**(可以是多个队列,即多个消费者实例,每个实例处理不同组的消息)。同样,每个消费者需要设置prefetchCount=1。 **工作流程**: 订单A(ID=1)的所有消息 → 路由键order_1→始终发往**队列1**→ 由**消费者1**处理。 * 订单B(ID=2)的所有消息 → 路由键order_2→ 始终发往**队列2**→ 由**消费者2**处理。 **优点**: * **高性能且可扩展**:不同的组(如不同的订单)可以被不同的消费者并行处理,解决了方案一的瓶颈问题。 * **逻辑清晰**:符合大部分业务场景(如订单、会话跟踪)。 **缺点**: * 需要提前规划好消息的分组逻辑。 * 如果某个组的消息特别多(“热点订单”),对应的队列和消费者可能会有压力,但通常这种情况较少。 12 RabbitMQ消息堆积怎么处理 ------------------- ![](https://pic.code-nav.cn/post_picture/1734931576698986498/24CrvdnhXWdkizT4.webp) ![](https://pic.code-nav.cn/post_picture/1734931576698986498/gmCvql1nPUgDqwvJ.webp) 13 优惠劵场景,RabbitMQ保证一致性问题 ------------------------ 本地消息表的核心思想是**将分布式事务拆分为两个本地事务**,通过数据库的事务特性和重试机制保证最终一致性: 第一个本地事务:在业务数据库中同时完成订单状态更新和消息记录 第二个本地事务:通过定时任务将记录的消息可靠地发送到MQ **具体实现流程:** **第一阶段:业务处理与消息记录** **开启数据库事务**:当优惠券被抢后,系统开始处理优惠券状态更新 **更新订单状态**:在同一个数据库事务中,将优惠券状态从"待发放"改为"已发放" **写入本地消息表**:在同一事务中,向专门设计的消息表插入一条记录,包含: 消息ID(唯一标识)、消息内容(JSON格式的优惠券数据)、消息状态(初始为"待发送")、创建时间、重试次数(初始为0) **提交事务**:只有当优惠券更新和消息记录都成功后才提交事务 **第二阶段:消息发送与状态更新** **定时任务扫描**:系统有一个独立的定时任务,定期(如每5秒)扫描本地消息表中状态为"待发送"的记录 **发送MQ消息**:对于每条待发送记录:尝试将消息内容发送到消息队列。如果发送成功:更新该消息记录状态为"已发送";如果发送失败:增加重试次数、记录错误日志、保持状态为"待发送" **重试机制**:对于发送失败的消息,定时任务会在下次扫描时重新尝试发送,直到:发送成功或达到最大重试次数(如5次),此时可将状态改为"发送失败"并报警。

万字超详细(宝宝级)计算机网络期末(幽默版)下

# 第四章 网络层:互联网的 “交通指挥中心” ## 开场:从 “寄快递” 看懂网络层 网络层就像 “全国快递调度系统”—— 既要决定快递走哪条路(路由选择),又要给每个包裹贴对 “地址标签”(IP 地址),还得处理 “快递丢件” 问题(ICMP 协议)。接下来每个知识点,先给你用 “快递梗”“生活梗” 唠明白,再上专业定义,关键信息用表格总结,保证你一看就懂、一记就牢! --- ## 4.1 网络层的几个重要概念 ### 4.1.1 虚电路服务 vs 数据报服务(表格对比) | | | | | | |---|---|---|---|---| |对比维度|梗版解读(快递类比)|专业定义|虚电路服务|数据报服务| |核心思路|虚电路 =“预约快递专线”,全程走固定路线;数据报 =“随机快递路线”,每次可能走不同路|可靠通信责任归属|可靠通信由网络保证(专线兜底)|可靠通信由用户主机保证(自己盯物流)| |连接建立|虚电路 = 寄快递前先 “预约专线”;数据报 = 直接丢快递,不用预约|是否需要建立连接|必须建立虚电路连接|不需要建立连接| |终点地址|虚电路 = 预约时给一次地址,后续不用重复写;数据报 = 每个包裹都写全地址|终点地址使用方式|仅连接建立阶段使用|每个分组都含完整终点 IP 地址| |分组转发|虚电路 = 所有快递走同一条预约路线;数据报 = 每个快递单独选路|分组转发方式|同一条虚电路的分组按同一路由转发|每个分组独立选择路由转发| |节点故障影响|虚电路 = 专线经过的快递站坏了,所有快递都堵了;数据报 = 某快递站坏了,换条路走|节点故障处理|过故障节点的虚电路全部失效|故障节点可能丢分组,路由重新选择| |分组顺序|虚电路 = 按寄件顺序送达,不会乱;数据报 = 可能绕路,先寄的反而后到|分组到达顺序|总是按发送顺序到达终点|到达终点时不一定按发送顺序| |差错 / 流量控制|虚电路 = 快递站帮你盯;数据报 = 自己盯物流、催件|端到端处理责任|可由网络负责,也可由用户主机负责|完全由用户主机负责| ### 4.1.2 与 IP 协议配套的 “三兄弟” - **梗版**:IP 协议是 “主角”,负责给包裹贴地址;ARP 协议是 “地址翻译官”—— 把 IP 地址(快递单上的 “收件人姓名 + 地址”)翻译成 MAC 地址(快递站的 “货架编号”);ICMP 协议是 “快递客服”—— 包裹丢了、地址错了,它发 “提示消息”;IGMP 协议是 “群聊管理员”—— 管理 “多播群”(比如直播时给一群人发同一视频流)。 - **专业版**:与网际协议 IP 配套使用的协议有三个:地址解析协议 ARP(实现 IP 地址到 MAC 地址的转换)、网际控制报文协议 ICMP(用于传递差错报告和询问消息)、网际组管理协议 IGMP(用于管理多播组中的成员)。 ### 4.1.3 中间设备:不同层的 “快递站”(表格对比) | | | | | | -------- | ----- | ------------------------------------- | ----------------------------- | | 中间设备 | 对应层次 | 梗版解读(快递站类比) | 专业定义 | | 转发器 | 物理层 | “网线延长器快递站”—— 只负责把信号放大,不看内容 | 物理层设备,仅放大物理信号,实现物理层信号的转发 | | 网桥 / 桥接器 | 数据链路层 | “小区内快递站”—— 只在小区内分快递,看 MAC 地址 | 数据链路层设备,根据 MAC 地址转发帧,隔离碰撞域 | | 路由器 | 网络层 | “跨省快递调度站”—— 看 IP 地址,决定快递走哪条跨省路线 | 网络层核心设备,根据 IP 地址选择路由,转发 IP 分组 | | 网关 | 网络层以上 | “国际快递中转站”—— 处理不同协议的转换(比如 IPv4 转 IPv6) | 网络层以上的设备,实现不同网络协议的转换,用于异构网络互联 | ### 4.1.4 直接交付 vs 间接交付 - **梗版**:直接交付 =“同小区送快递”—— 收件人在同一个局域网(小区),直接送到家,不用经过其他快递站;间接交付 =“跨省送快递”—— 收件人在其他局域网(其他省份),得经过多个路由器(快递站)转发。 - **专业版**:直接交付指分组的源主机和目的主机在同一个网络,分组直接从源主机发送到目的主机,无需经过路由器;间接交付指源主机和目的主机不在同一个网络,分组需经过一个或多个路由器转发,才能到达目的主机。 ### 4.1.5 IP 地址:互联网的 “身份证号” - **梗版**:IP 地址是 “给每台电脑的全球唯一身份证号”,32 位长(IPv4),就像 “11010010.00001110.00100011.00000111” 这样的二进制串,人类看不懂,所以转成十进制(比如 [128.14.35.7])。每个连互联网的设备接口,都得有一个唯一的 IP 地址,不然就像 “快递没写收件人地址”,送不出去。 - **专业版**:IP 地址是分配给互联网上每台主机(或路由器)每个接口的 32 位(IPv4)全球唯一标识符,用于在网络层标识设备接口,实现分组的路由和转发。 #### 分类的 IP 地址(A/B/C 类单播地址) - **梗版**:A 类地址是 “大公司专属”—— 网络号占 8 位,能容纳超多主机(比如微软、谷歌);B 类地址是 “中型企业专属”—— 网络号占 16 位,主机数中等;C 类地址是 “小公司 / 家庭专属”—— 网络号占 24 位,主机数少(比如小区宽带)。 - **专业版**:分类的 IP 地址将 32 位地址分为网络号和主机号,A 类(网络号 8 位)、B 类(网络号 16 位)、C 类(网络号 24 位)均为单播地址,用于一对一通信;D 类为多播地址,E 类为保留地址。 #### 一般不指派的特殊 IP 地址(表格总结) | | | | | | | |---|---|---|---|---|---| |网络号|主机号|源地址使用|目的地址使用|梗版解读|专业含义| |0|0|可以|不可|“我自己”—— 电脑刚开机没 IP 时,临时用它代表自己|本网络上的本主机(DHCP 协议中用于请求 IP)| |0|X|可以|不可|“本小区的 X 号住户”—— 在本网络内找主机 X|本网络上主机号为 X 的主机| |全 1|全 1|不可|可以|“小区广播”—— 给本网络所有主机发消息,路由器不转发|本网络广播(受限广播),各路由器不转发| |Y|全 1|不可|可以|“Y 小区广播”—— 给网络号为 Y 的所有主机发消息|网络号为 Y 的网络广播(直接广播)| |127|非全 0 / 全 1|可以|可以|“自己跟自己说话”—— 测试电脑网卡是否正常(比如 ping 127.0.0.1)|本地软件环回测试地址,用于测试主机 TCP/IP 协议栈| ### 4.1.6 无分类编址 CIDR(无分类域间路由选择) #### CIDR 核心概念 - **梗版**:CIDR 是 “IP 地址的打包快递”—— 把多个连续的 IP 地址打包成一个 “地址块”,比如把 [128.14.32.0](http://128.14.32.0) 到 [128.14.47.255](http://128.14.47.255) 这 4096 个 IP 打包成 “[128.14.35.7/20](http://128.14.35.7/20)”,斜线后的 “20” 代表 “前 20 位是地址块标签(网络前缀),后 12 位是具体住户号(主机号)”。地址掩码就是 “标签模板”,前 20 位是 1(代表标签),后 12 位是 0(代表住户号),比如 [255.255.240.0/20](http://255.255.240.0/20)。 - **专业版**:CIDR 取消分类 IP 地址的网络号 / 主机号划分,用 “网络前缀 + 主机号” 表示 IP 地址(记为 IP 地址 / 前缀长度)。网络前缀指明地址块的共同前缀,地址掩码由连续的 1(长度 = 前缀长度)和连续的 0 组成,用于提取网络前缀。CIDR 地址块是网络前缀相同的所有连续 IP 地址的集合。 #### CIDR 地址块计算示例(以 [128.14.35.7/20](http://128.14.35.7/20) 为例) | | | | | |---|---|---|---| |计算项|二进制表示|十进制结果|梗版解读| |原始 IP 地址|10000000.00001110.00100011.00000111|128.14.35.7|具体住户地址| |网络前缀(前 20 位)|10000000.00001110.0010|128.14.32|地址块标签| |主机号(后 12 位)|0011.00000111|3.7|住户号| |最小地址(主机号全 0)|10000000.00001110.00100000.00000000|128.14.32.0|地址块第一个住户| |最大地址(主机号全 1)|10000000.00001110.00101111.11111111|128.14.47.255|地址块最后一个住户| |地址掩码(前 20 位 1)|11111111.11111111.11110000.00000000|255.255.240.0/20|地址块标签模板| #### 常用 CIDR 地址块(表格呈现) | | | | | | | ------ | --------------- | ----- | -------------------- | ---------------------- | | 网络前缀长度 | 点分十进制掩码 | 包含地址数 | 相当于分类网络数 | 梗版解读 | | /13 | 255.248.0.0 | 512K | 8 个 B 类 / 2048 个 C 类 | 大区域快递站,覆盖 8 个中型网络 | | /16 | 255.255.0.0 | 64K | 1 个 B 类 / 256 个 C 类 | 中型城市快递站,覆盖 1 个中型网络 | | /24 | 255.255.255.0 | 256 | 1 个 C 类 | 小区快递站,覆盖 1 个小型网络 | | /27 | 255.255.255.224 | 32 | 1/8 个 C 类 | 单元楼快递站,覆盖 1 个小型网络的 1/8 | #### CIDR 三个特殊地址块 - **梗版**:/32=“专属快递柜”—— 只有一个 IP,给单台主机用;/31=“双人快递盒”—— 只有 2 个 IP,给点对点链路(比如路由器之间的专线)用;[0.0.0.0/0=](http://0.0.0.0/0=)“默认快递路线”—— 不知道往哪送时,就走这条默认路。 - **专业版**:①/32(前缀 32 位):无主机号,用于主机路由;②/31(前缀 31 位):仅 2 个 IP,用于点对点链路;③[0.0.0.0/0](http://0.0.0.0/0)(前缀 0 位):默认路由,用于无匹配路由时的转发。 ### 4.1.7 IP 地址的特点(表格总结) | | | | |---|---|---| |特点|梗版解读|专业定义| |网络前缀 + 主机号|IP 地址 =“小区标签 + 住户号”,缺一不可|每一个 IP 地址由网络前缀和主机号两部分组成,标识网络和网络内的主机| |标识接口而非主机|一台电脑连两个网络(比如笔记本连 WiFi 和网线),就有两个 IP,像 “一个人有两个快递地址”|IP 地址标志一台主机(或路由器)的一个接口,而非整个主机| |转发器 / 交换机不划分网络|小区里的交换机(楼道路由器)连的电脑,都算一个网络,像 “同一栋楼算一个小区”|转发器或交换机连接的若干局域网仍为一个网络,网络边界由路由器划分| |网络平等|不管是 A 类还是 C 类网络,在互联网中地位一样,像 “不管小区大小,快递待遇相同”|所有分配到网络前缀的网络在互联网中地位平等,无优先级差异| ### 4.1.8 IP 地址 vs MAC 地址(表格对比) | | | | | | |---|---|---|---|---| |对比维度|梗版解读|专业定义|IP 地址|MAC 地址| |所属层次|IP 地址 =“快递单上的收件人地址”(全国通用);MAC 地址 =“快递站货架编号”(小区内用)|对应协议层次|网络层及以上(逻辑地址)|数据链路层(物理地址)| |分配方式|IP 地址 =“快递站分配的临时地址”(可改);MAC 地址 =“货架出厂编号”(固定)|分配与修改|动态分配(如 DHCP),可修改|固化在网卡 ROM 中,全球唯一,不可修改| |使用场景|IP 地址 =“跨省快递指路”;MAC 地址 =“小区内分快递”|通信范围|用于跨网络通信(路由转发)|用于同一网络内帧的传输(链路层转发)| |封装关系|IP 数据报 =“快递包裹”,交给数据链路层后,套上 “MAC 帧外壳”(写 MAC 地址)|封装层次|封装在 IP 数据报首部|封装在 MAC 帧首部,IP 数据报作为 MAC 帧的数据| --- ## 4.2 IP 层转发分组过程 ### 4.2.1 基于终点的转发(以 P141 例 4-2 为例) - **梗版**:路由器转发分组就像 “快递站分件”—— 先看收件人 IP 地址(比如 [202.113.0.3](http://202.113.0.3)),查 “路由表”(快递路线表),找到对应的 “下一站快递站”(下一跳路由器 IP),然后把包裹发过去。比如路由器收到目的 IP 为 [202.113.0.3](http://202.113.0.3) 的分组,查路由表发现该 IP 属于 “[202.113.0.0/24](http://202.113.0.0/24)” 网络,下一跳是 [192.168.1.2](http://192.168.1.2),就把分组发给 [192.168.1.2](http://192.168.1.2)。 - **专业版**:基于终点的转发指路由器根据分组的目的 IP 地址,查找路由表,确定对应的下一跳路由器和输出端口,将分组转发到下一跳。转发过程中,路由器仅关注目的 IP 地址的网络前缀,不关心主机号。 ### 4.2.2 最长前缀匹配(以 P142 例 4-3 为例) - **梗版**:最长前缀匹配 =“快递单地址越具体,越优先匹配”。比如收到目的 IP 为 [128.14.35.7](http://128.14.35.7) 的分组,路由表中有 “[128.14.32.0/20](http://128.14.32.0/20)”(前缀 20 位)和 “[128.14.35.0/24](http://128.14.35.0/24)”(前缀 24 位),优先匹配前缀更长的 “[128.14.35.0/24](http://128.14.35.0/24)”,因为它更具体(精确到小区,而非大区域)。 - **专业版**:最长前缀匹配是路由器转发分组的核心原则,即从路由表中选择与目的 IP 地址网络前缀匹配最长的路由条目,以确保分组转发到最精确的网络,减少转发路径错误。 ## 4.3 网际控制报文协议 ICMP ### 4.3.1 ICMP 报文的种类(表格总结) | | | | | | |---|---|---|---|---| |报文类型|类型值|梗版解读(快递客服类比)|专业功能|典型场景| |差错报告报文 - 终点不可达|3|“快递送不到”—— 收件人地址错、小区不让进,客服发通知|当分组无法送达目的地址时,路由器向源主机发送差错报告|目的 IP 不存在、端口未开放、路由不可达| |差错报告报文 - 时间超过|11|“快递超时”—— 快递在路上走太久(TTL 值为 0),客服通知寄件人|分组的 TTL(生存时间)值减为 0,或分片重组超时,路由器发送差错报告|路由环路导致分组循环、分片重组超时| |差错报告报文 - 参数问题|12|“快递单填错”——IP 首部参数错误(比如校验和错),客服退回|发现 IP 数据报首部参数错误,无法转发,路由器发送差错报告|IP 首部校验和错误、选项字段格式错误| |差错报告报文 - 改变路由(Redirect)|5|“快递路线改了”—— 原来的路线绕远,客服告诉寄件人新路线|路由器发现源主机使用的路由不是最优路由,通知源主机更新路由|源主机使用默认路由,存在更短路径时| |询问报文 - 回送请求 / 回答|8/0|“快递测试”—— 寄件人发 “测试包裹”,收件人收到后回发,确认通路正常|源主机发送 Echo 请求报文,目的主机收到后回发 Echo 回答报文,测试连通性|ping 命令(测试两台主机是否连通)| |询问报文 - 时间戳请求 / 回答|13/14|“快递计时”—— 寄件人发 “计时包裹”,记录发送 / 接收时间,测算延迟|源主机发送时间戳请求,目的主机回发时间戳回答,用于同步时间或测算时延|网络时间同步、时延测量| --- ## 4.4 IPv6 ### 4.4.1 IPv6 的 8 大核心变化(表格对比) | | | | | |---|---|---|---| |变化点|梗版解读(快递系统升级类比)|专业改进|对比 IPv4| |更大地址空间|“快递地址从 11 位升级到 39 位”—— 原来 32 位地址不够用(比如物联网设备太多),现在 128 位,够用到 “地球装不下设备”|地址长度从 32 位增至 128 位|32 位(约 43 亿地址)→128 位(地址数量极大,满足未来需求)| |扩展地址层次|“快递地址分更多级”—— 原来分 “省 - 市 - 区”,现在分 “全球 - 区域 - 城市 - 小区 - 楼栋”,路由更高效|地址层次结构更丰富,支持多级子网划分|分类地址层次简单(仅网络号 + 主机号),IPv6 层次更灵活| |灵活首部格式|“快递单可自定义贴纸”—— 基础首部固定,可选功能(比如加密、优先级)用 “扩展首部”,不浪费空间|基础首部固定(40 字节),定义多个可选扩展首部,按需添加|IPv4 首部选项集成在首部,易浪费带宽,灵活性低| |改进选项|“快递单选项放包裹里”—— 选项信息放在有效载荷中,不占首部空间,转发更快|选项信息放在扩展首部(属于有效载荷),不影响基础首部处理|IPv4 选项在首部,增加路由器处理时间| |协议可扩充|“快递系统能加新功能”—— 未来有新应用(比如元宇宙通信),不用重构协议,直接扩展|支持协议功能的后续扩充,适应新应用场景|IPv4 协议架构固定,难以扩展新功能| |即插即用(自动配置)|“快递地址自动分配”—— 设备连网后自动获取 IPv6 地址,不用装 DHCP,像 “手机连 WiFi 自动连网”|支持无状态自动配置,设备无需依赖 DHCP 服务器即可获取地址|IPv4 需 DHCP 服务器分配地址(或手动配置),无即插即用能力| |支持资源预分配|“快递预留专线”—— 直播、视频会议需要稳定带宽,IPv6 可提前预留资源,不卡顿|支持服务质量(QoS),可预分配带宽和时延资源,保障实时应用|IPv4 无原生资源预分配机制,实时应用易受网络拥堵影响| |8 字节对齐首部|“快递单按 8 字节排版”—— 首部长度是 8 字节整数倍,路由器处理更快,像 “按标准尺寸打包,分拣效率高”|首部长度必须是 8 字节的整数倍,提升路由器转发效率|IPv4 首部按 4 字节对齐,处理效率低于 IPv6| ### 4.4.2 IPv6 的常用地址分类(表格总结) | | | | | | |---|---|---|---|---| |地址类型|二进制前缀|IPv6 记法|梗版解读|专业用途| |未指明地址|00…0(128 位)|::/128|“无地址”—— 设备刚连网,还没分配地址,像 “快递没写收件人”|仅用于设备初始化阶段,不能作为源地址或目的地址| |环回地址|00…1(128 位)|::1/128|“自己跟自己说话”—— 测试设备 IPv6 协议栈,像 “寄快递给自己”|本地软件环回测试,相当于 IPv4 的 127.0.0.1| |多播地址|11111111(8 位)|FF00::/8|“群聊快递”—— 给一群设备发同一数据(比如直播),像 “批量寄同款快递”|一对多通信,用于多播组数据传输(如视频会议、直播)| |本地站点单播地址|1111111011(10 位)|FEC0::/10|“小区内专属地址”—— 仅在本地站点(比如公司园区)内使用,出了园区无效|本地站点内的单播通信,不接入互联网| |本地链路单播地址|1111111010(10 位)|FE80::/10|“楼内专属地址”—— 仅在本地链路(比如家庭 WiFi)内使用,不能连互联网|本地链路内的单播通信(如家庭内设备互联),无需路由器转发| |全球单播地址|除上述外的前缀|-|“全球通用地址”—— 能连互联网,像 “全国通用快递地址”|互联网中的跨网络单播通信,是 IPv6 的主要地址类型| --- ## 4.5 互联网的路由选择协议 ### 4.5.1 分层次路由选择协议(表格对比) | | | | | | | |---|---|---|---|---|---| |协议类型|英文缩写|适用范围|梗版解读(快递调度类比)|专业定义|代表协议| |内部网关协议|IGP|自治系统(AS)内部(比如一个公司、一个学校的网络)|“小区内快递调度”—— 负责同一小区内的快递路线规划,不管小区外|自治系统(AS)内部的路由选择协议,用于计算 AS 内的路由|RIP 协议、OSPF 协议| |外部网关协议|EGP|自治系统之间(比如百度网络和阿里网络之间)|“跨省快递调度”—— 负责不同小区之间的快递路线协商,协调跨区域运输|自治系统之间的路由选择协议,用于计算 AS 间的路由|BGP-4 协议| #### 补充:自治系统(AS)相关概念 - **梗版**:自治系统是 “快递独立运营区”—— 比如一个公司的网络就是一个 AS,有自己的 “快递调度规则”(IGP 协议);不同 AS 之间要互相发快递,得用 “跨区调度规则”(EGP 协议)。域内路由 =“小区内调度”,域间路由 =“跨省调度”。 - **专业版**:自治系统(AS)是互联网中一个独立管理的网络区域,使用统一的路由选择协议(IGP)。自治系统内部的路由选择称为域内路由选择(intradomain routing),自治系统之间的路由选择称为域间路由选择(interdomain routing)。 ### 4.5.2 内部网关协议 RIP - **梗版**:RIP 协议是 “小区内的简易快递路线表”—— 路由器之间只互相通知 “我到某个网络要走 2 步(经过 2 个路由器)”,距离用 “路由器数量” 衡量(直接连接的网络距离 = 1)。优点是简单,适合小网络(比如几十台设备的小区);缺点是 “好消息传得快,坏消息传得慢”—— 比如某条路线断了,要很久才能通知到所有路由器,像 “快递站知道某条路堵了,却迟迟没告诉其他站”。 - **专业版**:RIP(路由信息协议)是基于距离向量算法的 IGP 协议,距离定义为 “经过的路由器数”(直接连接网络距离 = 1,非直接连接网络距离 = 经过路由器数 + 1)。RIP 仅适用于小型互联网,核心特点是 “好消息传播快,坏消息传播慢”(因距离向量算法的收敛速度慢)。 ### 4.5.3 距离向量算法(以 P161 例 4-4 为例) - **梗版**:距离向量算法是 “路由器的路线更新规则”—— 每个路由器都有一张 “距离表”,记录 “到每个网络的距离” 和 “下一跳路由器”。比如路由器 A 收到路由器 B 的通知 “B 到网络 X 距离 = 2”,A 就计算 “自己到 X 的距离 = A 到 B 的距离(1)+2=3”,如果这个距离比原来的记录近,就更新路线,像 “快递站 A 听快递站 B 说‘到 X 小区要 2 步’,就算出自己到 X 要 3 步,比原来的 4 步近,就改走 B 的路线”。 - **专业版**:距离向量算法的核心是 “每个路由器向邻居路由器发送自己的路由表(距离向量),邻居路由器根据收到的信息更新自己的路由表”。更新规则为:对于每个目的网络 N,若通过邻居路由器 R 到达 N 的距离(本路由器到 R 的距离 + R 到 N 的距离)小于当前记录的距离,则更新路由表,将下一跳设为 R,距离设为计算值。 ### 4.5.4 内部网关协议 OSPF - **梗版**:OSPF 协议是 “小区内的精密快递路线表”—— 比 RIP 高级,路由器之间互相通知 “我和哪个路由器相邻,这条链路的速度快不快(度量值,比如带宽、时延)”,而不是只说 “距离多少步”。OSPF 还把大网络分成 “区域”(比如把一个大公司分成 “研发区”“行政区”),每个区域内的路由器只处理本区域的路线,减少信息交换量。关键角色包括:主干区域(连接所有区域的 “主干道”)、区域边界路由器(连接区域和主干的 “中转站”)、主干路由器(在主干区域内的 “调度员”)、自治系统边界路由器(连接其他 AS 的 “跨区接口”)。 - **专业版**:OSPF(开放最短路径优先)是基于链路状态算法的 IGP 协议,“链路状态” 指 “本路由器的相邻路由器及链路度量值(费用、距离、时延、带宽等)”。OSPF 采用层次化区域划分(如主干区域、普通区域),核心角色包括区域边界路由器(连接区域与主干)、主干路由器(位于主干区域)、自治系统边界路由器(连接 AS 与其他 AS)。OSPF 适用于中大型互联网,收敛速度快、路由精度高。 --- ## 4.6 路由器 ### 4.6.1 路由器的本质与结构 - **梗版**:路由器是 “互联网的快递中转站”,本质是一台 “多接口专用电脑”—— 有多个 “快递入口”(输入端口)和 “快递出口”(输出端口),任务就是把收到的 “快递(IP 分组)” 转发到正确的出口。路由器分两部分:“路线规划部(路由选择部分)”—— 负责制定 “快递路线表(路由表)”,比如 “到北京的快递走 A 出口”;“快递分拣部(分组转发部分)”—— 负责按路线表分拣快递,由 “交换结构(分拣传送带)”“输入端口(收件窗口)”“输出端口(发件窗口)” 组成。 - **专业版**:路由器是具有多个输入 / 输出端口的专用计算机,核心任务是转发 IP 分组。路由器分为路由选择部分(控制层面)和分组转发部分(数据层面):①路由选择部分:负责计算和维护路由表(由路由协议实现);②分组转发部分:由交换结构、输入端口、输出端口组成,负责根据路由表转发分组。 ### 4.6.2 分组转发 vs 路由选择(表格对比) | | | | | | | ---- | -------------------------------------- | -------- | ---------------------------- | ------------------------------ | | 对比维度 | 梗版解读(快递类比) | 专业定义 | 分组转发(数据层面) | 路由选择(控制层面) | | 涉及范围 | 分组转发 =“单个快递站分拣快递”;路由选择 =“全国快递站一起制定路线表” | 涉及的路由器数量 | 仅涉及一个路由器 | 涉及互联网中的多个路由器 | | 核心任务 | 分组转发 =“按现成路线表分快递”;路由选择 =“制定新的路线表” | 核心功能 | 根据转发表(由路由表生成)将分组从输入端口转发到输出端口 | 协同计算和更新路由表,确定最优转发路径 | | 实现方式 | 分组转发 =“快递员按表分拣”;路由选择 =“总部开会定路线” | 实现机制 | 硬件 / 软件快速转发(强调效率) | 由路由协议(如 RIP、OSPF、BGP)实现(强调正确性) | | 频率 | 分组转发 =“每个快递都要做”;路由选择 =“路线变了才做” | 执行频率 | 每个分组到达时都执行,频率高 | 仅在网络拓扑变化(如链路故障、新增网络)时执行,频率低 | --- ## 本章总结:网络层的 “核心三件事” 1. **地址标识**:用 IP 地址(IPv4/IPv6)给设备接口贴 “全球唯一标签”,配合 MAC 地址实现 “跨网络 + 同网络” 通信; 2. **路由转发**:用 RIP/OSPF/BGP 等协议制定 “路线表”,路由器按 “最长前缀匹配” 规则转发分组,确保数据走最优路; 3. **差错处理**:用 ICMP 协议当 “客服”,处理 “地址错、超时、路线改” 等问题,保障通信顺畅。 # 第五章 运输层:互联网的 “搞笑打工人” ## 开场:从 “外卖 / 快递翻车现场” 看懂运输层 如果网络层是 “外卖平台调度中心”,那运输层就是 “外卖小哥”—— 有的小哥是 “顺丰级强迫症”(TCP):送餐前先打电话确认,漏菜必补,超时必赔;有的是 “饿了么急单侠”(UDP):车没停稳就扔餐,撒了不管,但能卡着点送到。接下来全是搞笑名场面,保证你笑着懂知识! --- ## 5.1 运输层协议概述 ### 5.1.1 TCP vs UDP:“强迫症小哥” vs “摆烂急单侠”(表格对比) | | | | | |---|---|---|---| |协议类型|搞笑梗版(外卖小哥人设)|专业定义|适用场景(对应 “订单类型”)| |TCP(面向连接)|“顺丰级强迫症小哥”:1. 送餐前必打电话:“您好,您点的奶茶到楼下了,方便取吗?”(建立连接)2. 漏了珍珠必补:“不好意思,珍珠撒了,我回店里重新做一杯!”(重传)3. 按顺序送:先送奶茶,再送小吃,绝不搞反(按序交付)4. 送到要签字:“麻烦确认一下,餐没漏吧?”(四次挥手释放连接)|面向连接、可靠交付、全双工通信、面向字节流的运输层协议,通过重传、确认等机制保证数据不丢、不乱|怕 “翻车” 的订单:刷网页(缺个图片像少块肉)、发邮件(漏附件等于白发)、传文件(电影缺段剧情能气疯)| |UDP(无连接)|“饿了么摆烂急单侠”:1. 不打电话直接扔:车停路边,餐往外卖柜一塞就跑(无需连接)2. 撒了假装没看见:“反正顾客没当场说,可能没发现吧?”(尽最大努力交付,不重传)3. 装多少送多少:餐盒满了就直接送,不拆分(面向报文)4. 堵车也猛冲:“超时扣钱,管它路上堵不堵,先踩油门再说!”(无拥塞控制)|无连接、尽最大努力交付、面向报文、无拥塞控制的运输层协议,不保证可靠传输,但传输效率高|能 “忍翻车” 的急单:视频通话(卡一下像卡痰,忍忍就过)、直播(漏帧像主播眨了下眼)、DNS 查询(查错了再查一次,反正快)| ### 5.1.2 应用层与运输层协议对应:“不同订单找不同小哥”(表格) | | | | | |---|---|---|---| |应用场景|应用层协议|运输层协议(小哥类型)|搞笑梗解读(订单名场面)| |查域名(查 “奶茶店地址”)|DNS|UDP(急单侠)|“我现在就要知道‘蜜雪冰城’的 IP(门店地址),等 1 秒都嫌久,急单侠快上!”(DNS 查询超 1 秒就像等奶茶等出耐心,不可能)| |传小文件(发 “作业答案”)|TFTP|UDP(急单侠)|“就一张作业答案图片,急单侠扔过来就行,撒了大不了再发一次,反正小!”(小文件重传成本 = 重新拍张照,不值当用强迫症小哥)| |视频通话(和对象 “云约会”)|专用协议|UDP(急单侠)|“对象脸卡成马赛克也不能断!要是等强迫症小哥重传,约会早凉了,摆烂就摆烂,至少没断联!”(延迟 1 秒比卡帧致命,UDP 的 “快” 比 “好” 重要)| |发邮件(给老板 “交报告”)|SMTP|TCP(强迫症小哥)|“报告漏个附件,老板能骂我半天!必须让强迫症小哥送,漏了必补,绝不能出岔子!”(邮件丢附件 = 工作失误,TCP 的可靠是 “保命符”)| |刷网页(看 “八卦新闻”)|HTTP|TCP(强迫症小哥)|“八卦新闻缺个图,像吃西瓜没吐籽,难受!强迫症小哥必须把每个图都送到,一个都不能少!”(网页缺资源 = 阅读体验崩塌,TCP 保证完整)| ### 5.1.3 端口:“外卖柜格子编号”(搞笑版) - **搞笑梗版**:端口就是 “小区外卖柜的格子编号”—— 比如 80 号格子是 “浏览器专属柜”(刷网页的餐都放这),21 号格子是 “文件传输柜”(传文件的餐放这),53 号格子是 “DNS 查地址柜”(查门店地址的纸条放这)。要是没有编号,外卖小哥可能把 “浏览器的奶茶” 放进 “微信的格子”,你打开微信找奶茶,找破头都没有! - **专业版**:端口是应用层与运输层的抽象通信终点,用于标识应用程序。运输层通过端口号将数据准确交付给对应进程,避免不同应用的数据混淆,分为服务器端知名端口(固定编号)和客户端临时端口(动态分配)。 ### 5.1.4 知名端口号:“外卖柜固定格子”(搞笑表格) | | | | |---|---|---| |应用程序|端口号|搞笑梗解读(格子用途)| |FTP(文件传送)|21|“大文件专属柜”—— 送 “10G 电影” 的强迫症小哥,必把餐放 21 号柜,绝不乱塞| |HTTP(网页)|80|“八卦新闻柜”—— 刷 “明星塌房” 新闻的餐,全放 80 号柜,打开浏览器就能取| |HTTPS(加密网页)|443|“隐私外卖柜”—— 买 “情趣用品” 的餐(刷网银、淘宝),放 443 号加密柜,别人看不到| |DNS(域名查询)|53|“查地址纸条柜”—— 问 “蜜雪冰城在哪” 的纸条,全放 53 号柜,急单侠扔了就走| |SMTP(邮件)|25|“老板报告柜”—— 给老板发的 “加班报告”,放 25 号柜,强迫症小哥必确认老板收到| --- ## 5.2 用户数据报协议 UDP(“摆烂急单侠” 的 6 大摆烂行为) ### 5.2.1 UDP 的 6 大摆烂特点(搞笑表格) | | | | |---|---|---| |特点|搞笑梗版(急单侠摆烂行为)|专业定义| |无连接|“不打电话直接冲”—— 外卖小哥看地址在 10 楼,不打电话确认有没有电梯,直接扛着餐跑上去,结果顾客不在家,餐扔门口就走|发送方无需与接收方建立连接,直接发送 UDP 数据报,无需三次握手| |尽最大努力交付|“撒了不管,送了就行”—— 奶茶撒了一半,小哥心想 “至少送到了,顾客没说就是没发现”,绝不回头补|不提供可靠交付,不重传丢失的数据,不处理乱序,仅保证数据正确时交付| |面向报文|“装多少送多少,不拆不拼”—— 顾客点了 “奶茶 + 汉堡 + 薯条”,小哥把三个打包成一个大盒子,不拆分,哪怕盒子塞不下也硬塞|UDP 数据报长度等于应用层数据长度,不拆分或合并应用层数据,保留报文边界| |无拥塞控制|“堵车也猛踩油门”—— 晚高峰路上堵成狗,小哥为了不超时,从自行车道超 car,哪怕剐蹭也不管,先送完再说|不具备拥塞控制机制,发送速率由应用层决定,网络拥堵时仍维持原速率,可能加剧拥堵| |支持多交互|“一次送三户,效率拉满”—— 小哥同时接了 101、102、103 的单,把三户的餐放一个袋子里,到楼下喊一声 “101-103 取餐”,谁先抢是谁的|支持一对一、一对多、多对一、多对多通信,UDP 数据报可发送给单个或多个接收方| |首部开销小|“快递单只写地址,别的不填”—— 小哥的外卖单只写 “10 楼 A 户”,不写顾客电话、餐品名称,单子小,贴得快|UDP 首部仅 8 字节(源端口、目的端口、长度、校验和),开销远小于 TCP(20 字节起)| --- ## 5.3 传输控制协议 TCP(“强迫症小哥” 的 5 大强迫症行为) ### 5.3.1 TCP 的 5 大强迫症特点(搞笑表格) | | | | |---|---|---| |特点|搞笑梗版(强迫症小哥行为)|专业定义| |面向连接|“三打电话确认,少一次不行”——1. 出发前:“您好,您的餐 10 分钟后到,在家吗?”(第一次握手)2. 到楼下:“我到楼下了,您下来取还是送上去?”(第二次握手)3. 送门前:“我在门口了,麻烦开下门”(第三次握手)少一次都不送,怕白跑|发送方与接收方需经过 “三次握手” 建立连接,“四次挥手” 释放连接,连接建立后才传输数据| |点对点通信|“一次只送一户,多一户不干”—— 小哥接了 101 的单,哪怕 102 就在隔壁,也绝不顺路送 102 的餐,“我的单只有 101,多送算加班!”|每一条 TCP 连接仅有两个端点(套接字:IP 地址 + 端口号),只能实现点对点(一对一)通信| |可靠交付|“漏一粒米都要重煮”—— 顾客点的炒饭少了一粒米,小哥当场崩溃:“不行,我得回店里重新炒一份,少一粒都不行!”(重传);炒饭顺序乱了(先放蛋后放饭),也要倒回去重新炒(按序交付)|通过校验和(查错)、确认(收餐签字)、重传(漏餐补送)、滑动窗口(控制送餐速度)等机制,保证数据不丢失、不重复、按序到达| |全双工通信|“送餐同时收反馈,两不误”—— 小哥送餐时,一边递餐一边问:“味道怎么样?要不要加辣?”(发送数据),顾客说 “太咸了”(接收数据),同时进行,不用等送完再问|TCP 连接为全双工模式,发送方和接收方均有发送缓存和接收缓存,可同时发送和接收数据| |面向字节流|“把炒饭拆成米粒送,再拼回去”—— 小哥把一份炒饭拆成单个米粒,按顺序送,到顾客家再拼成一碗完整的炒饭,绝不整个碗送(不像 UDP 按 “碗” 送)|TCP 将应用层数据视为连续的字节流,不保留报文边界,按字节粒度拆分、传输,接收方重组为完整数据| ### 5.3.2 TCP 套接字:“外卖收发地址”(搞笑版) - **搞笑梗版**:套接字就是 “顾客的详细地址 + 外卖柜编号”—— 比如 “[192.168.1.100:80](http://192.168.1.100:80)”,翻译过来就是 “XX 小区 192 栋 168 单元 1 楼 100 号,80 号外卖柜”。强迫症小哥送餐时,必须对着地址念三遍:“192 栋 168 单元…80 号柜… 没错!” 要是地址错了,哪怕送到门口也不递餐,怕送错人挨骂! - **专业版**:TCP 连接的端点称为套接字(Socket),由 “IP 地址:端口号” 唯一标识。一条 TCP 连接由两个套接字确定(源套接字 + 目的套接字),确保数据在两个端点间准确传输,避免混淆。 --- ## 5.4 可靠传输的工作原理(“强迫症小哥的送餐效率”) - **搞笑梗版**:信道利用率就是 “小哥的送餐装满率”—— 比如小哥骑电动车送餐,装餐要 10 分钟(TD),顾客确认收餐要 2 分钟(TA),往返一趟要 30 分钟(RTT)。要是小哥只装 1 份餐就跑,利用率 = 10/(10+30+2)=23%,像 “空车跑大半路,傻!”;要是装 5 份餐,利用率 = 50/(50+30+2)=61%,才够 “不浪费油钱”! - **专业版**:信道利用率 U = TD / (TD + RTT + TA),TD 为发送分组时间(分组长度 / 数据率),RTT 为往返时间,TA 为确认分组发送时间。利用率越高,信道资源越不浪费,TCP 通过滑动窗口提高利用率。 --- ## 5.5 TCP 可靠传输的实现(“强迫症小哥的送餐套路”) ### 5.5.1 滑动窗口:“小哥的电动车装餐量”(搞笑版) | | | | |---|---|---| |窗口类型|搞笑梗版(电动车装餐套路)|专业定义| |发送窗口|“电动车最大装餐量”—— 小哥的电动车最多装 5 份餐(发送窗口 = 5),没收到确认前,能连续送 5 份,送出去的餐要记在小本本上(暂存),万一顾客说 “没收到”,好重送|发送方允许连续发送的字节范围,由接收方告知的窗口大小决定,已发送未确认的数据需暂存于发送缓存| |接收窗口|“顾客家的餐柜容量”—— 顾客家的餐柜只能放 3 份餐(接收窗口 = 3),小哥送第 4 份时,顾客说 “柜子满了,等我吃完再送!”(窗口缩小),小哥就只能等|接收方允许接收的字节范围,随应用层读取数据的速度动态调整,避免接收缓存溢出| |发送缓存|“小哥的备用餐箱”—— 里面放两类餐:①刚从店里拿的待送餐(应用层数据);②送出去没确认的餐(怕丢了重送),像 “小哥随身带的备用奶茶,撒了能补”|发送方暂存数据的缓存:①应用层待发送数据;②已发送未确认数据,用于超时重传| |接收缓存|“顾客家的临时餐架”—— 上面放两类餐:①按序到的餐(还没吃,比如先到的奶茶);②乱序到的餐(比如先到的薯条,等奶茶到了再一起吃),像 “顾客把薯条放一边,等奶茶到了再开吃”|接收方暂存数据的缓存:①按序到达未被应用层读取的数据;②未按序到达的数据,确保按序交付| ### 5.5.2 超时重传时间:“小哥等顾客确认的耐心值”(搞笑版) - **搞笑梗版**:超时重传时间(RTO)就是 “小哥等顾客确认的耐心”—— 要是上次顾客 10 分钟才回消息(RTT=10),小哥就把耐心设为 “10_0.8 + 这次 RTT_0.2 + 波动 * 4”(加权平均)。要是耐心设太短(比如 5 分钟),顾客刚去拿快递,小哥就重送,白跑一趟;设太长(比如 1 小时),顾客早饿疯了,投诉! - **专业版**:TCP 通过加权平均计算 RTO:①RTTs(加权平均往返时间)=0.8_旧 RTTs +0.125_新 RTT;②RTTd(往返时间偏差)=0.75_旧 RTTd +0.25_| 新 RTT-RTTs|;③RTO=RTTs+4*RTTd,平衡 “不白跑” 和 “不超时”。 ### 5.5.3 选择确认 SACK:“顾客说‘缺哪份补哪份’”(搞笑版) - **搞笑梗版**:顾客点了 1-5 号餐,只收到 1、2、4、5,就给小哥发消息:“缺 3 号餐,别的都收到了!”(SACK 确认),小哥不用重送 1-5,只补 3 号就行,像 “顾客不说‘全没收到’,小哥不用白跑一趟,省时间!” 要是没有 SACK,顾客说 “没收到”,小哥只能重送 1-5,亏大了! - **专业版**:选择确认(SACK)允许接收方指明已接收的字节块范围,发送方仅重传未确认的字节块,而非重传全部数据,提高重传效率。 --- ### 5.6.1 TCP 拥塞控制的 4 大算法:“外卖小哥的避堵套路”(搞笑版 + 专业版) | | | | | |---|---|---|---| |算法|搞笑梗版(外卖小哥避堵名场面)|专业逻辑|拥塞窗口(cwnd)变化(以初始 cwnd=1、ssthresh=8 为例)| |慢开始(Slow Start)|“新手小哥不敢猛冲”:刚入职的小哥不知道哪条路堵,第一天只带 1 份餐(cwnd=1)出门,送完没堵,第二天带 2 份(cwnd=2),再没堵带 4 份(cwnd=4)… 像 “新手司机不敢开快,每过一个路口就加速一点”,直到带 8 份餐时(cwnd=ssthresh=8),老员工说 “别翻倍了,前面可能堵!”|网络空闲时,逐步增加发送速率,避免突然发送大量数据导致拥堵。cwnd 从 1 开始,每次 RTT 翻倍,直到 cwnd 达到 “慢开始门限(ssthresh)”,转入拥塞避免阶段|1→2→4→8(达到 ssthresh,停止翻倍)| |拥塞避免(Congestion Avoidance)|“老司机稳步前进”:小哥带 8 份餐出门(cwnd=8),发现路有点堵但没完全堵,就不敢再翻倍带餐了,每天只多带 1 份(cwnd=9→10→11…),像 “老司机在高速上保持 100 码,不猛踩油门,避免追尾”,直到某天带 12 份餐时(cwnd=12),突然堵死了(检测到拥塞)|接近网络容量时,平稳增加发送速率,维持网络稳定。cwnd 每次 RTT 加 1,直到检测到拥塞(超时或收到 3 个重复确认),触发拥塞处理|8→9→10→11→12(检测到拥塞,进入快重传 / 超时重传)| |快重传(Fast Retransmit)|“顾客催 3 次就重送”:小哥送了 1-10 号餐,顾客连续发 3 条消息:“没收到 6 号餐!”“真没收到 6 号!”“6 号餐呢?”(3 个重复确认),小哥没等超时,当场掉头回店里补 6 号餐,像 “顾客催 3 次,肯定是真没收到,别等了,赶紧补!”|当接收方收到乱序数据时,连续发送 3 个重复确认(对已正确接收的最后一个字节的确认),发送方收到后无需等待超时,立即重传丢失的分组,减少重传延迟|收到 3 个重复确认,立即重传丢失分组,不改变 cwnd,重传后转入快恢复| |快恢复(Fast Recovery)|“堵死后不从头来”:小哥堵在路上(检测到拥塞),要是按老办法,得回到只带 1 份餐(cwnd=1),太浪费时间!现在他聪明了:把 “慢开始门限(ssthresh)” 设为当前 cwnd 的一半(比如 cwnd=12→ssthresh=6),然后 cwnd 从 6 开始,每次加 1(6→7→8…),像 “堵死后不退回起点,从中间开始稳步加速”,避免重新慢开始的低效|检测到拥塞后,不回到慢开始的初始 cwnd=1,而是将 ssthresh 设为当前 cwnd 的一半,cwnd 从 ssthresh 开始,按拥塞避免的规则每次加 1,快速恢复发送速率|检测到拥塞→ssthresh=12/2=6→cwnd=6→7→8→9…(按拥塞避免规则增加)| #### 补充:超时重传的 “摆烂处理”(对比快重传) - **搞笑梗版**:要是小哥没收到顾客催单(没收到 3 个重复确认),而是等了半天没动静(超时),就以为 “路彻底堵死了”,直接把餐全卸了,重新从 1 份开始带(cwnd=1,ssthresh = 当前 cwnd/2),像 “新手小哥堵死了就慌了,回到起点重新来,效率低但稳妥”。 - **专业版**:若因超时检测到拥塞,发送方将 ssthresh 设为当前 cwnd 的一半,cwnd 重置为 1,重新进入慢开始阶段,适用于严重拥堵场景,但恢复速度慢。 --- ## 5.6 总结:运输层的 “打工人图鉴” | | | | | |---|---|---|---| |角色|核心技能|搞笑口头禅|适合岗位| |TCP(强迫症小哥)|可靠交付、按序传输、拥塞控制|“漏了?我重送!乱了?我重排!堵了?我慢走!”|重要订单配送(网页、邮件、文件)| |UDP(急单侠)|速度快、开销小、支持多播|“要快?找我!怕丢?别找我!堵车?我超!”|急单配送(视频、直播、DNS)| |端口(外卖柜)|精准匹配应用|“80 号柜是网页的!53 号柜是 DNS 的!别放错!”|数据分拣员| |滑动窗口(装餐量)|控制发送速率|“你柜子满了?我等!你能装 5 份?我送 5 份!”|流量调节器| --- ## 本章彩蛋:用 “双十一快递” 理解运输层 - 你在淘宝买衣服(应用层),下单后淘宝把订单交给 “顺丰(TCP)”,顺丰会:①打电话确认你在不在家(建立连接);②丢件了重发(重传);③按订单顺序送(先送衣服,再送赠品)—— 这是 TCP 的可靠传输。 - 你在直播间抢秒杀(应用层),主播说 “3、2、1 上链接”,链接通过 “普通快递(UDP)” 发给你,可能有的没收到(丢包),但能最快收到 —— 这是 UDP 的速度优先。 - 要是没有端口,快递员可能把 “衣服订单” 送到 “外卖柜”,你永远找不到 —— 这是端口的重要性! # 第六章 应用层:互联网的 “搞笑生活服务站” ## 开场:从 “点外卖、刷抖音” 看懂应用层 应用层就是互联网的 “生活服务中心”——DNS 是 “地图查餐厅地址”,FTP 是 “网购退货传文件”,HTTP 是 “刷抖音看视频”,TELNET 是 “远程帮朋友修电脑”。接下来全是搞笑名场面,保证你边笑边懂 “平时用的网,到底是怎么工作的”! --- ## 6.1 域名系统 DNS:互联网的 “地图查地址” ### 6.1.1 DNS 的核心作用(搞笑梗版) - **搞笑梗版**:你想上 “淘宝”,但电脑只认识 “[140.205.94.119](http://140.205.94.119)” 这种 IP 地址(像餐厅的门牌号),不认识 “[www.taobao.com](https://www.taobao.com)”(像餐厅的名字)。DNS 就像 “高德地图”,你输入 “淘宝”(域名),它帮你查出对应的 “门牌号”(IP 地址),电脑才能找到淘宝服务器。要是没有 DNS,你上淘宝得记一长串数字,比记女朋友生日还难! - **专业版**:域名系统 DNS 是互联网的命名系统,用于将便于人类记忆的域名(如[www.baidu.com](https://www.baidu.com))转换为计算机识别的 IP 地址,实现主机的定位,是互联网通信的 “地址翻译官”。 ### 6.1.2 域名结构:“餐厅地址的层级”(搞笑表格) | | | | | | ---- | ------------------------------- | ------------------------------ | -------------------------------------------- | | 域名层级 | 搞笑梗解读(餐厅地址类比) | 专业定义 | 示例([www.taobao.com](https://www.taobao.com)) | | 顶级域名 | “餐厅所在城市”—— 比如 “北京”“上海”,区分大区域 | 域名的最高层级,分为国家顶级域名、通用顶级域名、基础结构域名 | .com(通用顶级域名,代表商业机构) | | 二级域名 | “餐厅所在区”—— 比如 “朝阳区”“静安区”,区分城市内区域 | 顶级域名下的第二层域名,由机构或个人申请,代表具体组织 | .taobao(二级域名,代表淘宝公司) | | 三级域名 | “餐厅名字”—— 比如 “海底捞”“西贝”,具体标识某个服务 | 二级域名下的子域名,用于区分组织内的不同服务 | www(三级域名,代表淘宝的万维网服务) | ### 6.1.3 顶级域名分类(搞笑表格) | | | | |---|---|---| |顶级域名类型|搞笑梗解读|示例| |国家顶级域名(nTLD/ccTLD)|“按国家分的餐厅区”—— 比如 “中国区餐厅”“美国区餐厅”|.cn(中国)、.us(美国)、.jp(日本)| |通用顶级域名(gTLD)|“按餐厅类型分”—— 比如 “商业餐厅”“教育餐厅”“政府餐厅”|.com(商业)、.edu(教育,比如北大.[edu.cn](https://edu.cn))、.gov(政府,比如中国政府.[gov.cn](https://gov.cn))、.org(非营利组织)| |基础结构域名(arpa)|“餐厅后台通道”—— 不对外营业,只给工作人员用,用于反向 DNS 解析(IP 查域名)|.arpa(仅用于技术用途,用户看不到)| ### 6.1.4 我国二级域名(搞笑版) - **搞笑梗版**:我国把二级域名分成 “按行业分”(类别域名)和 “按省份分”(行政区域名)—— 比如 “.[edu.cn](https://edu.cn)” 是 “教育行业的中国餐厅”(北大、清华),“.[bj.cn](https://bj.cn)” 是 “北京的中国餐厅”(北京本地网站),像 “按菜系和省份给餐厅分类,好找!” - **专业版**:我国二级域名分为类别域名(7 个,如.[edu.cn](https://edu.cn)教育、.[gov.cn](https://gov.cn)政府、.[com.cn](https://com.cn)商业)和行政区域名(34 个,对应 34 个省 / 自治区 / 直辖市,如.[bj.cn](https://bj.cn)北京、.[sh.cn](https://sh.cn)上海)。 --- ## 6.2 文件传送协议:互联网的 “快递传文件” ### 6.2.1 FTP:“顺丰级文件快递”(搞笑梗版) - **搞笑梗版**:FTP 是 “传大文件的顺丰”—— 你想给朋友传 10G 的电影,用微信传太慢(像送快递走路),用 FTP 传就像 “顺丰空运”:①先登录朋友的 FTP 服务器(像去快递网点寄件);②选文件类型(是文本还是视频,像选 “易碎品”“普通件”);③设置权限(能不能改文件,像 “能不能拆快递”);④开始传输,还能暂停、续传(像快递半路停了,下次接着送)。最牛的是,FTP 能屏蔽 “电脑系统差异”—— 你用 Windows,朋友用 Mac,传文件也不会乱码(像顺丰能送不同形状的快递,不用你自己打包)。 - **专业版**:文件传送协议 FTP 是互联网常用的文件传送协议,采用客户 - 服务器模式,使用 TCP 连接,支持交互式访问,可指定文件类型与格式,设置存取权限,屏蔽不同计算机系统的细节,适合异构网络间的文件传输。 ### 6.2.2 文件共享协议分类:“快递 vs 上门取件”(搞笑表格) | | | | | |---|---|---|---| |协议类型|搞笑梗解读(文件传送类比)|专业定义|代表协议| |文件传送协议|“快递传文件”—— 把文件复制一份,用 “快递” 寄给对方,对方改的是 “副本”,改完要再寄回来|复制整个文件,对副本进行访问,修改后需传回原节点|FTP、TFTP| |联机访问协议|“上门取件改文件”—— 对方直接访问你电脑里的文件,像 “朋友来你家直接改你电脑里的文档”,不用复制,改的是 “原文件”|允许同时存取一个文件,远地访问如同本地访问,由操作系统负责透明存取|NFS(网络文件系统)| ### 6.2.3 网络传文件的 “坑”(搞笑版) - **搞笑梗版**:不同电脑传文件,就像 “不同国家的人交换礼物”——①存储格式不同:你用 Windows 存的文件,朋友用 Mac 打开可能乱码(像你送 “筷子”,朋友用 “刀叉” 用不了);②目录结构不同:你电脑里 “D 盘 / 电影” 的文件,朋友电脑里没有 D 盘(像你说 “礼物在客厅抽屉”,朋友家没有客厅);③命令不同:你用 “复制” 命令,朋友用 “copy” 命令(像你说 “谢谢”,朋友说 “thank you”,互相听不懂);④权限不同:你能改文件,朋友只能看(像你能拆礼物,朋友只能看不能拆)。FTP 就是 “万能翻译官”,帮你填这些坑! - **专业版**:网络环境下复制文件的复杂性包括:①存储数据格式不同;②文件目录结构与命名规则不同;③操作系统命令不同;④访问控制方法不同。FTP 通过统一的协议规范解决这些问题。 ### 6.2.4 TFTP:“小文件的平邮快递”(搞笑表格) | | | | |---|---|---| |TFTP 特点|搞笑梗解读(平邮类比)|专业定义| |小而简单|“快递单只有一行字”—— 代码少,占内存小,像 “平邮的快递单只写地址,别的都不填”|协议简单,代码所占内存小,易于实现| |使用 UDP|“平邮不打电话”—— 用 UDP 传输,不用建立连接,像 “平邮直接扔邮箱,不确认收件人在不在”|使用客户 - 服务器模式和 UDP 数据报,需自己实现差错改正| |仅支持文件传输|“只送文件,不送别的”—— 不能列目录、不能改权限,像 “平邮只送包裹,不帮你查物流、改地址”|仅支持文件的读和写,不支持交互,无列目录、身份鉴别功能| |512 字节数据块|“每次送一小包”—— 每次传 512 字节,最后一次可能不足 512 字节,像 “平邮每次送一小盒,多了分几次送”|每次传送的数据报含 512 字节数据(最后一次可不足),数据报文按序编号| |支持 ASCII / 二进制|“能送文本,也能送视频”—— 像 “平邮能送信纸,也能送 U 盘”|支持 ASCII 码(文本)和二进制(视频、图片)两种传送方式| --- ## 6.3 远程终端协议 TELNET:“远程帮朋友修电脑” ### 6.3.1 TELNET 的核心作用(搞笑梗版) - **搞笑梗版**:TELNET 是 “远程控制的‘隔空取物’”—— 朋友电脑坏了,他不会修,你说 “我远程帮你弄”,打开 TELNET:①用 TCP 连接朋友的电脑(像 “你和朋友连了视频电话”);②你在自己电脑上敲键盘(像 “你指挥朋友按哪个键”);③朋友电脑的屏幕内容传到你这(像 “朋友把电脑屏幕对着摄像头给你看”)。最牛的是 “透明服务”—— 你感觉就像在操作自己的电脑,朋友感觉就像有人在他电脑前操作,像 “你灵魂出窍到朋友电脑前”! - **专业版**:远程终端协议 TELNET 是互联网正式标准,采用客户 - 服务器模式,使用 TCP 连接,允许用户通过本地主机登录到远地主机,将本地击键传送到远地主机,同时将远地主机的输出返回本地屏幕,提供透明的远程终端服务。 --- ## 6.4 万维网 WWW:“刷抖音、看网页的幕后推手” ### 6.4.1 WWW 的本质:“互联网的‘短视频 APP’”(搞笑版) - **搞笑梗版**:WWW 就是 “你每天刷的抖音、淘宝、百度的总和”—— 是一个 “大规模信息储藏所”,用 “链接” 把不同网站连起来(像你刷抖音时,从一个视频滑到另一个视频),你想找什么信息,点链接就能主动获取(像你刷到感兴趣的视频,点进去看更多),不用像 “看电视一样被动等内容”。 - **专业版**:万维网 WWW 是大规模联机信息储藏所,通过 “链接” 实现不同站点的访问,用户可主动按需获取信息,是分布式超媒体系统,基于超文本技术,信息分布在整个互联网,由各主机独立管理。 ### 6.4.2 超文本 vs 超媒体:“纯文字小说 vs 短视频”(搞笑表格) | | | | | | |---|---|---|---|---| |对比维度|搞笑梗解读|专业定义|超文本|超媒体| |内容形式|“纯文字小说”—— 只有文字,像 “你看的电子书只有字,没有图”|文档内容类型|仅包含文本信息|包含文本、图形、图像、声音、动画、视频等多媒体信息| |体验感|“看小说”—— 只能读文字,想象画面|用户体验|体验单一,依赖文字想象|体验丰富,多感官刺激| |代表例子|“纯文字网页”—— 比如早期的 “新闻网页只有文字,没有图”|实际应用|早期 WWW 文档、纯文本博客|现代网页(抖音、淘宝、百度)、短视频平台| ### 6.4.3 WWW 的 “四大难题” 与解决方案(搞笑表格) | | | | | |---|---|---|---| |难题|搞笑梗解读(像 “做短视频 APP 要解决的问题”)|解决方案|专业作用| |怎么标志 “每个视频的地址”?|你想分享一个抖音视频,得有个唯一链接(像 “视频编号”),不然别人找不到|统一资源定位符 URL|给每个万维网文档分配唯一标识符,实现资源定位| |怎么 “滑到下一个视频”?|你点视频里的 “下一个” 按钮,得有协议保证能顺利跳转,不然点了没反应|超文本传送协议 HTTP|定义浏览器与服务器的通信格式和规则,实现链接访问| |怎么 “让视频在不同手机上显示正常”?|你用苹果手机拍的视频,朋友用安卓手机看,得有统一格式,不然显示乱码|超文本标记语言 HTML|定义文档的显示格式,使不同主机都能正确显示文档,标识链接位置| |怎么 “找到想看的视频”?|你想找 “猫咪搞笑视频”,不能一个个翻,得有 “搜索功能”|搜索引擎|帮助用户快速查找所需信息,如百度、谷歌、抖音搜索| ### 6.4.4 URL:“视频的唯一链接”(搞笑版) - **搞笑梗版**:URL 就是 “抖音视频的链接”(比如[https://v.douyin.com/iF3xQ7a/](https://v.douyin.com/iF3xQ7a/)),相当于 “视频在互联网上的身份证号”—— 不管你在哪个城市、用什么手机,只要输入这个链接,就能找到对应的视频。URL 的格式像 “快递地址”:https(用什么方式送,像 “顺丰”)://[v.douyin.com](https://v.douyin.com)(送到哪个服务器,像 “北京快递网点”)/iF3xQ7a/(具体哪个视频,像 “网点里的 101 号包裹”)。 - **专业版**:统一资源定位符 URL 是万维网资源的唯一地址,格式为 “协议:// 主机名:端口号 / 路径 / 文件名”,用于标识资源的位置和访问方式,实现互联网范围内资源的精准定位。 ### 6.4.5 HTTP:“刷视频的‘传输通道’”(搞笑表格) | | | | |---|---|---| |HTTP 特点|搞笑梗解读(像 “短视频 APP 的传输规则”)|专业定义| |面向事务|“刷一个视频算一次‘事务’”—— 你点一个视频,服务器送过来,这次交互就结束,像 “你买一瓶水,付钱拿水,交易结束”|面向事务的应用层协议,一次请求对应一次响应,完成一个事务| |使用 TCP|“用‘顺丰’送视频”——TCP 可靠,保证视频不丢帧,像 “顺丰保证快递不丢,HTTP 保证视频不缺段”|使用 TCP 连接进行可靠传输,避免数据丢失或乱序| |定义通信规则|“规定‘你点视频’怎么说,‘服务器送视频’怎么回复”—— 你点视频时,浏览器发 “GET / 视频地址 HTTP/1.1”(像 “你说‘我要 101 号包裹’”),服务器回复 “200 OK”(像 “快递员说‘好的,给你’”)|定义浏览器与万维网服务器的通信格式(请求报文、响应报文)和规则| |无状态|“服务器不记得你”—— 你刷完一个视频再刷第二个,服务器不知道 “你刚才刷过哪个”,像 “快递员不记得你上次买过什么,每次都当新顾客”|无状态协议,服务器不保留客户的历史信息,简化服务器设计,支持大量并发请求| ### 6.4.6 HTTP 报文结构:“刷视频的‘对话记录’”(搞笑表格) | | | | | |---|---|---|---| |报文类型|组成部分|搞笑梗解读(像 “你和快递员的对话”)|专业定义| |请求报文(客户→服务器)|开始行|“你说‘我要 101 号包裹’”|包含请求方法(GET/POST)、URL、HTTP 版本,标识请求类型| ||首部行|“你说‘我要大瓶的,冰的’”|说明浏览器信息(如 User-Agent)、请求内容类型等,可选| ||实体主体|“一般不用,除非你要上传视频(POST 请求)”|请求携带的数据(如表单数据、文件),GET 请求一般无| |响应报文(服务器→客户)|开始行|“快递员说‘好的,给你(200 OK)’”|包含 HTTP 版本、状态码(200 成功、404 找不到)、状态描述| ||首部行|“快递员说‘这是冰的,别摔了’”|说明服务器信息(如 Server)、响应内容类型(如 text/html)等| ||实体主体|“快递员给你的‘101 号包裹’(视频 / 网页内容)”|服务器返回的资源内容(如 HTML 文档、视频数据)| ### 6.4.7 万维网文档分类:“静态视频 vs 动态视频”(搞笑表格) | 文档类型 | 搞笑梗解读 | 专业定义 | 例子 | | ---- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- | ---------------------------- | | 动态文档 | “直播带货的实时画面”—— 内容随时间 / 用户变化,比如你看直播时,画面里的 “库存数” 每秒都在变,每个人看到的库存可能不一样(你看剩 10 件,别人看剩 8 件),像 “直播画面实时生成,不是预先录好的” | 内容由服务器实时生成,根据用户请求或时间动态变化,每次访问内容可能不同 | 电商商品页(实时库存、价格)、天气预报页(实时更新温度) | | 活动文档 | “能互动的短视频”—— 文档里有 “小动画” 或 “交互按钮”,比如你点网页里的 “抽奖按钮”,会弹出抽奖结果,不用等服务器重新发内容,像 “你在视频里点‘暂停’‘快进’,不用重新加载整个视频” | 包含可在客户端执行的代码(如 JavaScript),客户端可直接交互,无需频繁请求服务器 | 网页小游戏(如在线拼图)、带交互按钮的表单页 | ### 6.4.8 搜索引擎:“互联网的‘找货向导’”(搞笑表格) | | | | | |---|---|---|---| |搜索引擎类型|搞笑梗解读(像 “找餐厅的方式”)|专业定义|例子| |全文检索搜索引擎|“按菜名找餐厅”—— 你输入 “北京烤鸭”,它会在所有餐厅的 “菜单”(网页内容)里搜,把包含 “北京烤鸭” 的餐厅都列出来,像 “百度、谷歌”,搜得全但可能有垃圾结果|抓取互联网大量网页,建立全文索引,根据关键词在网页内容中匹配,返回相关结果|百度、谷歌、必应| |分类目录搜索引擎|“按菜系找餐厅”—— 它把餐厅分成 “川菜”“粤菜”“东北菜” 等目录,你点 “川菜”→“北京”,就能找到北京的川菜馆,像 “逛商场按楼层找店”,结果准但不够全|由人工编辑将网站按主题分类,形成层级目录,用户通过浏览目录查找相关网站,不依赖关键词|早期的雅虎、新浪分类目录| --- ## 6.5 电子邮件:“互联网的‘纸质信件’” ### 6.5.1 电子邮件的核心协议:“寄信 vs 收信”(搞笑表格) | | | | | |---|---|---|---| |协议|作用|搞笑梗解读(像 “寄信流程”)|专业定义| |SMTP(简单邮件传送协议)|“寄信到邮局”—— 把你写的邮件从你的邮箱 “送到对方的邮箱服务器”,像 “你把信投进邮筒,邮局把信送到对方城市的邮局”|用于发送邮件,实现从发件人邮箱客户端到收件人邮箱服务器的传输,使用 TCP 连接|| |POP3(邮局协议版本 3)|“从邮局取信”—— 你从对方的邮箱服务器 “把邮件下载到自己的电脑”,像 “对方去邮局把你寄的信取回家”|用于接收邮件,实现从收件人邮箱服务器到收件人邮箱客户端的传输,支持离线阅读|| - **搞笑补充**:比如你用 QQ 邮箱给朋友的网易邮箱发邮件:①你点 “发送”,SMTP 协议把邮件从你的 QQ 邮箱客户端送到 “网易邮箱服务器”(像你把信从家投到邮筒,邮局送到朋友城市的邮局);②朋友打开网易邮箱,POP3 协议把邮件从 “网易邮箱服务器” 下载到他的电脑(像朋友去邮局取信回家)。要是没有这两个协议,邮件就像 “写好的信没地方投,或者投了对方取不到”! --- ## 6.6 动态主机配置协议 DHCP:“互联网的‘自动分配 IP 地址’” ### 6.6.1 DHCP 的核心作用:“自动发‘门牌号’”(搞笑梗版) - **搞笑梗版**:你家小区新搬来一户人家(新设备连网),要是每次都要物业上门给 “门牌号”(IP 地址),太麻烦!DHCP 就像 “小区自动门牌号分配机”—— 新设备一连 WiFi(连网),就给 DHCP 服务器发消息:“我要个门牌号!” 服务器马上分配 “IP 地址、子网掩码、默认路由器、DNS 服务器” 这四个 “必备信息”,像 “分配机给新住户发‘1 单元 301 号’(IP)、‘小区大门密码’(子网掩码)、‘小区物业电话’(默认路由器)、‘地图 APP 地址’(DNS)”,不用人工操作,超方便! - **专业版**:动态主机配置协议 DHCP 用于自动为网络中的新设备分配 IP 地址及相关网络参数(子网掩码、默认路由器 IP、DNS 服务器 IP),采用客户 - 服务器模式,使用 UDP 协议,避免人工配置的繁琐,提高网络管理效率。 ### 6.6.2 DHCP 需要配置的 “四件套”(搞笑表格) | | | | |---|---|---| |配置项目|搞笑梗解读(像 “新住户的‘必备信息’”)|专业作用| |IP 地址|“门牌号”—— 新设备在网络中的唯一标识,像 “1 单元 301 号”,别人能找到它|标识设备在互联网中的位置,实现分组的路由和转发| |子网掩码|“小区大门密码”—— 区分 “本小区住户” 和 “外小区住户”,像 “只有知道密码的才能进小区”|区分 IP 地址中的网络前缀和主机号,判断目的主机是否在同一子网| |默认路由器 IP|“小区物业电话”—— 设备要给 “外小区住户” 发数据(跨子网通信),就找默认路由器,像 “有问题找物业”|跨子网通信时的默认转发设备,将分组转发到其他子网| |DNS 服务器 IP|“地图 APP 地址”—— 设备要查 “域名对应的 IP”(比如查 “淘宝” 的 IP),就找 DNS 服务器,像 “找地方用地图 APP”|提供域名到 IP 地址的解析服务,实现域名访问| ### 6.6.3 DHCP 的 “专属端口”(搞笑版) - **搞笑梗版**:DHCP 客户(新设备)和服务器(分配机)用 “专属电话” 沟通 —— 客户用 68 号端口(像 “新住户的临时电话”),服务器用 67 号端口(像 “分配机的固定电话”)。要是用别的端口,可能会和 “微信、浏览器” 的端口冲突,像 “新住户打错电话,打到别人家去了”,分配不了 IP 地址! - **专业版**:DHCP 客户使用 UDP 的 68 号端口发送请求,DHCP 服务器使用 UDP 的 67 号端口接收请求并发送响应,固定端口号避免与其他应用的端口冲突,确保通信正常。 ### 6.6.4 DHCP 中继代理:“小区的‘代收快递点’”(搞笑梗版) - **搞笑梗版**:要是每个小区都装一个 “IP 分配机”(DHCP 服务器),太浪费钱!DHCP 中继代理就像 “小区的代收快递点”—— 每个小区装一个中继代理,它知道 “总分配机”(总 DHCP 服务器)的地址。新设备发 “要 IP” 的请求,中继代理先收下,再转发给总分配机,总分配机分配好 IP 后,再通过中继代理传给新设备,像 “新住户把‘要门牌号’的申请交给代收点,代收点转给总物业,总物业批了再转回来”,不用每个小区都装总分配机! - **专业版**:DHCP 中继代理用于解决 “无需每个子网都部署 DHCP 服务器” 的问题,每个子网部署一个中继代理,中继代理配置总 DHCP 服务器的 IP 地址,接收子网内客户的 DHCP 请求,转发给总 DHCP 服务器,再将服务器的响应转发给客户,减少 DHCP 服务器的数量,降低网络成本。 --- ## 第六章 总结:应用层的 “生活服务清单” | | | | | |---|---|---|---| |协议 / 系统|核心作用|搞笑 “生活别名”|一句话总结| |DNS|域名转 IP|“地图查地址”|帮你把 “淘宝” 翻译成电脑能懂的 “IP 地址”,不然记数字记到疯| |FTP/TFTP|文件传送|“顺丰 / 平邮传文件”|传大文件用 FTP(顺丰),传小文件用 TFTP(平邮),各有各的用| |TELNET|远程终端|“远程修电脑”|隔着屏幕操作别人的电脑,像 “灵魂出窍帮人修 bug”| |WWW(HTTP/HTML/URL)|网页访问|“刷抖音 / 淘宝”|HTTP 是 “传输通道”,HTML 是 “显示格式”,URL 是 “视频链接”,三者一起让你刷网无忧| |电子邮件(SMTP/POP3)|发送 / 接收邮件|“互联网寄信”|SMTP 帮你 “寄信到邮局”,POP3 帮你 “从邮局取信”,比纸质信快 100 倍| |DHCP|自动分配 IP|“自动发门牌号”|新设备连网不用手动输 IP,DHCP 自动分配,像 “小区给新住户自动发门牌号”| --- ## 本章彩蛋:用 “一天的生活” 串起应用层 - 早上起来刷抖音:用**HTTP**协议传视频,**URL**定位具体视频,**HTML**显示画面,**DNS**把 “[douyin.com](https://douyin.com)” 转成 IP 地址; - 给同事发邮件:用**SMTP**协议发送,同事用**POP3**协议接收; - 传工作文件给领导:用**FTP**协议传大文件,怕麻烦就用微信(底层也用应用层协议); - 新电脑连 WiFi:**DHCP**自动分配 IP 地址,不用手动输; - 远程帮家里修电脑:用**TELNET**(或类似远程工具)远程控制 —— 你一天的上网生活,全是应用层在 “背后干活”!

万字超详细(宝宝级)计算机网络期末(幽默版)上

### 一、计算机网络在信息时代的作用 #### 1. 三大类网络 - **梗版**:电信网络是 “爷爷辈”—— 主打打电话,现在除了爸妈辈用,年轻人都靠它开流量;有线电视网络是 “叔叔辈”—— 以前全家围看电视靠它,现在连我奶都知道用手机投屏;计算机网络是 “卷王小辈”—— 把前俩的活全抢了,还加了办公、打游戏、刷短视频,现在没它,大学生活直接 “断网式瘫痪”,核心地位稳得一批! - **专业版**:三大类网络分别是电信网络、有线电视网络、计算机网络。电信网络以语音通信为核心,有线电视网络侧重视频广播传输,计算机网络则融合数据、语音、视频等多种服务,发展速度最快,已成为信息时代的核心基础设施,支撑各类互联网应用。 #### 2. Internet 译名 - **梗版**:就跟 “土豆” 和 “马铃薯” 似的,俩名字都对!你跟同学说 “连互联网”,跟老师说 “访问因特网”,都没人说你错,主打一个 “灵活百搭”。 - **专业版**:Internet 的标准译名有两个,分别是 “因特网” 和 “互联网”,二者内涵完全一致,均指全球范围内相互连接的计算机网络集合 #### 3. 互连网 vs 互联网(核心对比表) |对比维度|梗版解读|专业定义| |---|---|---| |范围大小|宿舍限定网,小得像食堂小份菜|局部范围的网络互连,覆盖有限| |服务对象|仅限特定人群(如宿舍室友)|特定区域内的用户或设备| |典型场景|宿舍 4 台电脑连网开黑、传资料|企业内网、校园楼栋局域网| |与互联网关系|是互联网的 “小零件”|互联网是由多个互连网| #### 4. 互联网的两大重要基本特点 - **梗版**:连通性 = 网络界 “微信视频”,你在宿舍追剧,闺蜜在老家旅游,秒发消息吐槽剧情,比寄明信片快 10086 倍,还不用花邮费;共享 =“宿舍共产主义”,你的会员我的会员,大家一起用(合法版),你的打印机我的资料,互相蹭着来,主打一个 “不浪费”。 - **专业版**:互联网的两大基本特点是连通性和共享性。连通性指互联网能让地理上相距遥远的上网用户,便捷且经济地交换各类信息;共享性即资源共享,具体包括信息共享、软件共享和硬件共享,提升资源利用效率。 ### 二、互联网概述 #### 1. 计算机网络 - **梗版**:就是 “电脑版闺蜜团”!若干台电脑、路由器这些 “小伙伴”(节点),用网线、无线这些 “纽带”(链路)连起来,就能互相唠嗑、传东西,小团体就成型了。 - **专业版**:计算机网络由若干节点和连接这些节点的链路组成。网络中的节点可以是计算机、集线器、交换机或路由器,链路是节点间的通信介质,共同构成数据传输的基础架构。 #### 2. internet 和 Internet 区别(表格对比) |特征|梗版解读|专业定义| |---|---|---| |大小写|小写 = 随便建的小群(如宿舍文件群)|小写 internet:通用名词,泛指多网络互连的集合| ||大写 = 微信总群(全球通用)|大写 Internet:专用名词,全球最大开放特定互连网| |核心规则|小群无规矩,大写群守 “TCP/IP” 群规|小写无强制协议,大写必须遵循 TCP/IP 协议族| |前身背景|大写群创始人是美国 “ARPANET”(军方出身)|大写 Internet 前身是美国 ARPANET,后向公众开放| |使用场景|小群 = 局部用(宿舍、公司内部),大写 = 全球用|小写服务局部用户,大写服务全球用户| #### 3. ISP 分类及作用(表格呈现) |ISP 类型|梗版解读|专业作用|典型代表| |---|---|---|---| |主干 ISP|全国总仓,管跨省市 “运输”|负责骨干网络跨区域数据传输|中国电信骨干网| |地区 ISP|城市分仓,覆盖单个省市|覆盖特定省份 / 城市,连接主干 ISP 与本地 ISP|各省电信分公司| |本地 ISP|小区配送点,直接拉网到宿舍|服务社区、校园等局部用户,提供接入服务|校园网运营商、小区宽带服务商| #### 4. 互联网交换点 IXP 主要作用 - **梗版**:相当于网络界 “同城快递中转站”!本来两个网络通信得绕远路,比如北京的网和上海的网要经过广州中转,IXP 说 “别绕了,直接在我这交接”,省时间还不堵车,效率直接拉满。 - **专业版**:IXP(互联网交换点)的核心作用是允许两个网络直接相连并交换分组,无需通过第三个网络转发,从而减少传输时延、降低带宽成本,提升网络互通效率。 ### 三、互联网的组成 #### 1. 互联网的两大组成部分(表格对比) |组成部分|梗版解读|专业定义|核心设备 / 主体| |---|---|---|---| |边缘部分|打工人集合(电脑、手机),直接干活(刷视频、赶 due)|所有连接互联网的主机组成,用户直接使用|个人电脑、手机、服务器终端| |核心部分|快递员 + 公路(路由器 + 网络),负责传消息|大量网络 + 路由器组成,提供连通性和分组转发|路由器、骨干网络、交换机| #### 2. 端系统的两种通信方式(表格详解) | 通信方式 | 梗版解读 | 专业定义 | 核心特征 | | ------ | ------------------------------------ | ------------------------------- | ----------------------- | | C/S 方式 | 客户 = 舔狗,主动求服务器(高冷女神)给资源;女神不用记舔狗,有硬实力 | 客户是请求方,服务器是提供方;客户主动发起请求,服务器被动响应 | 客户需知服务器地址;服务器持续运行,支持多客户 | | P2P 方式 | 饭搭子互撩,你传我电影,我发你资料,平等互助 | 不区分服务方 / 请求方,节点既请求也提供服务 | 节点地位平等,无需中心服务器,拓扑灵活 | #### 3. 分组交换与存储转发技术 - **梗版**:你要发一个大文件(报文),就像要寄一整箱零食,路由器嫌麻烦,直接拆成小包装(分组),每个小包装都贴个地址标签(首部),然后挨个送,到目的地再拼起来,又快又不容易丢。 - **专业版**:分组交换采用存储转发技术,将需要发送的整块数据(报文)划分为若干个分组(又称包),每个分组前添加必要的控制信息(首部 / 包头)。路由器接收分组后先存储,再根据首部信息查找转发表,转发至下一个节点,最终将所有分组送达目的地并重组为报文。 #### 4. 三种交换方式的核心区别(表格对比) |交换方式|梗版解读|专业特征|适用场景| |---|---|---|---| |电路交换|打出租车,专属路线,别人不能插|建立专用链路,报文连续传输,独占带宽|语音通话、实时视频(需稳定带宽)| |报文交换|寄整箱快递,等全到了再转发,慢如蜗牛|整报文存储后转发,无专用链路,时延大|早期数据传输(已基本淘汰)| |分组交换|拼车送小件,随到随发,效率高|分组存储转发,动态占用链路,时延小|互联网数据传输(网页、邮件、文件)| ### 四、计算机网络的类别 #### 1. 按作用范围分类(表格呈现) |网络类型|梗版解读|专业范围|典型场景| |---|---|---|---| |广域网(WAN)|全国旅游圈,几十到几千公里|几十至几千公里,又称远程网|北京连新疆的网络、跨国网络| |城域网(MAN)|城市逛街圈,5-50km|覆盖单个城市,5-50km|上海浦东连浦西的网络| |局域网(LAN)|小区遛弯圈,1km 内|1km 左右,局部区域覆盖|宿舍网、校园网、企业内网| |个人区域网(PAN)|床头伸手圈,10m 内|10m 左右,个人设备互连|手机连蓝牙耳机、电脑连蓝牙鼠标| #### 2. 按使用者分类(表格对比) |网络类型|梗版解读|专业定义|访问权限| |---|---|---|---| |公用网|公共公园,谁办宽带谁能用|面向公众开放,运营商建设运营|付费即可使用,无特定限制| |专用网|私人别墅,仅限特定人用|仅限特定群体使用,具保密性|需授权访问(如企业员工、校园师生)| #### 3. 接入网 AN - **梗版**:“小区门口的保安亭”,既不是核心(小区里的主干道),也不是边缘(你家),但你得经过它才能进小区(连互联网),是本地 ISP 的网络。 - **专业版**:接入网 AN(本地接入网或居民接入网)是本地 ISP 所拥有的网络,用于将用户终端接入互联网,既不属于互联网的核心部分,也不属于边缘部分,是连接用户与互联网的中间环节。 --- ### 五、计算机网络的性能 #### 1. 核心性能指标(表格详解) |性能指标|梗版解读|专业定义|单位| |---|---|---|---| |速率|网速 = 水管粗细,越粗水流越快|数据传送速率(比特率),反映传输快慢|bit/s| |带宽|水管容量,决定同时过多少水|网络信道传送数据的能力,与速率正相关|bit/s(网络中)、赫兹(本义)| |吞吐量|实际流过的水量,可能比水管容量小|单位时间内实际传输的数据量|bit/s、Byte/s| |时延|数据赶路时间 = 打包 + 路上 + 扫码 + 排队|数据从一端到另一端的时间,含 4 种时延|秒(s)、毫秒(ms)| |往返时间(RTT)|发消息 + 收到回复的总时间,像打电话 “喂 + 听到回应”|数据发送到接收确认的总时间|秒(s)、毫秒(ms)| |利用率|网络忙不忙,太忙就堵车|信道 / 网络的占用比例(加权平均值)|百分比(%)| #### 2. 时延的四大组成部分(表格拆解) |时延类型|梗版解读|专业定义|影响因素| |---|---|---|---| |发送时延|打包时间,手机把消息变成数据帧|主机 / 路由器发送数据帧的时间|数据量大小、发送速率| |传播时延|路上跑的时间,数据在网线里飞|电磁波在信道中传播的时间|信道长度、电磁波传播速度| |处理时延|快递扫码时间,路由器处理数据|主机 / 路由器接收分组后的处理时间|设备性能、分组复杂度| |排队时延|快递站排队时间,数据等处理|分组在路由器输入队列的等待时间|网络拥堵程度、队列长度| --- ### 六、计算机网络的体系结构 #### 1. 网络协议的三要素(表格呈现) | 三要素 | 梗版解读 | 专业定义 | 通俗示例 | | --- | ------------------ | ------------ | ------------------- | | 语法 | 说话的格式,比如 “主谓宾” | 数据格式、信号电平等规则 | 分组的首部格式、接口引脚定义 | | 语义 | 说话的意思,比如 “吃饭” 是要干饭 | 数据含义、控制信息的解释 | 高电平代表 “1”、低电平代表 “0” | | 同步 | 说话的顺序,比如 “先问好再聊天” | 事件发生的时序关系 | 发送方先传同步信号,再传数据 | #### 2. 五层协议的体系结构(表格详解) |层级|梗版解读|专业功能|核心协议 / 设备| |---|---|---|---| |应用层|前台接待,对接用户需求(刷网页、发邮件)|定义应用进程交互规则,完成特定网络应用|HTTP(网页)、DNS(域名)、SMTP(邮件)| |运输层|中台调度,帮进程 “牵线搭桥”|提供主机间进程通信服务|TCP(可靠)、UDP(高效)| |网络层|物流规划,找最优传输路线|为不同主机提供分组转发服务|路由器、IP 协议| |数据链路层|快递分拣,处理相邻节点通信|负责相邻节点间的帧传输|交换机、网卡| |物理层|基建包工头,铺网线、搞接口|处理物理| ### 开场:物理层 —— 互联网的 “基建包工头” 物理层可不是 “高冷技术宅”,它更像个 “装修队长”,管着网线接头、电信号这些 “基建活”!接下来每个知识点,先给你用生活梗唠明白,再上专业定义,关键信息用表格梳理,保证你看得不单调、记得牢! --- ### 2.1 物理层的基本概念 #### 2.1.1 物理层的四大接口特性(表格对比) | | | | | |---|---|---|---| |特性类型|梗版解读|专业定义|通俗示例| |机械特性|接头的 “颜值 & 身材标准”—— 形状、尺寸得统一,不然插不进去!就像安卓充电头不能插苹果口|指明接口所用接线器的形状和尺寸|RJ45 网线接头的 8 针结构、USB-C 接口的外形| |电气特性|电信号的 “电压规矩”—— 不能超范围,不然就 “跳闸”!好比电器不能用 380V 工业电|指明在接口电缆的各条线上出现的电压和范围|双绞线传输电压 ±5V,超过可能损坏设备| |功能特性|电压的 “暗号”—— 高电平 =“1”,低电平 =“0”,就像点头 = 同意、摇头 = 拒绝|指明某条线上出现的某一电平的电压的意义|RJ45 的 1/2 针负责传数据,3/6 针负责收数据| |过程特性|做事的 “先后顺序”—— 先确认线路通不通,再传数据!像快递发货前先查地址对不对|指明对于不同功能的各种可能事件的出现顺序|发送方先传同步信号,确认接收方就绪后再传数据| --- ### 2.2 数据通信的基础知识 #### 2.2.1 通信系统的三大组成部分 - **梗版**:源系统 =“寄快递的你”,负责打包消息(比如发微信);传输系统 =“快递运输网络”(网线、信号塔);目的系统 =“收快递的同学”,负责接收消息。 - **专业版**:一个通信系统分为源系统(发送端、发送方)、传输系统(传输网络)和目的系统(接收端、接收方),三者协同完成消息的传送。 #### 2.2.2 消息、数据、信号的关系(表格拆解) | | | | | | --- | ------------------------- | -------------- | ---------------------------- | | 概念 | 梗版解读 | 专业定义 | 举例 | | 消息 | 你想传递的 “干货”—— 吐槽、知识点、八卦 | 通信的目的,是需要传递的内容 | 语音、文字、图像、视频 | | 数据 | 消息的 “打包形态”—— 把八卦变成二进制代码 | 运送消息的实体 | 二进制数 0101、字符 “A” 对应的 ASCII 码 | | 信号 | 数据的 “快递包装”—— 电信号、电磁波,方便传输 | 数据的电气或电磁表现 | 网线里的电压变化、手机发出的无线电波 | #### 2.2.3 模拟信号 vs 数字信号 - **梗版**:模拟信号 =“连续的波浪”—— 比如老式收音机的信号,平滑无断点;数字信号 =“蹦跳的台阶”—— 只有 0 和 1 两种状态,像打字机敲出来的字符,离散不连续。码元就是数字信号里 “最小的台阶单位”。 - **专业版**:模拟信号又称连续信号,波形连续变化;数字信号又称离散信号,仅取有限个离散值,代表不同离散数值的基本波形称为码元。 #### 2.2.4 信道的三种通信方式(表格对比) | | | | | | ----------- | --------------------------------------- | --------------------------- | ---------------- | | 通信方式 | 梗版解读 | 专业定义 | 典型场景 | | 单向通信(单工) | “广播式聊天”—— 只有一方说,另一方听,插不上话!像老师讲课、电视直播 | 只能有一个方向的通信,无反向交互 | 无线电广播、有线电广播、电视广播 | | 双向交替通信(半双工) | “对讲机模式”—— 你说的时候我不能说,我说完你才能说,主打一个 “轮流发言” | 通信双方均可发送信息,但不能同时发送(也不能同时接收) | 对讲机通话、早期对讲机式电话 | | 双向同时通信(全双工) | “微信聊天模式”—— 你发消息的同时,我也能发,互不耽误 | 通信双方可同时发送和接收信息 | 微信聊天、手机通话、视频会议 | #### 2.2.5 调制的两种类型(表格详解) | | | | | | -------- | ---------------------------------- | ------------------------------ | -------------- | | 调制类型 | 梗版解读 | 专业定义 | 核心特点 | | 基带调制(编码) | 给数字信号 “换件衣服”—— 还是数字信号,但波形变了,适配信道 | 仅对基带信号波形调整,将数字信号转为另一种数字信号,又称编码 | 不改变信号频率,适配数字信道 | | 带通调制 | 给数字信号 “搭火箭”—— 变成模拟信号,送到高频段传输,适合长距离 | 使用载波调制,将基带信号频率搬移到高频段,转为模拟信号 | 适配模拟信道,传输距离更远 | #### 2.2.6 常用编码方式(表格对比) | | | | | |---|---|---|---| |编码方式|梗版解读|专业规则|特点| |不归零制|“持续亮灯”—— 正电平一直亮代表 1,负电平一直亮代表 0,简单粗暴|正电平代表 1,负电平代表 0|容易同步,但无时钟信号,易出错| |归零制|“闪烁亮灯”—— 正脉冲闪一下代表 1,负脉冲闪一下代表 0,闪完就归零|正脉冲代表 1,负脉冲代表 0|有时钟提示,但带宽利用率低| |曼彻斯特编码|“中间跳一下”—— 位周期中心向上跳 = 0,向下跳 = 1(可反过来),像跳广场舞换动作|位周期中心的跳变代表逻辑值,向上跳变 = 0,向下跳变 = 1(或反之)|自带时钟,同步性好,带宽利用率中等| |差分曼彻斯特编码|“中间必跳,开头选跳”—— 每一位中心都跳,开头跳 = 0,不跳 = 1,规矩更多|位中心始终跳变,位开始边界跳变 = 0,不跳变 = 1|抗干扰性强,同步更稳定,但实现复杂| #### 2.2.7 基本带通调制方法(表格呈现) | | | | | |---|---|---|---| |调制方法|梗版解读|专业原理|通俗理解| |调幅(AM)|载波的 “音量” 随数据变 ——1 = 大声,0 = 小声|载波的振幅随基带数字信号变化|老式调幅收音机,信号强 = 声音大| |调频(FM)|载波的 “音调” 随数据变 ——1 = 高音,0 = 低音|载波的频率随基带数字信号变化|调频收音机,不同电台对应不同频率| |调相(PM)|载波的 “相位” 随数据变 ——1 = 左转,0 = 右转|载波的初始相位随基带数字信号变化|卫星通信常用,抗干扰性比调幅、调频强| #### 2.2.8 码间串扰 - **梗版**:就像你在拥挤的地铁里走路,前后的人挤在一起,分不清谁是谁!数据传输时,前后码元的波形叠在一起,接收端认不出哪个是哪个。 - **专业版**:码间串扰是指接收端收到的信号波形失去码元之间的清晰界限,导致无法准确识别码元。 #### 2.2.9 奈氏准则 - **梗版**:信道就像 “高速公路”,带宽 W 是 “车道数”,最多只能跑 2W 辆车(码元)/ 秒!超了就堵车(码间串扰),根本分不清谁是谁。 - **专业版**:在带宽为 W (Hz) 的低通信道中,不考虑噪声影响时,码元传输的最高速率为 2W(码元 / 秒)。超过此上限会出现严重码间串扰,导致接收端无法判决码元。 #### 2.2.10 信噪比 - **梗版**:信噪比 =“信号音量 ÷ 噪音音量”,单位是分贝(dB)。比如信号比噪音大 10 倍,就是 10dB;大 1000 倍,就是 30dB。信噪比越高,听得越清楚! - **专业版**:信噪比是信号平均功率与噪声平均功率之比,记为 S/N,度量单位为分贝(dB)。示例:S/N=10 时信噪比为 10dB,S/N=1000 时为 30dB。 #### 2.2.11 香农公式 - **梗版**:信道的 “最大传输速度”(极限信息传输速率 C),取决于两个因素 ——“车道宽度”(带宽)和 “路况好坏”(信噪比)。车道越宽、路况越好,车跑得越快! - **专业版**:信道的极限信息传输速率 C=W log₂(1+S/N)(W 为信道带宽,S/N 为信噪比)。公式表明,信道带宽或信噪比越大,极限传输速率越高。 --- ### 2.3 物理层下面的传输媒体 #### 2.3.1 传输媒体的两大分类(表格对比) | | | | | | -------- | ------------------------------- | -------------------- | ------------ | | 分类 | 梗版解读 | 专业定义 | 典型示例 | | 导引型传输媒体 | “有线通道”—— 数据沿着导线跑,不会跑偏!像走在有护栏的马路 | 有物理导引的传输媒体,数据沿导引体传输 | 双绞线、同轴电缆、光纤 | | 非导引型传输媒体 | “无线通道”—— 数据靠电磁波传播,无拘无束!像鸟儿在空中飞 | 无物理导引的传输媒体,数据通过电磁波传播 | 无线电波、红外线、可见光 | ### 2.4 信道复用技术 #### 2.4.1 波分复用 - **梗版**:就是 “光的频分复用”!把不同颜色的光(不同频率)塞进一根光纤里传输,相当于一根光纤变成 “多车道高速”,互不干扰,大大提高带宽。 - **专业版**:波分复用(WDM)是光通信中的频分复用技术,将不同频率的光信号复用到同一根光纤中传输,实现信道资源共享。 #### 2.4.2 码分复用(CDMA) - **梗版**:相当于 “多人在同一房间聊天”,每个人说不同的 “暗号语言”(唯一码片序列),虽然都在说话,但只有懂你暗号的人能听懂!码片序列就是每个人的 “专属暗号”。 - **专业版**:码分复用是共享信道的方法,码分多址(CDMA)指码分复用信道为多个不同地址用户共享。每个站被指派唯一的 m bit 码片序列,通过码片序列的正交关系实现信号分离。 #### 2.4.3 码片序列的正交关系(表格总结) | | | | | ------ | ----------------------------------- | ------------------- | | 正交关系 | 梗版解读 | 专业规则 | | 不同码片序列 | 你的暗号和别人的暗号完全不搭边,互相听不懂 | 向量 S 和 T 的规格化内积 = 0 | | 自身码片序列 | 你听自己的暗号,一听就懂 | 码片向量和自身的规格化内积 = 1 | | 自身反码序列 | 你听自己暗号的 “反向版”(1 变 - 1,-1 变 1),完全听不懂 | 码片向量和反码向量的规格化内积 =-1 | ### 开场:从 “共享网线” 到 “智能分流” 数据链路层就像 “局域网管理员”,既要管大家怎么共享一根网线不打架(CSMA/CD 协议),又要解决 “网线不够长” 的问题(扩展以太网)。接下来每个知识点,先给你用段子唠明白,再上专业定义,关键信息用表格总结,保证你一看就懂、一记就牢! --- ### 3. 使用广播信道的数据链路层 #### 3.1 局域网特点 - **梗版**:局域网是 “公司 / 学校专属 WiFi”,范围小(比如一栋楼)、设备少(几十上百台),而且归一个单位管,不像互联网 “谁都能连”,主打一个 “小而精”。 - **专业版**:局域网由一个单位拥有,地理范围和站点数目均有限,是封闭性的通信网络,主要用于单位内部设备的互联互通。 #### 3.2 局域网的优点(表格对比) | | | | |---|---|---| |优点|梗版解读|专业定义| |广播功能 + 资源共享|相当于 “公司群里发通知”,所有人都能看到;还能共用打印机、服务器,不用每人买一台,省钱又方便|具有广播功能,一个站点可访问全网;主机可共享局域网上的硬件(如打印机)和软件资源| |易扩展 + 灵活调整|新增电脑直接插网线就能连,工位搬了也能重新布线,不像盖房子 “一动就塌”|便于系统扩展和演变,设备位置可灵活调整和改变,网络拓扑适应性强| |高可靠性 + 生存性|就算某台电脑坏了,其他人照样能上网,不会 “一损俱损”,比 “一根网线连所有” 靠谱|提高了系统的可靠性、可用性和生存性,单个设备故障不影响整个网络运行| #### 3.3 共享信道的两种方法(表格详解) | | | | | |---|---|---|---| |方法分类|具体方式|梗版解读|专业定义| |静态划分信道|频分复用、时分复用、波分复用、码分复用|“分蛋糕” 模式 —— 把信道分成固定 “小块”,每人一块,不管用不用都占着,像公司工位 “固定分配”|将信道资源预先划分为多个固定的子信道,每个用户独占一个子信道,适用于用户业务量稳定的场景| |动态媒体接入控制(多点接入)|随机接入|“抢红包” 模式 —— 大家都能随机发数据,谁抢到信道谁用,但可能 “抢打架”(碰撞)|所有用户可随机发送信息,无需预先分配信道,可能发生数据碰撞,需碰撞解决机制| ||受控接入|“排队打饭” 模式 —— 得听 “管理员” 指挥,按顺序发数据,不会打架,但效率可能低|用户不能随机发送信息,需服从控制规则(如轮询、令牌传递),避免碰撞,适用于对实时性要求高的场景| #### 3.4 适配器(网卡) - **梗版**:适配器就是 “电脑的网线接口翻译官”!电脑想连局域网,得靠它把电脑里的 “数字信号” 翻译成 “网线能传的信号”,没有它,电脑就是 “没插网线的板砖”,连不上局域网。 - **专业版**:计算机与外界局域网的连接通过适配器(又称网卡)实现,适配器是计算机与局域网之间的物理接口,负责将计算机的数字信号转换为适合传输媒体的信号,实现数据的发送和接收。 #### 3.5 CSMA/CD 协议要点(表格拆解) | | | | | | ---- | ------------------------------------------------------ | ----------------------------------------- | ------------------------------------ | | 协议核心 | 梗版解读 | 专业定义 | 关键操作 | | 多点接入 | 大家都连在一根 “共享网线” 上,像 “一群人共用一个话筒” | 总线型网络拓扑,许多计算机以多点接入方式连接在一根总线上,共享信道资源 | 所有站点通过总线连接,共享同一传输介质 | | 载波监听 | “说话前先听,说话时也听”—— 发数据前先看网线有没有人用,发的时候也盯着,一旦有人抢就停 | 不管发送前还是发送中,每个站都必须不停地检测信道,判断是否有其他站点在发送数据 | 发送前检测信道是否空闲;发送中持续检测信道,判断是否发生碰撞 | | 碰撞检测 | “听着不对就停”—— 发数据时如果听到 “杂音”(电压波动),就知道有人和自己抢,赶紧停,避免 “越吵越乱” | 适配器边发送数据边检测信道信号电压变化,电压摆动值超门限值时,判定发生碰撞(冲突) | 检测到碰撞后,立即停止发送数据,并发送干扰信号通知其他站点,避免碰撞加剧 | | 通信方式 | “不能同时说和听”—— 就像对讲机,你说的时候不能听,听的时候不能说,是 “半双工” 模式 | 一个站不能同时发送和接收数据,必须采用双向交替通信(半双工通信) | 半双工通信,发送与接收不能同时进行,需交替进行 | #### 3.6 集线器 - **梗版**:集线器是 “星形拓扑的中心接线板”!以前总线网是 “一根网线串所有”,现在星形网把所有电脑都连到集线器上,就像 “所有人都插同一个插排”,而且集线器特别靠谱,坏的概率很低,还能多个叠在一起用(堆叠式集线器)。 - **专业版**:以太网采用星形拓扑时,中心设备为集线器,可靠性高。堆叠式集线器由 4-8 个集线器堆叠使用,可扩展端口数量,满足更多设备接入需求。 #### 3.7 集线器的特点(表格总结) | | | | | ------------------- | ------------------------------------------------- | ------------------------------------------------------- | | 特点 | 梗版解读 | 专业定义 | | 逻辑仍是总线网 + 用 CSMA/CD | 虽然物理上是 “星型”,但本质还是 “共享网线”,大家发数据仍要抢,还得遵守 “先听后说” 的规矩 | 使用集线器的以太网在逻辑上是总线网,各站共享逻辑总线,仍采用 CSMA/CD 协议,同一时刻至多一个站发送数据 | | 多端口设计 | 集线器有很多 “网线接口”,能插好几台电脑,像 “多孔插排” | 集线器拥有多个端口,可连接多台计算机或其他网络设备 | | 工作在物理层 + 不检测碰撞 | 集线器只负责 “传信号”,不管信号里有没有冲突,就像 “快递站只送包裹,不拆包检查” | 集线器工作在物理层,每个端口仅简单转发比特信号,不进行碰撞检测,对信号无过滤和处理 | | 自适应串音回波抵消 | 集线器能 “消除杂音”,避免网线里的信号互相干扰,保证传得清楚 | 集线器采用专门芯片,实现自适应串音回波抵消,减少信号串扰,提升传输质量 | #### 3.8 以太网的信道利用率 - **梗版**:信道利用率 =“实际传数据的时间 ÷ 总时间”!总时间包括 “传数据的时间(T)” 和 “数据从一端到另一端的时间(t,单程时延)”。就像你寄快递,总时间 = 打包时间(T)+ 快递在路上的时间(t),利用率就是打包时间占总时间的比例,比例越高越划算。极限利用率就是 “忽略碰撞” 时的最高比例,永远小于 1(因为总有传输时延)。 - **专业版**:以太网信道利用率为单程端到端时延 t 与帧的发送时间 T 之比的函数,公式为 U = T/(T + 2t)(2t 为往返时延)。极限信道利用率是忽略碰撞时的最大利用率,U_max = 1/(1 + 2t/T),因存在往返时延,极限利用率始终小于 1。 #### 3.9 硬件地址(MAC 地址 / 物理地址) - **梗版**:MAC 地址是 “网卡的身份证号”,固化在网卡的 ROM 里,一辈子不变!就像你的身份证号,不管你换多少手机号(IP 地址),身份证号永远是你的。 - **专业版**:硬件地址又称 MAC 地址或物理地址,是固化在适配器(网卡)ROM 中的唯一标识,用于在数据链路层识别不同的网络设备,长度为 48 位(6 字节),全球唯一。 --- ### 4. 扩展的以太网 #### 4.1 碰撞域(冲突域) - **梗版**:碰撞域是 “一根网线的势力范围”!在同一个碰撞域里,同一时间只能有一台电脑发数据,不然就会 “打架”(碰撞)。就像一个房间里只能有一个人说话,多了就吵得听不清。 - **专业版**:碰撞域(冲突域)是指网络中可能发生数据碰撞的区域,在任一时刻,每个碰撞域中至多只能有一个站发送数据,否则会产生数据碰撞。 #### 4.2 网桥与交换式集线器(表格对比) | | | | | | ----------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------- | ----------------------------- | | 设备 | 梗版解读 | 专业定义 | 现状 / 特点 | | 网桥 | 早期 “网线延长器”,能把两个局域网连起来,解决 “距离不够” 的问题,但速度慢,像 “老式快递中转站”,处理效率低 | 拓展以太网的早期设备,工作在数据链路层,可连接两个不同的局域网,实现数据帧的转发和过滤,隔离碰撞域 | 1990 年交换式集线器问世后被淘汰,功能单一,转发效率低 | | 交换式集线器(以太网交换机 / 第二层交换机) | “智能分流快递站”!能记住每个端口连的电脑 MAC 地址,发数据时直接 “精准投递”,不用像集线器 “所有人都发一遍”,还能同时让多台电脑发数据,不打架 | 又称以太网交换机或第二层交换机,工作在数据链路层,具有地址学习、帧过滤和帧转发功能,可隔离碰撞域,允许多个端口同时发送数据 | 取代网桥成为扩展以太网的主流设备,提升网络吞吐量和效率 |

天真的信息观

<section id="nice" data-tool="mdnice编辑器" data-website="https://www.mdnice.com"><h1 data-tool="mdnice编辑器"><span class="prefix"></span><span class="content">前言</span><span class="suffix"></span></h1> <p data-tool="mdnice编辑器">小时候我们总是纠结于事情做的对还是错,动画里的角色哪个是好人哪个是坏人,这是那个年纪独有的乐趣。但如果把眼光往后拨 10 年,15 年,工作后再来看相同的内容,大概率关注的点就不一样了,不再强调对与错,好与坏。</p> <p data-tool="mdnice编辑器"><span style="color: red;font-size: 16px">“灰色”</span>是社会教我们的第一节课,当然,你也许能在更早的时期领悟到这个词。</p> <h1 data-tool="mdnice编辑器"><span class="prefix"></span><span class="content"><span style="color: red;font-size: 24px">“灰色”</span>是什么?</span><span class="suffix"></span></h1> <p data-tool="mdnice编辑器">我们可以从一个每个人都经历过的场景说起:<span style="color: red;font-size: 16px">上网查资料。</span></p> <p data-tool="mdnice编辑器">你带着需求去搜索资料,最终根据资料操作出来的结果不符合你的要求。通常,你就会把这份资料定义成<strong>无效的</strong>;但实际上,作者可能实实在在的通过这资料解决了一个问题才将其发到网上的,也就是说在作者的定义下这份资料是<strong>有效的</strong>。</p> <p data-tool="mdnice编辑器">那这份资料是对的还是错的呢?对于这种因视角不同导致的又对又错,笔者将其定义成了<span style="color: red;font-size: 16px">“灰色”</span>。</p> <h1 data-tool="mdnice编辑器"><span class="prefix"></span><span class="content">从“资料”到“信息”</span><span class="suffix"></span></h1> <p data-tool="mdnice编辑器">上一段落我们聊了“上网查资料”的例子,一份看似客观的“资料”,因为视角不同,同时拥有<span style="color: red;font-size: 16px">“有效”和“无效”两种属性,这就是“灰色”</span>。</p> <p data-tool="mdnice编辑器">但仔细想想,这种情况仅仅发生在查资料的时候吗?</p> <p data-tool="mdnice编辑器">显然不是。</p> <ol data-tool="mdnice编辑器"> <li><section><p>朋友转述给你的一段八卦。</p> </section></li><li><section><p>新闻媒体上报道的一条热点事件。</p> </section></li><li><section><p>老板在会议上承诺的一个项目前景。</p> </section></li><li><section><p>一份正确的官方通报。</p> </section></li></ol> <p data-tool="mdnice编辑器">为了方便我们继续深入讨论,我们需要一个更上位的、更本质的词,来概括所有这些内容——无论是资料、八卦、新闻,还是承诺。</p> <p data-tool="mdnice编辑器">这个词,就用 <span style="font-size: 1.2em; color: #dc3545;">信息</span> 吧。</p> <h1 data-tool="mdnice编辑器"><span class="prefix"></span><span class="content">传播故事</span><span class="suffix"></span></h1> <p data-tool="mdnice编辑器">我们或多或少有接触一些神话故事,也就是视觉信息或文本信息,离我们非常远的故事,比如女娲补天、盘古开天、后羿射日等,我们几乎百分百会认为是假的。</p> <p data-tool="mdnice编辑器">但不论这故事的起源是真的假的,带给我们的应该都算是<span style="font-size: 1.2em; color: #dc3545;">有效信息</span>。</p> <p data-tool="mdnice编辑器">因为我们从故事中获得了情绪价值,虽然它在实际信息上是假的,但情绪信息上是真的,而人是一种更关注情绪的动物,如果你认同我的观点,那就是说:</p> <blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"> <p>一条信息能否被我们接受并广泛传播,决定性因素不在于它的“真实性”有多高,而在于它提供的“情绪价值”有多强。</p> </blockquote> <p data-tool="mdnice编辑器">笔者认为目前现实大部分信息都属于<span style="color: red;font-size: 16px">“灰色”</span>信息,但因为带给我们的情绪价值不一样,所以我们潜意识会将其定义成有效或无效。</p> <p data-tool="mdnice编辑器">也就是说,<span style="color: red;font-size: 16px">给予情绪价值高,那就是有效信息,反之则无效信息</span>。</p> <h1 data-tool="mdnice编辑器"><span class="prefix"></span><span class="content">媒体报道</span><span class="suffix"></span></h1> <p data-tool="mdnice编辑器">典型的例子就是部分互联网媒体,不同于早期的报纸,现在有些互联网媒体可不管事件真实性,只要是能引起人们情绪剧烈波动的,就会报道,标题信息含量都突破天际了,但实际内容价值几乎没有。</p> <p data-tool="mdnice编辑器">当我们阅读完,我们通常会觉得<strong>“TMD”</strong>,这个<strong>“TMD”</strong>瞬间,就是灰色信息转变的一次体验,当然这次转变是变有效还是无效得看你自己。</p> <p data-tool="mdnice编辑器">也就是说,<span style="color: red;font-size: 16px">信息是什么颜色,最终取决于我们自己如何解读它</span>。</p> <h1 data-tool="mdnice编辑器"><span class="prefix"></span><span class="content">控制信息</span><span class="suffix"></span></h1> <p data-tool="mdnice编辑器">既然如何理解信息的颜色是由我们自己来决定的,那有没有一种存在能统一所有人的认知的颜色呢?</p> <p data-tool="mdnice编辑器">有的有的,兄弟有的,这样的存在有九个。</p> <p data-tool="mdnice编辑器">这“九个”中,有一个最为特殊,它不像其他存在那样需要用各种手段来渐进式处理,如果地理位置合适,它甚至能一打八,它几乎可以直接控制信息的黑与白。</p> <p data-tool="mdnice编辑器">说远了,其实重点是,这种直接决定信息对错的能力,通常是在一些<strong>具备公信力的机构上或权威人士才有</strong>。</p> <p data-tool="mdnice编辑器">通过这种机构和人士声明的信息,通过就具备了一致性,能影响 98%的人对此类信息的颜色判断。</p> <p data-tool="mdnice编辑器">这种强大影响力的来源,通常是三样东西的组合:</p> <ol data-tool="mdnice编辑器"> <li><section><p><strong>信用的背书:</strong>利用其长期积累的公信力,让你因为“信任”这个人/机构,从而无条件地“相信”它发布的信息。(不涉及到你的专业)</p> </section></li><li><section><p><strong>信源的构建:</strong>通过强大的分发能力,让同一个信息版本在所有渠道上高强度、高密度地重复出现,形成一种“回音室”效应。当一个声音在你的世界里无处不在时,它就自动成为了“事实”本身,而其他声音则被淹没或过滤掉了。(这种机构/人的宣传能力比个人大)</p> </section></li><li><section><p><strong>解释权垄断:</strong>有意地将信息包装得极其复杂、专业、充满术语,只有获得认证的“专家”才能解读。它通过构建这种知识壁垒,让你产生一种“虽然我看不懂,但听起来很厉害,应该就是对的”的感觉。普通人的直觉和质疑,在这种“专业性”的包装面前会显得非常脆弱,从而让你主动放弃对该信息的判断权。</p> </section></li></ol> <h1 data-tool="mdnice编辑器"><span class="prefix"></span><span class="content">最后</span><span class="suffix"></span></h1> <p data-tool="mdnice编辑器">网络世界就像一个未经消毒的巨大信息食堂,什么菜都有。如果保持二极管的信息观,就像一个从不看后厨、给什么就吃什么的食客,容易吃坏肚子。</p> <p data-tool="mdnice编辑器">当再次有血压飙升的信息冲到我们脸上时,不妨先停一下,问自己:</p> <ol data-tool="mdnice编辑器"> <li><section><p><strong>它想让我产生什么情绪?</strong></p> </section></li><li><section><p><strong>跟我之前的认知冲突?</strong></p> </section></li><li><section><p><strong>还有没有其他可能?</strong></p> </section></li><li><section><p><strong>它是谁发出来的?</strong></p> </section></li><li><section><p><strong>与我有关吗?</strong></p> </section></li></ol> <h2 data-tool="mdnice编辑器"><span class="prefix"></span><span class="content">引用链接</span><span class="suffix"></span></h2> <p data-tool="mdnice编辑器"><span leaf="" style="font-size: 90%;opacity: 0.6;">[1] 《智人之上》 <i>m.douban.com/book/subject/37001305/</i></span></p> </section>

计算机网络基础 - 计算机网络和因特网

## 计算机网络和因特网 ### 什么是 Internet? 网络中的网络 #### 具体构造的的角度 - **节点** - 主机及其上运行的应用程序 - 路由器、交换机等网络交换设备 - **边**:通信链路(光纤、同轴电缆以及无线电等等) - 接入网链路:与主机直接互通的互联网的链路 - 主干链路:网路交换设备间的链路 - **协议**:规定语法、语义、时序以及动作 定义了两个或多个通信实体之间交换的报文格式和次序,以及在报文传输、接收或其他事件方面所采取的动作 #### 服务角度 互联是分布式的应用进程以及为分布式应用进程提供通信服务的基础设施 - 使用通信设施进行通信的分布式应用(Web、电子商务、社交网络等等) - 通信基础设施为 APP 提供通信服务(无连接不可靠服务、面向连接的可靠服务) #### 网络结构 - **网络边缘** - 主机 - 应用进程(客户端和服务器) - **网络核心** - 互联着的路由器 - 网络的网络 - **接入网、物理媒体** - 有线或者没线通信链路 ### 网络边缘 **组成**:端系统(主机);运行应用进程(Web、email) - 客户端/服务器模式(服务器是主,客户端是从) 客户端向服务器请求、接收服务(Web浏览器/服务器) - 对等模式(p2p) 端点既是客户端也是服务器(去中心化的分布式服务) **采用网络设施的面向连接服务** 目标:在端系统之间传输数据 **TCP 服务** HTTP、FTP、Telnet、SMTP - 可靠地、按顺序地传送数据(确认和重传) - 流量控制(发送方不会淹没接收方) - 拥塞控制(当网络拥塞时候,发送方降级发送速率) **UDP 服务** 流媒体、远程会议以及DNS等等 - 无连接 - 无可靠数据传输 - 无流量控制 - 无拥塞控制 --- ### 网络核心 路由器的网状结构 **网络的核心的关键功能** - 路由:决定分组采用的源到目标的路径(路由算法) - 转发:将分组从路由器的输入链路转移到输出链路上 #### 电路交换 为每个呼叫预留一条专有电路,如电话网 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240323102159697.png" alt="image-20240323102159697" style="zoom:67%;" /> 端到端的资源被分配给从源端到目标端的呼叫(通常被传统电话网络采用) **独享资源**(不同享):每个呼叫一旦建立起来就能够保证性能,如果呼叫没有数据发送,被分配的资源就会被浪费 **网络资源**(如带宽)被分成片 - **频分多路复用**(有线电视网络、无线广播等) - 原理:FDM 将整个传输频带分割成多个独立的子频带,每个子频带分配给一个信号传输使用 - 特点:各个信号在整个传输过程中占用固定的频带,互不干扰 - **时分多路复用**(电话网络、数字传输系统等) - 原理:TDM 将时间分割成一系列的时隙,每个信号在分配给它的时间时隙中传输 - 特点:所有信号共享相同的频带宽度,但在不同的时间传输 - **波分多路复用**(长途光纤通信、数据中心内部网络等) - 原理:WDM类似于频分多路复用,但在光纤通信中,它使用不同的波长(频率)来区分不同的信号 - 特点:每个信号分配一个独特的波长,可以在同一条光纤上同时传输 **电路交换不适合计算机之间的通信** - 建立的连接的时间长 - 计算机之间的通信有突发性,如果使用线路交换,则浪费的片较多(独享) #### 分组交换 ##### 概述 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240525123642280.png" alt="image-20240525123642280" style="zoom:67%;" /> 以分组为单位存储-转发方式 - 被传输到下一个链路之前,整个分组必须达到到达路由器/链路层交换机:存储-转发 - 在一个速率为 R bps 的链路上,一个长度为 L bit 的分组的存储转发延时为 L/R s ##### 排队时延和分组丢失 - 如果到达的分组需要传输到某条链路,但发现该链路正忙于传输其他分组,该到达分组必须在输出缓存中等待。因此,除了存储转发时延以外,分组还要承受输出缓存的排队时延 - 如果路由器的缓存用完了,分组将会抛弃,这就是分组丢失 ##### 转发表和路由选择协议 - **转发表**:用于记录目的地址(或目的地址的一部分)映射输出链路地址的表 - **路由选择协议**:用于自动地设置这些转发表。例如,一个路由选择协议可以决定从每台路由器到每个目的地的最短路径,并使用这些最短路径结果来配置路由器中的转发表 ##### 按照有无网络层的连接 **数据报网络** (类似:问路 ) - 分组的目标地址决定下一跳 - 在不同的阶段,路由可以改变 - Internent **虚电路网络** - 每个分组都带标签(虚电路标识 VCID),标签决定下一跳 - 在呼叫建立时决定路径,在整个呼叫中路径保持不变 - 路由器维持每个呼叫的状态信息 #### 分组交换 VS 电路交换 - 分组交换允许更多的用户,适用于突发式传输,但是会排队延迟以及会出现丢包现象 - 分组交换按需分配链路使用。链路传输能力将在所有需要在链路上传输分组的用户之间逐分组地被共享 - 电路交换网络相较于分组交换网络的优点主要是提供稳定、低时延的专用通信路径,适用于对实时性和带宽要求高的场景 ---- ### 接入网 **怎样将端系统和边缘路由器连接?** - 住宅接入网络 - 单位接入网络 (学校、公司) - 无线接入网络 #### DSL 因特网接入 DSL 数字用户线,住户通常从提供**本地电话**接入的本地电话公司处获得DSL因特网接入 - 高速下行信道,位于50kHz到1MHz频段 - 中速上行信道,位于4kHz到50kHz频段 - 普通的双向电话信道,位于0到4kHz频段 当使用DSL时,用户的本地电话公司也是它的 ISP。每个用户的 DSL调制解调器使用现有的电话线(即双绞铜线)与位于电话公司的本地中心局 CO 中的数字用户线接入复用器 DSLAM 交换数据 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240518201827152.png" alt="image-20240518201827152" style="zoom:80%;" /> #### 电缆因特网接入 利用了有线电视公司现有的有线电视基础设施。住宅从提供有线电视的公司获得了电缆因特网接入 **电缆调制解调器**通常是一个外部设备,通过一个以太网端口连接到家庭PC在电缆头端,**电缆调制解调器端接系统(Cable Modem Termination System,CMTS)**与DSL网络的DSLAM具有类似的功能,即将来自许多下行家庭中的电缆调制解调器发送的模拟信号转换回数字形式 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240518215926988.png" alt="image-20240518215926988" style="zoom:67%;" /> **注意**:与DSL不同,DSL每个用户一个专用线路到CO,电缆因特网接入的各用户共享到线缆头端的接入网络 #### 光纤到户 FTTH 一种提供更高速率的新兴技术是光纤到户 FTTH,从本地中心局直接到家庭提供了一条光纤路径(通常提供 **100 Mbps 到 10 Gbps** 的速度,具体取决于提供商的服务和实施方式) <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240518221050512.png" alt="image-20240518221050512" style="zoom:67%;" /> #### 无线接入网络 在无线LAN环境中,无线用户从/到一个接入点发送/接收分组,该接入点与企业网连接(很可能使用了有线以太网),企业网再与有线因特网相连。一个无线LAN用户通常必须位于接入点的几十米范围内 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240518225002925.png" alt="image-20240518225002925" style="zoom:67%;" /> ---- ### 物理媒体 物理媒体分成两种类型:导引型媒体和非导引型媒体 #### 导引型媒体 信号沿着固体媒介被导引:同轴电缆、光纤、双绞线 **双绞线** 两根绝缘铜导线拧合 <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240519151535897.png" alt="image-20240519151535897" style="zoom: 33%;" /> **同轴电缆** 两根同轴的铜导线,双向 - 基带电缆: 电缆上一个单个信道 ;Ethernet - 宽带电缆: 电缆上有多个信道 ; HFC <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/lq21Vz2jopMDrSoA.png" alt="image-20240518230104834" width="243px" /> **光纤和光缆:** 光脉冲,每个脉冲表示一个 bit,在玻璃纤维中传输 - 高速,点到点的高速传输(如10 Gps-100Gbps传输速率 ) - 低误码率,在两个中继器之间可以有很长的距离,不受电磁噪声的干扰 - 安全 #### 非导引性媒体 开放的空间传输电磁波或者光信号,在电磁或者光信号中承载数字数据 开放空间传输电磁波,携带要传输的数据 - 无需物理“线缆” - 双向 - 传播环境效应:反射、吸收 、干扰 **无线链路类型** **地面微波** - e.g. up to 45 Mbps channels **LAN (e.g., WiFi)** - 11Mbps, 54 Mbps,540Mbps… **wide-area** - 4G 10Mbps - 5G 数Gbps **卫星** - 每个信道Kbps 到45Mbps (或者多个聚集信道) - 270 msec端到端延迟 - 同步静止卫星和低轨卫星 ---- ### Internet 结构和 ISP - **ISP**(因特网服务提供者):是个向广大用户综合提供提供互联网接入业务,信息业务和增值业务的公司 - **ICP**(内容提供商):自己部署专用网络,同时和各级 ISP 连接 - **IXP**:多个对等 ISP 互联互通之处,通常不涉及费用结算(对等接入) - **POP**:高层 ISP 面向客户网络的接入点,涉及费用结算(多宿:一个底层 ISP 接入 多个高层 ISP) <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240526155909917.png" alt="image-20240526155909917" style="zoom:80%;" /> ---- ### 分组延时、丢失和吞吐量 **为何会出现分组延时和丢失?** 在路由器缓冲区的分组队列 - 延时:分组等待排到队头、被传输 - 丢失:分组到达时,如果没有可用的缓冲区,则该分组被丢掉(分组到达链路的速率超过了链路输出的能力) **节点总时延(total nodal delay)**:节点处理时延(nodal processing delay)、排队时延(queuing delay)、传输时延(transmission delay)和传播时延(propagation delay) ![image-20240728170426990](https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240728170426990.png) #### 四种分组延时 1. 节点处理延时:检查 bit 级差错 ;检查分组首部和决定将分组导向何处 2. 排队延时:在输出链路上等待传输的时间 ; 依赖于路由器的拥塞程度 流量强度 = La / R (越接近 0,平均排队延时越小;反之越接近 1,平均排队延时趋向于无限大,因此,流量工程中的一条金 科玉律是:设计系统时流量强度不能大于 1) <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240728172617128.png" alt="image-20240728172617128" style="zoom:50%;" /> - R 链路带宽(bps) - L 分组长度(bits) - a 分组到达队列的平均速率 3. 传输延时:将分组发送到链路上的时间: L / R (R:链路带宽(bps) ; L:分组长度(bits)) ;存储转发延时 4. 传播延时:传播延时 d / s (d:物理链路的长度 ; s:在媒体上的传播速度) #### 分组丢失 - 链路的队列缓冲区容量有限 - 当分组到达一个满的队列时,该分组将会丢失 - 丢失的分组可能会被前一个节点或源端系统重传,或根本不重传 #### 吞吐量 吞吐量,在源端和目标端之间传输的速率(数据量/单位时间) - 瞬间吞吐量:在一个时间点的速率 - 平均吞吐量:在一个长时间内平均值 瓶颈链路:端到端路径上,限制端到端吞吐的链路(水桶效应) 端到端平均吞吐 = min{R1,R2,…,Rn } <img src="https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240728195632530.png" alt="image-20240728195632530" style="zoom:67%;" /> ---- ### 协议层次及其服务模型 <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/6mg5X7GSwEnT1Vbq.webp" alt="20240803163157" width="100%" /> #### 概念 **服务**:低层实体向上层实体提供他们之间的通信能力 - 服务用户 - 服务提供者 **服务访问点 SAP**:使用下层提供的服务通过层间的接口(类似于上层调用下层的服务函数) - socket,TCP 向应用层提供得服务访问点(用于区分上层应用) **原语**:下层提供给上层服务的形式(类似于服务函数参数) **服务类型**:面向连接的服务以及无连接 例如:TCP 向它的应用程序提供了面向连接的服务, 这种服务确保应用层报文向目的地传递的正确性和流量控制 ;UDP 协议向它的应用程序提供无连接服务。这是一种不提供不必要服务的服务,没有可靠性,没有流量控制,也没有拥塞控制 **服务与协议的区别** - 服务(Service):低层实体向上层实体提供它们之间的通信的能力,是通过原语来操作的,垂直方向 - 协议(protocol):对等层实体(peer entity)之间在相互通信的过程中,需要遵循的规则的集合,水平方向 **分层处理和实现复杂系统的好处?** 对付复杂的系统 - 概念化:结构清晰,便于标示网络组件,以及描述其相互关系(分层参考模型) - 结构化:模块化更易于维护和系统升级 (改变某一层服务的实现不影响系统中的其他层次 ) - 对于其他层次而言是透明的 #### 数据单元(DU) PDU,协议数据单元:上层传输下来的数据 SDU,拼接上本层的 Header的数据则为本层的 PDU(通俗地讲就是封装上层的数据之后的称呼) ![image-20240731130956005](https://use-typora.oss-cn-hangzhou.aliyuncs.com/image-20240731130956005.png) SDU 与 PDU 存在关系:多对一(粘包)、一对一、一对多(拆包)的关系 #### 协议栈 ##### TCP/IP 协议 - 应用层:网络应用 - 为人类用户或者其他应用进程提供网络应用服务 - FTP、SMTP、HTTP、DNS - 传输层:主机之间的数据传输 - 在网络层提供的端到端通信基础上,细分为进程到进程,将不可靠的通信变成可靠地通信 - TCP、UDP - 网络层:为数据报从源到目的选择路由 - 主机主机之间的通信,端到端通信,不可靠 - IP、路由协议 - 链路层:相邻网络节点间的数据传输 - 2个相邻2点的通信,点到点通信,可靠或不可靠 - 点对对协议PPP、802.11(wifi)、Ethernet - 物理层:在线路上传送 bit <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/jx6JVRVHfYhVyw7s.webp" alt="20240803161139" width="228px" /> ##### 各层次的协议数据单元 - 应用层:报文(message) - 传输层:报文段(segment)TCP段,UDP数据报 - 网络层:分组(packet)(如果无连接方式:数据报 datagram) - 数据链路层:帧(frame) - 物理层:位(bit) ##### IOS/OSI 参考模型 - 表示层:允许应用解释传输的数据,e.g.、加密、压缩以及机器相关的表示转换 - 会话层:数据交换的同步,检查点,恢复 <img src="https://pic.code-nav.cn/post_picture/1635233493887799297/JPxuFeGfVQi5CSWl.webp" alt="20240803161241" width="225px" /> ### 计算机网络和因特网的历史 #### 早期计算机网路(1960年以前) 主要使用的是线路交换网络,但是由于线路建立时间过长、独享方式占用通信资源以及可靠性不高等原因,寻求新型的网络模式,便出现分组交换网络 #### 分组交换的发展(1961-1972) 网络控制协议是第一个端系统直接的主机-主机协议(NCP协议:相当于传输层和网络层在一起,支持应用开发) #### 专用网络和网络互联 (1972-1980) 定义了今天的Internet体系结构 #### 网络的激增(1980-1990) 1983: TCP/IP部署 - NCP分化成2个层次,TCP/IP,从而出现 UDP - 覆盖式IP解决网络互联问题 - 主机设备和网络交换设备分开 #### 因特网爆炸 (1990, 2000’s) - TCP/IP体系结构的包容性,在其上部署应用便捷,出现非常多的应用 - 新一代杀手级应用(即时讯息,P2P 文件共享,社交网络等)更进一步促进互联网的发展 - 安全问题不断出现和修订(互联网的补丁对策) #### 最新发展(2005 - 现在) 高速无线接入无处不在:移动互联时代 - 4G部署,5G蓄势待发 - 带宽大,终端性能高,价格便宜,应用不断增多

HCIP-VRRP+MSTP典型组网案例

<img src="https://pic.code-nav.cn/post_picture/1810917631972016129/xAiqIoXVD7GlJ9I4.webp" alt="image.png" width="100%" /> 1、IP地址配置 如图,四台PC配置IP地址192.168.x0.1,然后网关为192.168.x0.254 2、接下来对交换机SW3配置,SW3作为接入层交换机,命名为JR1 JR1: sy sysname JR1 vlan batch 10 20 30 40 //批量创建vlan int g0/0/1 //此处为对接入层-PC的接口进行VLAN 放行配置 port link-type access port default vlan 10 ...... int g0/0/4 port link-type access port default vlan 40 //接下来对接入层-汇聚层接口进行配置 int g0/0/10 port link-type trunk port trunk allowpass vlan 10 20 30 40 int g0/0/20 port link-type trunk port trunk allowpass vlan 10 20 30 40 qu stp mode mstp stp region-configuration region-name GBLXZDXZ instance 10 vlan 10 20 instacne 20 vlan 30 40 activie region-configuration qu stp enable 3、接下来对汇聚层交换机进行配置,汇聚层左边交换机为HJ1,右边为HJ2 HJ1: sy sy HJ1 vlan batch 10 20 30 40 int g0/0/10 port link-type trunk port trunk allow-pass vlan 10 20 30 40 //vlan 配置完成 //链路聚合配置 LACP int Eth-Trunk 1 //创建并进入链路聚合接口1 trunkpork g0/0/23 //将g0/0/23接口加入聚合组 trunkport g0/0/24 //将g0/0/24接口加入聚合组 port link-type trunk //对聚合口设置为trunk模式 port trunk allow-pass vlan 10 20 30 40 //放行vlan 10 20 30 40 //配置VRRP: int vlanif 10 //进入vlan接口 ip addr 192.168.10.251 24 //配置IP地址 vrrp vrid 10 virtual-ip 192.168.10.254 //配置虚拟网关 vrrp vrid 10 priority 120 //修改优先级为120 ...... int vlanif 40 //进入vlan接口 ip addr 192.168.40.251 24 //配置IP地址 vrrp vrid 40 virtual-ip 192.168.40.254 //配置虚拟网关 //配置MSTP,将vlan 10 20 映射到Instance10 vlan 30 40映射到Instance20 将Instance10 配置为HJ1的主根桥,HJ2的次根桥 stp mode mstp stp region-configuration region-name GBLXZDXZ instacne 10 vlan 10 20 instacne 20 vlan 30 40 actice region-configuration qu stp instance 10 root primary stp instance 20 root secondary stp enable HJ2: sy sy HJ2 vlan batch 10 20 30 40 int g0/0/20 port link-type trunk port trunk allow-pass vlan 10 20 30 40 //链路聚合配置 LACP int Eth-Trunk 1 //创建并进入链路聚合接口1 trunkpork g0/0/23 //将g0/0/23接口加入聚合组 trunkport g0/0/24 //将g0/0/24接口加入聚合组 port link-type trunk //对聚合口设置为trunk模式 port trunk allow-pass vlan 10 20 30 40 //放行vlan 10 20 30 40 //配置VRRP: int vlanif 10 //进入vlan接口 ip addr 192.168.10.252 24 //配置IP地址 vrrp vrid 10 virtual-ip 192.168.10.254 //配置虚拟网关 ...... int vlanif 40 //进入vlan接口 ip addr 192.168.40.252 24 //配置IP地址 vrrp vrid 40 virtual-ip 192.168.40.254 //配置虚拟网关 vrrp vrid 40 priority 120 //修改优先级为120 //配置MSTP,将vlan 10 20 映射到Instance10 vlan 30 40映射到Instance20 //将Instance10 配置为HJ1的主根桥,HJ2的次根桥 //将Instance20 配置为HJ2的主根桥,HJ1的此根桥 stp mode mstp stp region-configuration region-name GBLXZDXZ instacne 10 vlan 10 20 instacne 20 vlan 30 40 actice region-configuration qu stp instance 20 root primary stp instance 10 root secondary stp enable 以上配置全部完成 接下来检查 <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/cq4IxB9xOpUmvAXA.png" alt="image.png" width="572px" /> \ HJ1: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/DhO2oILHaNXwBrl7.png" alt="image.png" width="632px" /> HJ2: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/VrrOilIKnMLjFG62.png" alt="image.png" width="581px" /> 接下来进行连通性检查: PC1 ping 网关: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/JiJMiEYEmjXMcJ5K.png" alt="image.png" width="611px" /> \ PC1 ping PC2: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/TrauBGkMFnAHBHgd.png" alt="image.png" width="653px" />

HCIP-基础VRRP

实验拓扑图如下: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/aECWgx8d9CWqrIAb.webp" alt="image.png" width="542px" /> PC1 IP:192.168.1.1/24 网关为虚拟网关 192.168.1.254 在R1上配置: int g0/0/0 ip addr 192.168.1.253 24 vrrp vrid 1 virtual-ip 192.168.1.254 //此处为虚拟IP地址无需配置子网掩码 vrrp vrid priority 120 在R2上配置: int g0/0/0 ip addr 192.168.1.252 24 vrrp vrid 1 virthal-ip 192.168.1.254 以上 配置完成 R1第四条命令是设置优先级,Vrrp的优先级默认为100,越大越优先 设置完成之后查看: R1 <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/5QxXchnCln9N20Eh.webp" alt="image.png" width="571px" /> R2 <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/26wGZmDvIhjqIJ9j.webp" alt="image.png" width="661px" /> 实验结束

HCIP实验-三层交换机配置

实验拓扑图如下: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/0L9nGdU8zApydMCl.webp" alt="image.png" width="100%" /> 如图,先配置好IP地址,随后在SW1上进行配置 SW1: vlan batch 10 20 int e0/0/1 port link-type access port default vlan10 int e0/0/2 port link-type access port default vlan 20 int e0/0/3 port link-type trunk port trunk allow-pass vlan 10 20 在SW2: vlan batch 10 20 99 int g0/0/1 port link-type trunk port trunk alllo-pass vlan 10 20 int g0/0/2 port link-type access port default vlan 99 qu int vlanif 10 ip addr 192.168.10.254 24 int vlanif 20 ip addr 192.168.20.254 24 int vlanif 99 ip addr 192.168.99.1 24 qu ospf 1 router-id 2.2.2.2 area 0 net 0.0.0.0 0.0.0.0 qu 在R1上配置: ospf 1 router-id 1.1.1.1 area 0 net 0.0.0.0 0.0.0.0 到此所有配置结束,接下来是连通性验证 在SW1上查看 <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/wgqnwliDoWTbomok.png" alt="image.png" width="628px" /> \ SW2: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/ZlezPPOuvLn8LO9O.png" alt="image.png" width="635px" /> <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/c1umE84l2RNY4yNC.webp" alt="image.png" width="680px" /> \ R1: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/6uwIYHxMFxtR8Ccx.webp" alt="image.png" width="663px" /> 连通性验证: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/eav7lqpTihfSydyr.png" alt="image.png" width="571px" /> \ <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/cOgp0eJ657UuX2EX.png" alt="image.png" width="556px" /> \ <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/EgHF5KSZMeuIjBKM.png" alt="image.png" width="612px" /> ----------------------------------------------------------- 至此,本实验结束

HCIP实验-路由器子接口配置

实验拓扑图如下 <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/xZI83agxVw2eMD05.webp" alt="image.png" width="718px" /> 先对各个设备配置IP地址:IP地址如图 随后在交换机创建vlan vlan batch 10 20 int g0/0/2 port link-type access port default vlan 10 int g0/0/3 port link-type access port default vlan 20 int g0/0/1 port link-type trunk port trunk allow-pass vlan 10 20 交换机配置完成 接下来对路由器进行配置 int g0/0/0.10 //进入子接口 dot1q termination vid 10 //设置放行vlan 这里理解为解掉vlan 10的标签 ip address 192.168.10.254 24 //设置IP地址,即网关 arp broadcast enable //开启arp转发功能,ensp模拟器默认是关闭的,必须手动打开,否则PC互相ping不通 此处重点 int g0/0/0.20 dot1q termination vid 20 ip addr192.168.20.254 24 arp broadcast enable 以上配置完成,进行验证 <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/xCvgoqsIrzFeH9c6.webp" alt="image.png" width="640px" /> \ <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/pZvCmVZQBJ4DAOik.png" alt="image.png" width="623px" /> <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/G0KysVRG9f643LDd.webp" alt="image.png" width="616px" /> \ 现在PC1与PC2通信: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/lDHNbrTQ0CejEvQh.png" alt="image.png" width="677px" /> --------------------------------------------------------------------------- 本次实验完成

HCIP实验-Access与Trunk类型接口的基础配置

实验拓扑图如下: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/0tuljr3QYuFLYzSi.webp" alt="image.png" width="100%" /> IP地址如上图,PC的网关留空 交换机命令配置: SW1: vlan batch 10 20 int g0/0/1 port link-type access port default vlan 10 int g0/0/2 port link-type access port default vlan 20 int g0/0/3 port link-type trunk port trunk allow-pass vlan 10 20 在SW1上创建VLAN10 VLAN20 然后将端口与VLAN绑定 随后在G0/0/3上允许VLAN10和20通行 SW2: vlan batch 10 20 int g0/0/2 port link-type access port default vlan 10 int g0/0/3 port link-type access port default vlan 20 int g0/0/1 port link-type trunk port trunk allow-pass vlan 10 20 SW2同理创建并配置 在配置完成之后,在SW1上查看vlan信息: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/ebVlRdyErXWhl5hH.webp" alt="image.png" width="624px" /> 在SW2查看: <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/qadynGfJiEdSlXzi.webp" alt="image.png" width="644px" /> 查看端口绑定的VLAN <img src="https://pic.code-nav.cn/post_picture/1810917631972016129/E8NUXoqHFhbtoH0l.png" alt="image.png" width="583px" /> 至此本实验结束

下载 APP