我做了六、七年网络方向的开发,也带过不少刚入门的新人,发现最常被问的问题不是某个协议细节,而是“这些东西到底怎么串起来的”。很多朋友翻开谢希仁的《计算机网络》、或者啃《自顶向下》,前面几章看得云里雾里,觉得概念太多、记不住,然后就放弃了。实际上计算机网络这门课,如果一开始把“为什么要分层”“数据到底怎么走的”这两件事想明白,后面学TCP、IP、HTTP都会顺很多。
这篇文章我会用比较通俗的方式,把计算机网络的核心框架梳理一遍。内容包括网络的分类、协议分层的逻辑、数据封装的完整流程、各层核心协议的作用、以及一些排查网络问题时特别实用的工具和命令。无论你是准备期末复习、还是在学408相关内容、又或者是工作后想补一下网络基础,这篇都适合当第一份提纲来用。
1. 先把“网络”拆开看:概念、分类与整体架构
1.1 什么是计算机网络:三个核心组成
我们天天说“网络”,教材里定义的计算机网络是“将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统”。
听起来很绕,拆成大白话就三个部分:
- 计算机节点:就是终端设备,PC、手机、服务器都算。
- 通信链路:看得见的网线、光纤,看不见的无线电波,都算。
- 协议:这是灵魂。两边的设备得遵守同一套语言规则才能通信,就像两个人说话得用同一种语言。
理解协议很关键,很多初学后端的朋友会问“为什么我调用接口要指定HTTP协议?直接在TCP上自己定义格式不行吗”——答案是“行”,实际上很多中间件内部就是自己定义协议的。HTTP只是大家约定俗成的一套标准,所谓“协议”本质就是双方为了协作而提前定好的规则。
1.2 按覆盖范围分类:从LAN到WAN
按照网络覆盖的地理范围,最常见的分类包括:
| 类型 | 覆盖范围 | 典型场景 |
|---|---|---|
| PAN(个人区域网) | 几米 | 蓝牙耳机连手机,AirDrop传文件 |
| LAN(局域网) | 一栋楼/一个园区 | 办公室网络、家庭Wi-Fi、学校机房 |
| MAN(城域网) | 一个城市 | 城市骨干网络,运营商城域节点 |
| WAN(广域网) | 跨越城市/国家 | 互联网主干,跨国企业专线 |
大部分人日常接触最多的是LAN。局域网的核心特点是自己管理、带宽高、延迟低。你家里路由器下挂十几台设备,那其实就是一个很小的局域网。企业在机房搭建的业务系统,服务器之间互访也基本都是LAN环境。
1.3 按通信方式分类:单工、半双工、全双工
这个概念容易被忽略,但实际排障和选型时会用到。
- 单工:只能单向传输,像广播电台,你只能听不能回。
- 半双工:可以双向传输,但同一时刻只能往一个方向,像老式对讲机,一个人说完另一个人再说。
- 全双工:同时双向收发,像打电话,两边能同时说话。
现代以太网使用的基本都是全双工模式。如果哪天你发现网络异常慢,可以顺手查一下交换机端口是否处于半双工状态——这种情况处理不当会引发大量的冲突和重传,表现为吞吐量极低。早年网卡自适应失败时经常出现这类问题。
1.4 按拓扑结构看:总线型、星型、环型、网状型
拓扑讲的是设备之间怎么连。总线型是早期同轴电缆时代用的,所有设备共享一根线,一台机器发数据大家都能收到,现在已经很少见了。星型是目前局域网的主流,所有设备连接到交换机上,结构清楚,任意一条线断了只会影响对应的那台机器。环型在令牌环网时代流行过,现在已经边缘化。网状型则常见于骨干网和数据中心,多路径冗余。比如你在云上买多台服务器,把它们放在不同可用区,通过专线或者负载均衡连起来,本质就是网状冗余设计:一台挂了,流量走别的路径,服务不中断。
1.5 电路交换、报文交换与分组交换
早期电话网用的是电路交换:通话前先建立一条独占的物理通路,全程占用,不管说没说满,线路是你的,别人用不了。在计算机网络里,这种方式的资源利用率太低。报文交换是把整个数据块一股脑发给下一个节点,存储转发,对节点缓存要求高,也不适合实时交互。
现代互联网的基石其实是分组交换:把数据切成一个个小的包(packet),每个包独立转发。好处很明显——不同用户的数据包可以复用同一条链路,网络资源利用率高。同时一个包走丢了只需重传那一个包,不用从头再来。代价是带来了排队延迟和乱序问题,TCP里的序号、确认机制,本质上都是在应对分组交换带来的这些问题。很多面试题会问“TCP为什么要序号?”,追根溯源就是分组交换可能乱序、重复、丢失。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分层思想:计算机网络最核心的组织方式
2.1 为什么要分层:一个打比方
把网络协议分层,不是因为某个人规定必须这样,而是因为现实问题太复杂,不拆就做不出来。
打个比方。假设你要从北京寄一盒月饼给上海的朋友,这个过程中有很多环节:你负责把月饼装进包装盒、写好收件地址;快递公司负责把包裹从北京转运到上海;运输过程中的卡车/飞机负责物理移动;上海那边的快递员负责派送到家;朋友收到后拆开包装、吃月饼。每个环节只关心自己的事情,不需要知道其他环节怎么实现。你写地址不需要会开卡车,快递员也不需要知道月饼里有几个蛋黄莲蓉。
网络通信同理。一台电脑上的应用程序A要向另一台电脑上的应用程序B发数据,要解决的问题包括:怎么把数据切分、丢了怎么重传、路径怎么选、我怎么知道对端是谁、物理上怎么把比特流送出去。这些问题混杂在一起的话,任何一次修改都是牵一发动全身。
2.2 分层的两条主线:OSI七层与TCP/IP四层
教科书上会讲OSI七层参考模型,实际互联网跑的是TCP/IP协议栈。两套模型经常把人绕晕,先列个对照关系让你心里有底:
| OSI七层模型 | TCP/IP四层模型 | 典型协议/设备 |
|---|---|---|
| 应用层 | 应用层 | HTTP、HTTPS、DNS、FTP、SMTP |
| 表示层 | 应用层 | SSL/TLS(加密)、JPEG、ASCII(基本归到应用层实现) |
| 会话层 | 应用层 | 会话建立、断点续传(基本归到应用层实现) |
| 传输层 | 传输层 | TCP、UDP,端口概念在这层 |
| 网络层 | 网络层 | IP、ICMP、路由器、通过IP寻址 |
| 数据链路层 | 网络接口层 | Ethernet、MAC地址、交换机 |
| 物理层 | 网络接口层 | 网线、光纤、中继器、集线器 |
很多资料说OSI是理论模型,TCP/IP是事实标准,这个说法没问题。OSI的问题在于“理想太丰满”——分层太细,工程里不好实现。比如表示层的加密压缩,在TLS协议出现后就变成了应用层和传输层之间的一个独立小层,不单独归类到OSI的哪一层。所以现实排障中,你说“七层里边哪一层出了问题”,别人基本能懂,但落到代码层面都是按TCP/IP模型考虑。
2.3 各层核心职责(面试高频区)
- 物理层:解决原始比特流的传输。规定电压高低代表0还是1、一个比特持续多少纳秒、接口长什么样。家用网线RJ45头就是物理层的接口。
- 数据链路层:主要解决同一链路内两个相邻节点间的可靠通信。它在IP包外面套上以太网帧头帧尾,里面包含源MAC地址、目标MAC地址等。交换机在这一层工作。
- 网络层:核心是IP协议,负责路径选择和逻辑寻址。路由器在这一层工作。跨网络的包要交给路由器转发,路由器查路由表决定下一跳是谁。
- 传输层:核心任务是解决“数据应该交给这台机器上的哪个进程”。TCP/UDP用端口号实现多路复用。TCP还负责可靠传输、流量控制、拥塞控制。
- 应用层:面向具体业务场景制定数据格式和交互规则。HTTP规定请求响应格式,DNS规定域名和IP怎么互相转换,FTP规定怎么传文件。
2.4 分层的核心价值
分层解决了三个核心问题。第一是标准化:只要接口约定好,每层内部怎么实现可以不同厂商各做各的,但互联互通没问题。你买的路由器是华为的,光猫是中兴的,手机是苹果的,它们能互相对话,全靠标准化的协议接口。第二是灵活性:替换某一层的实现,不影响其他层。从网线升级到光纤,应用层毫无感知;从HTTP/1.1升级到HTTP/2,网络层和传输层也不用改。第三是排障范围界定:某层出问题通常只影响该层相关的功能,可以快速缩小范围。
3. 数据要出门,先“穿衣服”:封装与解封装全过程
3.1 一个请求从浏览器到服务器的旅程
这是我带新人时最喜欢讲的例子。想象你在浏览器输入 http://www.example.com 并回车。这个看似简单的动作,在协议栈里走了一整趟流程。
应用层生成HTTP请求报文,内容是“GET / HTTP/1.1,Host: www.example.com”。传输层把这段数据交给TCP,TCP要做的事情是把HTTP报文视为“载荷数据”,在它前面加TCP头,包含源端口(比如浏览器随机选的53241)和目标端口(80)。TCP主要考虑:怎么把这个流拆成合适的段、编号多少、校验和是多少等。
网络层收到TCP段后,再在前面加IP头。IP头里最核心的信息是源IP地址和目标IP地址。目标IP地址来自DNS解析——浏览器先向DNS服务器查询www.example.com对应的IP地址,拿到结果之后,才进入发数据阶段。
数据链路层拿到IP报文,在前面加以太网头(含源MAC和目标MAC),在尾部加FCS帧校验序列,封成帧,然后通过物理层的网卡把比特流转成电信号或者光信号发出去。中间设备会不停把数据拆开改头再封上——路由器会拆掉帧看IP头,再重新封装发到下一跳;交换机只看MAC地址做转发。到了服务器以后,顺序反过来,一层一层把信封拆开,从以太网头、IP头、TCP头一路拆到应用层,最终HTTP服务器读到你的请求,返回响应。
需要特别记住的是:在发送端,数据是自上而下逐层封装;在接收端,是自下而上逐层解封装。
3.2 相邻层之间靠“服务访问点”找关系
分层只是逻辑上的概念,真正实现的时候相邻层之间怎么调用?答案是通过“服务访问点”(SAP),每一层用特定的封装格式把上一层的数据包进来。
比如TCP协议通过端口号向上层提供多个访问点——不同的端口对应不同的应用进程,HTTP服务监听80,HTTPS监听443,SSH监听22。IP协议则通过“协议号”标识上层用的到底是TCP(值为6)还是UDP(值为17)。一个IP包里如果协议号是6,就知道这个包要交给TCP模块处理。以太网帧头里也有一个类型字段,比如0x0800表示上层是IPv4,0x0806表示上层是ARP报文。这些看似是零碎的知识点,其实是协议之间沟通的“暗号”,在排查问题时很有用,抓包时看到这些值就能迅速判断包的类型。
3.3 MTU:为什么一个数据包不能太大
数据链路层对外出数据包的大小有限制,以太网标准中,帧数据部分的最大传输单元MTU为1500字节。如果一个IP报文超过1500字节,就无法直接放进一个帧里,需要在IP层做分片。分片后的每个片段都作为独立IP包发送,到达目的端后在IP层重新组装。
这个知识点经常导致实际应用出问题。最常见的场景是UDP通信。假如应用层一次性发送一个2000字节的UDP报文,到了IP层就超过MTU了,IP层会分片。如果某个分片丢了,整个UDP报文都重组不回来,应用层会认为数据丢了。在跨公网传输某些GRE隧道场景中,MTU不一致经常会导致“能ping通但大包传不了”的奇怪故障。
你在本机执行 ping -l 1472(Windows)或 ping -s 1472(Linux)时,那是因为ICMP数据+ICMP头(8字节)+IP头(20字节)凑成1500字节整好不触发分片。如果你想测MTU边界,通常就用这种带负载的ping逐级测试。
4. TCP/IP协议栈的核心组件逐个看
4.1 应用层:HTTP、DNS、DHCP是最常接触的协议
应用层的协议种类最多,但和我们日常开发关系最紧的是以下几个。
HTTP是网络应用开发的核心协议。建立在TCP之上,默认端口80。HTTP/1.1时代最主要的特征是“对同一个域名复用TCP连接”,而HTTP/2引入了多路复用、头部压缩、服务器推送等机制。做接口开发和性能测试,至少需要知道请求报文由请求行、请求头、空行、请求体组成,响应报文由状态行、响应头、空行、响应体组成。过去经常遇到的“为什么Chrome对同一个域名只能同时发6个TCP连接”就是HTTP/1.1的连接数限制问题,很多面试题会借此引出队头阻塞,再联系到HTTP/2的引入动机。
DNS是域名系统,它的存在让人不用记一长串IP地址。整个DNS解析过程本身就是一次复杂的分布式查询过程:先查浏览器缓存、再查操作系统hosts、然后查本地DNS服务器、如果本地没有就向根域名服务器、顶级域名服务器、权威域名服务器逐级迭代查询。排障建议第一条就是查DNS配置,很多时候你访问不了某个网站,换一个公共DNS就好了。
DHCP是局域网内自动分配IP的协议。当设备接入网络时会发DHCP Discover广播包,DHCP服务器响应Offer、设备发送Request、服务器确认ACK。在学习阶段可以自己抓包看这个过程,非常直观,整个过程就叫DHCP四步。
4.2 传输层:TCP的可靠性与UDP的轻量
TCP面临的核心难题是:下层提供的是“尽力而为”的不可靠传输,分组可能丢失、可能乱序、可能重复。为了让上层用起来像一条可靠字节流,TCP设计了序号机制、确认应答、超时重传、流量控制、拥塞控制等一整套机制。三次握手建立连接是为了让双方确认彼此的收发能力都正常,四次挥手断开连接是为了处理双方数据发送完毕但可能还有数据收尾的场景。真正用好TCP,需要理解“序号表示的是字节流的位置,而不是报文段的数量”这句话,粘包和拆包、滑动窗口、快速重传这些难题都基于对这个概念的把握。
UDP就简单很多,没有连接、没有可靠保证,发送完就完了。但正因如此,实时性更好、开销更小。DNS查询默认使用UDP(端口53),视频通话、语音使用UDP或基于UDP的QUIC协议。选TCP还是UDP,核心得看业务场景:文件传输、网页请求这类要求可靠性的用TCP;实时音视频这类能容忍少量丢失但不能容忍重传延迟的用UDP。
4.3 网络层:IP寻址、子网划分、路由
IPv4地址是32位二进制,通常写成点分十进制。一个完整的IP配置除了IP本身还有子网掩码和默认网关。子网掩码的作用是帮主机判断目标IP和自己在不在同一个子网:在同一个子网就自己通过ARP广播找对方MAC;不在同一个子网就把包发给默认网关,让路由器转发。
期末考试中经常涉及的计算题包括:给一个网段,用若干位划分子网,计算可用的主机数量、广播地址、子网范围等。这里的关键是牢记公式:一个子网内可用主机数量 = 2^(32-前缀长度) - 2,减掉的是网络地址和广播地址。比如 192.168.1.0/24 这个网段,可用主机是254个,范围从 192.168.1.1 到 192.168.1.254,网络地址 192.168.1.0,广播地址 192.168.1.255。实际做网络规划时,私网IP段常见的有三个:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。在云上建VPC,第一步就是规划CIDR网段,如果一开始规划小了,后期扩容会很痛苦。
路由技术解决的核心问题是“从一个网络到另一个网络走哪条路”。路由器维护一张路由表,里面记录目的网段和对应的下一跳地址。路由表可以静态配置,也可以通过RIP、OSPF、BGP等动态路由协议学习。理解路由只需抓住一个核心:路由器只查目的IP的网络部分,不关心目的主机的完整地址,因为到了目标网段之后,最后一跳会通过ARP找到具体主机。
4.4 ARP:从IP地址找到MAC地址
ARP是网络层和数据链路层之间的桥梁。当一台设备知道目的IP但不知道目的MAC时,会在本地子网里广播一个ARP请求:“谁的IP是192.168.1.10?请把你的MAC地址告诉我。”拥有这个IP的设备会单播回复自己的MAC地址,请求者收到后把它写进ARP缓存表,下次直接用,省得再广播。
ARP问题常见的坑是“ARP欺骗”,也就是有人冒充网关的MAC地址回应请求,让局域网的流量全部经过攻击者的机器。排查思路包括检查本机ARP表(Windows用 arp -a),看看网关IP对应的MAC是不是正常值。作为普通开发,你至少要知道 arp -d 可以清空缓存,遇到ARP表异常导致无法上网时可以试试。
5. 掌握排查技能:从traceroute到抓包分析
5.1 常用的网络排查工具
排查网络问题,最常用就是下面这几条命令。
- ping:基于ICMP协议,用于测试目标设备是否可达、测量往返时间。ping不通不代表服务不可用,因为很多服务器对安全要求高,在防火墙层直接丢弃了ICMP报文,但业务端口仍然提供正常服务。
- traceroute(Windows下是
tracert):用于探测从本机到目标主机经过了哪些路由节点。它利用IP头里的TTL字段,先发TTL=1的包,第一跳路由器发现TTL耗尽,会回一个ICMP超时报文,这样你就知道了第一跳地址;然后TTL=2,以此类推。它能帮你定位是哪个中间节点延迟高,或者在哪一跳丢包严重。 - ipconfig / ifconfig:查看本机IP配置。重点看IP地址、子网掩码、默认网关、DNS服务器。
- netstat:查看本机网络连接状态和端口监听情况。排查端口被占用、查看已建立的TCP连接时非常有用。
- nslookup / dig:手动查DNS解析结果,用于区分是DNS问题还是其他问题。
5.2 抓包工具Wireshark的入门思路
每次带新人排查网络问题,我都会建议:不要猜,直接抓包看证据。Wireshark能看到数据包在每一层的样子——物理层不用管,以太网头看到MAC、IP头看到IP和TTL、TCP头看到端口和Seq/Ack号、应用层能看到HTTP请求内容。
初学抓包建议只看几个关键维度:
- 过滤表达式:
ip.addr == 8.8.8.8只看某个IP的流量、tcp.port == 443只看某个端口的流量、http只看HTTP流量。 - TCP三次握手:在Wireshark里输入
tcp.flags.syn == 1,可以看到最前面的三个包,分别是SYN、SYN+ACK、ACK,非常直观。 - HTTP请求响应:过滤出HTTP请求后,Wireshark会自动把请求行、请求头、响应状态码展开,比浏览器F12开发者工具看到的更底层。
5.3 局域网里最常见的几个问题和解法
第一种是“连接不上路由器,拿不到IP”。物理链路没问题,但设备一直显示无法连接。先查DHCP是否正常工作,看是否网内有多个DHCP服务器造成冲突。用静态IP配一个同网段的地址,直接ping网关测试二层通不通。
第二种是“能ping通IP但打不开网页”。这大概率是DNS出了问题。可以用 nslookup www.example.com 测试解析是否正常,检查系统网络适配器里填的DNS服务器地址,尝试换成公共DNS。
第三种是“延迟时高时低”。需要区分是无线链路问题还是跨互联网的问题。近距离ping无线路由器的LAN口IP,如果延迟都不稳定,那就基本可以锁定是本地无线干扰、信道拥堵或路由器性能问题;如果本地正常但ping公网IP不稳定,那是出口带宽或运营商链路的问题。
6. 学习路径、面试重点与备考建议
6.1 这套知识树应该怎么系统学
建议按四步走:先看一遍分层模型,建立整体框架;然后跟着HTTP、DNS、TCP、IP的顺序深入学,因为这几个协议是开发场景中最高频的;再通过抓包和命令验证所学内容;最后刷题,用题目查漏补缺。
特别推荐尝试用代码写一个简单的TCP服务端和客户端。不需要框架,就用Java或Python内置的socket库,自己实现一个“客户端发消息,服务端返回响应”的简单程序。在这个过程里启动Wireshark监听loopback接口,你会亲眼看到三次握手、数据分段、序号变化、四次挥手。这个实验做完,再回头看课本上那些字段定义,会感觉书上每一个字都有落点了。
6.2 期末复习和考研408复习的侧重点差异
如果是期末复习,重点通常是“背概念、会计算、懂流程”。比如各类交换方式对比、OSI各层功能、TCP和UDP头格式比较、子网划分计算等。这类型的考试更看重你对定义、分类、流程的准确记忆,所以宜多画图多默写框架。
如果是准备408或相关工作面试,考察逻辑就完全不一样了。408真题喜欢综合各个章节去考你,一道选择题可能会综合TCP首部、IP分片、路由转发多个知识点。这就不能用单纯记忆来应对了,必须建立起“整个协议栈在真实环境中如何协同工作”的心智模型。实际面试中经常被追问的高频考点包括“TCP的拥塞控制有几个阶段,慢启动阈值怎么变化”“三次握手可以携带数据吗,为什么第三次握手可以”“描述从浏览器输入URL到页面展示的完整过程”。
6.3 关于参考书和资料的选型建议
经典教材各有各的侧重点。谢希仁的《计算机网络》是国内很多高校的教材,概念严谨、体系完整,适合跟着上课进度精读。如果备考408,王道考研的辅导书核心是帮你把教材内容压缩成考点和题型的对应关系,配合真题刷效果好。湖科大教书匠的视频对协议流程的动画演示是做得很直观的,对“数据包从一层到另一层到底长什么样”这类抽象问题的理解帮助很大。如果是自学英语能力又允许,计算机网络自顶向下这本书的可读性更强,它从应用层开始讲起,先让你看到东西,再回头看底层,会“哇”一声原来是这么回事的概率高很多。
重要的不是买一大堆书,而是选定一到两本,扎扎实实把图从头画到尾。拿一张A4纸,把TCP/IP四层从左到右画出来,然后把HTTP、TCP、IP、Ethernet每一层的头部字段按顺序填进去,最后用一条实际访问网页的链路把每层串起来。画完这张图,这门课百分之六十的核心知识就都在你脑子里了。
6.4 核心考点速查手册
| 考点 | 必须掌握内容 | 常见坑 |
|---|---|---|
| 协议分层 | OSI与TCP/IP对应关系,各层PDU名称(数据段、数据包、数据帧) | 把表示层会话层功能和TCP/IP混在一起 |
| 封装与解封装 | 数据从应用层到物理层的逐层加头过程 | 忘记链路层在帧尾也加FCS字段 |
| TCP与UDP对比 | TCP头部至少20字节、UDP头部8字节、TCP面向字节流 | 误认为TCP保证报文边界 |
| 三次握手与四次挥手 | 状态迁移:SYN_SENT、ESTABLISHED、FIN_WAIT、TIME_WAIT | 忘记TIME_WAIT是谁先进入的,以及持续时长(2MSL) |
| IP地址与子网划分 | 网络地址、广播地址、可用主机数、CIDR表示法 | 算可用主机数忘记减2 |
| MTU与分片 | 以太网MTU为1500字节,IP分片在目的端重组 | 误认为分片在路径沿途不断重组 |
| ARP协议 | 广播请求、单播回复、缓存机制 | 把ARP认为是IP层动作,实际它工作在“链路层与网络层之间” |
7. 一些容易踩的坑和我个人的理解
最后说几个我实际工作和带人中反复遇到的问题,希望你提前避开。
第一,不要试图一上来就背协议字段。从头字段到状态码逐条硬记,效率低且忘得快。先记住“这个字段是干什么用的”——比如TTL防环、端口选进程、序号搞排序——把用途想明白了,字段数值的记忆会自然绑定到用途上,不需要刻意背。
第二,区分“理论上的网络”和“实际上的网络”。理论模型告诉你“TCP是可靠的”,但实际应用里TCP连接会超时、会断开、会半开。如果业务重要,传输层之上仍需要做超时重试和幂等设计。这点做后端开发的感触最深:消息队列为什么需要手动ACK、为什么消费者要幂等,底层逻辑都跟“网络并不可靠”这件事直接相关。
第三,网络问题排查的标准动作是“先看两层”:先看物理层和链路层通不通,再看网络层通不通,最后才排查传输层和应用层。很多新手一上来就怀疑代码或服务器配置,结果折腾了半天发现是网线松了或者IP地址配错。我个人的习惯是无论问题表象在应用层还是业务层,先ping一下网关、再ping目标服务器IP、然后telnet目标的端口,把这套链路跑完,问题的范围就缩得很小了。
计算机网络这门课的特殊之处在于,它既是一个独立领域,又是几乎所有后端技术的基础。把分层的思维模式内化之后,你会发现不光网络协议是分层的,操作系统、分布式系统乃至大型软件架构都有类似的分层设计思路。理解了为什么而分层,抓住数据封装这一条主线,后面的路会顺畅很多。
