软考-系统架构设计师 计算机系统基础知识详细讲解二
个人博客:blogs.wurp.top
一、计算机网络 (架构师的连接蓝图)
架构师视角:网络是分布式系统的基石,所有设计都必须考虑网络延迟、带宽、可靠性和安全性。
1. 网络体系结构 (核心模型)
- OSI七层模型:理论模型,用于理解和教学。
- 记忆口诀:应、表、会、传、网、数、物 (从上到下)。
- 每一层的功能和协议是考查重点。
- TCP/IP五层(或四层)模型:实际应用的工业标准。
- 应用层 (对应OSI应用层、表示层、会话层):HTTP, HTTPS, FTP, SMTP, DNS, DHCP。
- 传输层:TCP, UDP。
- 网络层:IP, ICMP, IGMP, ARP/RARP。核心任务是路由和寻址。
- 数据链路层:Ethernet, PPP, Switch。核心任务是帧同步、差错控制、流量控制。
- 物理层:定义物理介质标准,传输比特流。
2. 关键协议详解 (必考)
- TCP vs UDP:必须熟练掌握对比。
特性 TCP (传输控制协议) UDP (用户数据报协议) 连接性 面向连接 (三次握手,四次挥手) 无连接 可靠性 可靠 (确认、重传、排序、流量控制) 不可靠 (尽力交付) 数据形式 字节流 (无边界) 数据报文 (有边界) 头部开销 大 (20字节以上) 小 (8字节) 速度 慢 快 应用场景 Web (HTTP), 邮件(SMTP), 文件传输(FTP) 视频会议, 语音通话, DNS查询 - TCP的重要机制:
- 三次握手:建立连接。
SYN -> SYN/ACK -> ACK
。防止已失效的连接请求报文突然又传送到服务器。 - 四次挥手:释放连接。
FIN -> ACK -> FIN -> ACK
。因为连接可能是半关闭的。 - 流量控制:使用滑动窗口协议,接收方通过通告窗口大小来控制发送方的速率,防止接收方缓冲区溢出。
- 拥塞控制:维护一个拥塞窗口(cwnd),算法包括:慢启动、拥塞避免、快重传、快恢复。目的是避免网络过载。
- 三次握手:建立连接。
- HTTP/HTTPS:
- HTTP 1.1: 持久连接、管道化。但仍存在队头阻塞(Head-of-Line Blocking)。
- HTTP/2: 多路复用(解决队头阻塞)、头部压缩、服务器推送。底层仍是TCP。
- HTTP/3: 基于QUIC协议,运行在UDP之上。进一步解决TCP层面的队头阻塞,减少连接建立延迟。
- HTTPS = HTTP + SSL/TLS。TLS协议通过非对称加密(如RSA, ECC)协商密钥,然后用对称加密(如AES)通信,保证安全。
3. IP地址与路由
- IPv4 vs IPv6:IPv6解决了地址枯竭问题,地址长度128位,简化了报头,更安全。
- 子网划分与CIDR:架构师需要规划网络地址,例如根据主机数量划分子网。
- 路由协议:
- 内部网关协议(IGP):在自治系统(AS)内部使用,如OSPF (开放最短路径优先,链路状态协议)、RIP (路由信息协议,距离矢量协议)。
- 外部网关协议(EGP):在AS之间使用,主要是BGP (边界网关协议)。
4. 网络安全
- 攻击类型:DDoS、SQL注入、XSS、CSRF、中间人攻击等。
- 防御手段:
- 防火墙:包过滤、状态检测、应用代理。
- 加密技术:对称加密(AES)、非对称加密(RSA)、哈希算法(SHA、MD5)。
- 身份认证:数字证书、数字签名、动态口令、生物认证。
二、计算机语言与程序编译 (架构师的表达工具)
架构师视角:语言是思维的载体,选择何种语言和范式直接影响系统的性能、可维护性和团队效率。
1. 程序设计范式
- 面向过程 (POP):以函数为中心,数据与操作分离。C语言是典型代表。
- 面向对象 (OOP):必考重点。以对象为中心,核心概念:
- 四大特性:抽象、封装、继承、多态。
- 设计原则:SOLID原则(单一职责、开闭原则、里氏替换、接口隔离、依赖倒置)。
- 设计模式:23种经典设计模式(创建型、结构型、行为型)是解决常见设计问题的方案,如工厂、单例、适配器、观察者、策略模式等。架构师必须精通。
- 函数式编程 (FP):将计算视为数学函数的求值,避免状态和可变数据。核心概念:高阶函数、闭包、惰性求值、无副作用。适用于并发编程和数据处理。Scala, Haskell是代表。
- 响应式编程 (RP):一种面向数据流和变化传播的编程范式,适用于异步和事件驱动系统。如RxJava。
2. 编译与解释
- 编译型语言 (C, C++, Go):源代码 -> 编译器 -> 机器码 -> 执行。执行速度快。
- 解释型语言 (Python, JavaScript):源代码 -> 解释器 -> 逐行解释执行。跨平台性好,灵活。
- 混合型 (Java, C#):源代码 -> 编译器 -> 字节码 -> 虚拟机(JVM, CLR) 解释/编译执行。兼顾速度和跨平台。
3. 编译过程 (重点)
源代码到目标代码的转换过程:
- 词法分析:将源程序分解为一系列记号(Token)(关键字、标识符、常数等)。
- 语法分析:根据语法规则将Token序列构造成语法树。
- 语义分析:检查类型是否匹配、是否声明等。
- 中间代码生成:生成与机器无关的中间表示(如三地址码)。
- 代码优化:对中间代码进行优化,提高效率。
- 目标代码生成:将优化后的中间代码转换成特定机器的目标代码(汇编或机器码)。
4. 运行时系统
- 内存管理:
- 栈:存放局部变量、函数调用信息。自动管理,速度快。
- 堆:动态分配的内存(如
new
,malloc
)。由程序员或垃圾回收器管理。
- 垃圾回收 (GC):自动回收不再使用的内存。
- 引用计数法:简单,但无法解决循环引用问题。
- 标记-清除:标记所有可达对象,清除未标记的。会产生碎片。
- 标记-整理:在标记-清除基础上进行整理,消除碎片。
- 分代收集 (如Java JVM):将堆分为新生代和老年代,根据对象存活周期采用不同算法。这是主流商用虚拟机的算法。
三、系统工程 (架构师的方法论)
架构师视角:系统工程是指导复杂系统从概念、设计、实现到运维的全过程、全生命周期的方法论。
1. 系统开发方法论
- 结构化方法 (瀑布模型):自顶向下,逐步求精。适用于需求明确的项目。缺点:灵活性差,风险滞后。
- 面向对象方法:贯穿分析、设计、实现全过程,使用UML进行建模。更好地应对变化。
- 原型法:快速构建一个简化版,获取用户反馈,逐步演化。适用于需求不明确的项目。
- 敏捷开发:应对快速变化的需求。迭代、增量开发,强调人员和协作。
- Scrum:角色(PO, SM, Dev Team)、工件(Product Backlog, Sprint Backlog)、事件(Sprint, 站会, 评审, 复盘)。
- DevOps:开发与运维一体化,强调自动化(CI/CD)、持续交付和协作。
2. 系统规划与需求工程
- 可行性分析:技术可行性、经济可行性、操作可行性等。
- 需求层次:业务需求、用户需求、功能需求、非功能需求。
- 需求获取技术:访谈、问卷调查、原型、观察等。
- 需求分析模型:用例图(谁对系统做什么)、数据流图/DFD(数据流动和处理)。
3. 系统设计原则
- 高内聚、低耦合:模块内部元素紧密相关,模块之间依赖尽可能简单。这是最重要的设计原则。
- 抽象与信息隐藏:隐藏模块的实现细节,只暴露接口。
- 关注点分离:将不同的问题分开处理(如MVC模式将数据、视图、控制分离)。
4. 系统验证与验证
- 测试级别:
- 单元测试:测试单个模块或类。
- 集成测试:测试模块之间的接口。
- 系统测试:测试整个系统的功能和非功能需求(性能、安全、压力测试)。
- 验收测试:由用户进行,确认系统是否满足合同要求。
- 测试方法:
- α测试:开发环境内部测试。
- β测试:用户在实际使用环境中测试。
5. 系统运行与维护
- 维护类型:
- 更正性维护:修复错误。
- 适应性维护:使系统适应外部环境变化(如操作系统升级)。
- 完善性维护:扩充功能或提高性能。
- 预防性维护:为未来的可维护性和可靠性做修改。
总结与软考应用
- 综合性:软考案例分析题和论文题极有可能将这三部分知识与硬件、OS知识结合。例如,设计一个高并发电商系统,需要:
- 网络:考虑CDN、负载均衡、TCP连接池。
- 语言:选择Java(生态成熟)或Go(高并发性能)。
- 系统工程:采用微服务架构(架构设计)、敏捷开发模式(项目管理)、CI/CD流水线(DevOps)。
- 权衡决策:架构师的角色就是做选择题。为什么用TCP不用UDP?为什么用Java不用Go?为什么用敏捷不用瀑布?你的答案必须基于对上述知识的深刻理解,并能分析其优缺点。
- 紧跟趋势:了解云原生、Service Mesh、Serverless等现代架构理念,并将其与传统知识关联,能在论文中体现你的技术视野。