简介:这是一份面向本科生期末复习的《计算机网络自顶向下》笔记,以TCP/IP模型为主线,梳理了主机、通信链路、分组交换机、ISP、TCP、IP协议等基础概念,以及五层因特网协议栈的结构。笔记对电路交换与分组交换的区别、四类时延、吞吐量、家庭与企业网络接入方式、引导型与非引导型物理媒体、应用层典型协议等内容均做了归纳,适合考试前快速回顾。资源为单个PDF文件,压缩包约4.08MB,便于下载后离线阅读或打印使用。当前已有1070人学习下载,对期末备考有一定参考价值。需要注意的是,笔记在应用层到传输层部分略有欠缺,建议结合考试大纲补充HTTP、TCP、UDP等协议的细节,以便构建更完整的知识体系。
1. 先别怕:计算机网络到底是什么
很多人一听到“计算机网络 复习笔记”就头大,因为书里每个术语都像从天而降:主机、分组交换机、ISP、HTTP、DNS……翻开目录全都眼熟,合上书却串不成一条线。其实你完全不用慌:整门课只解决一个问题——一台设备怎么把一段数据,在各种复杂链路和节点之间,送到另一台设备手上。你可以把它想象成快递系统:主机是发件人和收件人,通信链路是运输公路,分组交换机是沿途中转站,ISP是快递公司,数据被拆成一个个“包裹”(分组)依次发出,到了终点再拼装还原。谁负责拆包、谁负责认路、谁保证不丢件,这就是网络协议栈干的活。这篇文章专门写给两类人:一类是为期末突击复习的本科生,另一类是刚转行想补网络理论的零基础新手。目标不是让你背下所有细节,而是帮你建立一条主线,敢翻开课本,敢上手跑第一个程序。
2. 先搞懂两个核心概念:协议是什么,数据怎么交换
计算机网络里最劝退的就是一上来铺几十个术语。但其实真正的地基只有两块:第一,通信必须讲规矩,这就是“协议”;第二,数据从 A 到 B 有两条主流走法,这就是“电路交换”和“分组交换”。这两块通了,后面每章都是在这个框架里填细节。
2.1 协议:通信双方共同遵守的规矩
协议的定义在书上是这么写的:定义了两个或多个通信实体之间交换的报文格式和次序,以及报文发送或接收一条报文或其他事件所采用的动作。听起来很绕,拆成大白话就三件事:长什么样、谁先谁后、收到后做什么。
举个例子。两个人打电话,一个只说中文,一个只说英语,双方又没有翻译,那这通电话根本进行不下去。哪怕都用中文,如果两个人同时开口、没人听对方说完,信息也是乱的。网络协议干的就是这件事:它规定报文用什么格式写、在哪一步发、接收方收到后怎么回应。HTTP、IP、TCP 这些名字,本质上都是“一套被大家认可的语言规则”。
我第一次学的时候,总觉得每个协议都要背一大堆属性,压力很大。后来发现一条经验很管用:遇到任何协议,先问三个问题——它传送的数据长什么样?它什么时候发?对方收到之后要做什么?比如后面要讲的 HTTP,它就是客户端先发一个请求报文,服务器收到后回一个响应报文,两边报文格式不一样,顺序固定,动作明确。把这三个问题能答上来,这个协议你就已经懂了一半。
2.2 电路交换与分组交换:两种完全不同的送货方式
假设你要从 A 城传一份数据到 B 城,最朴素的选择是:先修一条专用通道,整条路都给你留着,传完再释放;或者把数据切成小块,每一块自己找路,到了再拼。前者就是电路交换,后者就是分组交换。
电路交换的特点是“预留资源”。就像打电话,拨通之后,这条线路上从你到对方之间的资源就被占用了,哪怕你俩都沉默不说话,别人也不能用这段线路。它靠频分复用(FDM)或时分复用(TDM)把线路切成多个通道,每个通话独占一个通道。好处是延迟稳定,坏处是利用率低——不说话也占着坑。
分组交换则完全相反。它不预留任何资源,数据被拆成一个个分组,每个分组独立地在网络里走,路由器看到分组的目的地址后临时决定下一跳往哪送。这就和发快递一样:每个包裹到了中转站,工作人员看一眼面单,把它丢上开往下一站的货车。多个包裹可以挤在同一辆车上,这就是“更好的带宽共享”。它简单、成本低,但也会带来排队时延和丢包问题。
下面这张表我建议收藏,期末复习时用 30 秒就能把两套机制的区别说清楚:
| 对比维度 | 电路交换 | 分组交换 |
|---|---|---|
| 资源预留 | 提前预留整条路径资源 | 不预留,按需抢占 |
| 带宽共享 | 差,独占线路 | 好,多路共享 |
| 线路利用率 | 空闲时浪费严重 | 高,但可能排队 |
| 时延表现 | 稳定、可预期 | 有排队时延,波动大 |
| 典型场景 | 传统电话网络 | 因特网 |
2.3 时延和丢包:分组交换的代价
分组交换这么省资源,代价是什么?就是数据在每一站都可能“等一会儿”。书上把时延分成四类:
| 时延类型 | 一句话解释 | 产生位置 |
|---|---|---|
| 处理时延 | 检查分组头部、决定往哪走 | 路由器 |
| 排队时延 | 在缓冲队列里等前面的分组先走 | 路由器出口队列 |
| 传输时延 | 把整个分组“推”到链路上去的时间 | 链路入口 |
| 传播时延 | 比特在链路上“跑”的时间 | 链路上 |
我最早总把传输时延和传播时延弄混。后来靠一个比喻记住了:传输时延是把一盒饼干从盒子里倒出来的时间,取决于饼干数量和倒的速度;传播时延是饼干盒上了传送带之后,从这头运到那头的时间,取决于传送带有多长。前者算的是“装车耗时”,后者算的是“路途耗时”。
更关键的是排队时延背后的那个公式:如果分组到达队列的平均速率是 a pkt/s,每个分组大小 L bit,链路传输速率 R bps,那么比特到达队列的平均速率就是 La。流量强度等于 La/R。当这个值接近 1,队列长度会无限增长;超过 1,路由器缓冲区装不下,就会丢包。我复习的时候就用这个公式判断“什么时候会丢包”,比死记结论管用得多。
3. 数据怎么跑起来:接入方式、协议栈和网络性能
上一章把“发送数据”这件事讲通了。这一章我们把视角拉开:数据从你家出发,到服务器,中间经历了哪些“路况”;这些路况拼起来,就是网络的分层模型。
3.1 网络接入:家庭、企业和无线
端系统接入网络,就像你从小区门口上高速,入口选了哪条路,直接决定了你的速度和稳定性。家庭场景常见的有五种:第一种是 DSL,也就是数字用户线,走的是电话线,由本地电话公司提供;第二种是电缆,走有线电视线,由有线电视公司提供;第三种是 FTTH,光纤到户,目前体验最好,带宽上限高;第四种是拨号,老古董,速度只有约 56kbps,现在基本见不到;第五种是卫星,适合偏远地区,代价是传播时延较大。
企业和家庭还不一样。企业网络最流行的是以太网,也就是用网线连交换机再统一出口,稳定可控;家庭和移动端则大量使用 Wi-Fi,即无线局域网。广域无线接入则包括 3G 和 LTE,这就是手机上网的底层通道。入门的话建议先把 DSL、电缆、FTTH 三者的区别记住:一个用电话线、一个用电视线、一个用光纤,它们的传输介质和提供方都不同。
网络接入还涉及一个有意思的概念:物理媒体怎么看。引导型媒体里,电波沿固体媒体传播,常见的是双绞铜线、同轴电缆和光纤;非引导型媒体里,电波在空气或空间中传播,对应陆地无线信道和卫星无线信道。记不住的话,就记住一句话:有形的线有两条铜线绞一起、有粗同轴线、有玻璃光纤;无形的是空气和太空。
3.2 五层协议栈:每层都在干什么
有了接入方式,数据还得穿越重重“检查站”。因特网把网络功能分成五层,这个分层思想是整门课的骨架,也是期末最爱考的大题。
我用寄快递来打比方。应用层就是你写好的信件内容,比如一个 HTTP 请求,这一层叫“报文”(Message);运输层像快递单,写上端口号,保证这封信能交到对方主机上对应的程序手里,数据单位叫“报文段”(Segment);网络层像快递公司的干线调度,按 IP 地址决定包裹走哪条大路,数据单位叫“数据报”(Datagram);链路层像同一个城市里从分拨中心到小区的短途运输,数据单位叫“帧”(Frame);物理层就是货车本身,在公路上传输一个个比特。
值得注意:国际标准化组织提出的 OSI 模型是七层的,但实际互联网用的是五层协议栈。五层从上到下是:应用层、运输层、网络层、链路层、物理层。面试和考试都爱问“每一层的数据单位叫什么”,我把它们连成一串方便记忆:报文、报文段、数据报、帧、比特。每次我复习到协议栈,都会在心里默念这五个词,顺序不乱,层级关系就不会乱。
3.3 时延细节与存储转发:为什么慢、为什么丢
分组交换机在链路的输入端通常采用“存储转发”机制:必须把整个分组接收完,才决定下一步转发,而不是边收边发。就好比快递中转站不会收到半件货就装车,必须等一个完整包裹到了,扫描完面单,再送上下一辆车。这个机制保证了转发决定是准确的,但也意味着每经过一个交换机,就会产生一次完整的传输时延。
如果源和目的地之间有 N-1 台分组交换机,也就是一共 N 条链路,那么端到端的总传输时延要乘以链路条数。考试里常会出现这种题:给你分组大小 L、链路速率 R、链路长度和传播速度,让你算总时延。记住一个原则:传输时延只跟 L 和 R 有关,传播时延只跟链路长度和传播速度有关,两者相加别漏任何一段就行。
排队时延和丢包的关系前面已经提过。流量强度接近 1 时,队列越来越长;一旦超过 1,缓冲区满,后来的分组直接被丢弃。丢包之后怎么办?这就要靠运输层协议决定是否重传,也是 TCP 存在的意义。另外,很多人做网络应用题时会忽略“吞吐量”这个指标。其实对于文件传输,时延没那么重要,真正决定下载快不快的是吞吐量。平均吞吐量等于文件大小除以传输时间,如果你觉得某个传输过程特别慢,先别怀疑时延,先去算吞吐量是不是被链路瓶颈卡住了。
4. 应用层实战:HTTP、DNS、FTP、SMTP、P2P 都在干什么
前面把底层链路讲清楚了,现在我们跳到离用户最近的一层——应用层。你每天打开网页、发邮件、输域名,用的都是这些协议。这一章我不会罗列所有细节,而是按“这个协议解决什么问题”来讲,你顺着这个思路复习,比一遍遍抄定义记得牢。
4.1 HTTP:网页请求是怎么完成的
HTTP 是 Web 的基石。它做的事情很简单:Web 客户端向 Web 服务器请求一个网页,服务器把网页传回来。它运行在 TCP 之上,默认端口号是 80。第一次接触它时只需记住一个性格特点:无状态。什么意思?服务器不会记得你上次请求过什么,哪怕你两秒前刚请求过同一个对象,这次请求它也会老老实实重新发一遍给你。正因为无状态,才有了 Cookie 这种东西——服务器靠 Cookie 在用户本地留下标记,下一次请求带上它,服务器就能识别“老熟人”。
复习 HTTP 时可以按“发起请求—组织报文—处理响应”这条线走。请求报文第一行是请求行,包含方法字段(GET、POST、HEAD、PUT、DELETE)、URL 和 HTTP 版本三部分;后面是首部行,比如 Host 指明主机位置,Connection 决定是持续还是非持续连接,User-Agent 告诉服务器浏览器类型。响应报文第一行是状态行,包含协议版本、状态码和相应状态信息,后面是首部行和实体体。
4.2 持续连接与非持续连接:一个关键性能差异
HTTP 有两种工作方式,这是期末必考点。非持续连接:每个 TCP 连接只传输一个请求报文和一个响应报文。如果你请求的网页里有 10 个对象,那就得建立 10 次 TCP 连接。这里有个概念叫 RTT,往返时间,就是一个短分组从客户到服务器再回来的时间。非持续连接传输一个对象,需要两次 RTT:一次用来建立 TCP 连接,一次用来请求和接收对象。
持续连接就好多了:服务器在发送响应后,保持这条 TCP 连接不关闭,后续请求继续走同一条连接,省去了反复握手的时间。现在浏览器默认都是持续连接。我做题时的口诀是:非持续连接“一对象一连接”,考试只要看到“请求 10 个对象”,第一反应就是它要建 10 次连接,除非题目明说是持续连接。
4.3 报文格式、状态码、Cookie 与 Web 缓存
状态码是应用层最容易拿分的地方,不用全背,记住最常见的几个就够:
| 状态码 | 含义 | 一句话记忆 |
|---|---|---|
| 200 OK | 请求成功 | 一切正常 |
| 301 Moved Permanently | 请求对象已永久转移 | 搬家了,去新地址 |
| 400 Bad Request | 服务器不理解该请求 | 你发的请求有问题 |
| 404 Not Found | 请求对象不存在 | 网页没找到 |
| 505 HTTP Version Not Supported | HTTP 版本不支持 | 版本太老或太新 |
Cookie 解决的是 HTTP 无状态带来的“不认识你”问题。它的组件有四个:HTTP 响应报文里的 cookie 首部、请求报文里的 cookie 首部、用户端系统里的 cookie 文件(由浏览器管理)、Web 站点的后端数据库。我第一次学的时候觉得这四个组件很难串起来,后来用网购类比就通了:服务器第一次响应时给你发一张会员卡(响应 cookie),你之后每次去都带上这张卡(请求 cookie),卡存在你的钱包里(浏览器管理的 cookie 文件),商家数据库里存着你的消费记录。这一套下来,服务器就把你认出来了。
Web 缓存也值得单独说。它又叫代理服务器,是能代表初始 Web 服务器满足 HTTP 请求的网络实体。多搞几个缓存,能明显减少客户请求响应时间,也能减少机构接入链路到因特网的流量。但缓存有隐患:它存的可能是旧文件。解决办法是条件 GET 方法。过程很简单:缓存器向初始服务器发起条件请求,带上 If-modified-since 头,写上缓存文件的最新修改时间;如果初始服务器上的文件没变,就返回 304 Not Modified,不带实体体,这样既省流量又保证新鲜。
4.4 DNS:域名到 IP 的翻译官
你访问网站时输的是 www.example.com,可网络层寻址靠的是 IP 地址。谁来做这个翻译?DNS。它运行在 UDP 之上,默认端口号是 53。很多人以为 DNS 就是一台大服务器存着所有映射,其实完全不是。出于扩展性和稳定性考虑,DNS 采用层次结构:根 DNS 服务器管顶层分发,顶级域服务器管 com、org、net 以及 cn、uk 这类国家顶级域,权威 DNS 服务器管具体组织机构的主机名和 IP 映射。除此之外,每个网络通常还有一台本地 DNS 服务器,你的请求先到本地这一层,再向上逐层询问。
DNS 查询有两种方式:迭代查询和递归查询。我复习时靠“谁在问、谁在答”来区分:递归查询是“你一层层帮我把答案问到”,迭代查询是“你告诉我下一个该问谁,我自己去问”。用做题来验证最稳:给你一幅图,让你标箭头方向;只要看着请求是从谁发出、又由谁代为转发,就能判断是迭代还是递归。
DNS 记录用四元组表示:(Name, Value, Type, TTL)。TTL 是生存时间。Type 有四种常考:A 记录把主机名映射到 IP 地址,NS 记录把域名映射到能获取该域主机 IP 的权威 DNS 服务器的主机名,CNAME 记录把别名映射到规范主机名,MX 记录把邮件服务器别名映射到规范主机名。用一句话串起来:A 是最终答案,NS 是告诉你去哪问,CNAME 和 MX 是“别名的真身”。
4.5 FTP、SMTP 与邮件访问协议:不只是“传文件”和“发邮件”
FTP 用于主机与远程主机之间的文件传输,默认端口 21,使用 TCP。它有个容易混淆的特性:使用两个并行的 TCP 连接——控制连接和数据连接。控制连接贯穿整个用户会话期间,用来传输命令;数据连接在每次文件传输时新建,传完就关。我第一次做题时只记了 21 端口,结果题目问“数据连接用什么端口”时傻眼了。答案是:数据连接端口不固定,随命令动态协商。这就是它有状态协议的原因——服务器需要记住用户在远程主机的目录位置和控制信息。
SMTP 是邮件发送协议,默认端口 25,使用 TCP。它是“推”协议:发送方的邮件服务器主动把报文推到接收方的邮件服务器。它有几个性格特点:一般不使用中间服务器发送邮件;报文必须用 7 比特 ASCII 码格式,非 ASCII 内容要先重新编码;所有对象放在同一个报文里发送。而 POP3 和 IMAP 是“拉”协议,负责把邮件从邮件服务器拉到用户本地主机。POP3 有三个阶段:特许(输用户名和口令)、事务处理(取信、删标记),以及更新(退出后删除标记的报文)。IMAP 则更强,支持在远程文件夹里整理邮件,并且维护会话的用户状态信息。用一句话总结:SMTP 负责把信投进对方邮箱,POP3/IMAP 负责从邮箱里把信取回来读。
4.6 P2P 与 BitTorrent:下载是怎么变快的
前面讲的都是客户-服务器结构,服务器容易成为瓶颈。P2P 的思路是:所有人既是下载者也是上传者。文件分发时间在这个模型里大大缩短,因为每个对等方下载完一部分,就可以把这一部分上传给别人,整个网络的上传能力随着节点增加而增大。我在理解 P2P 后,立刻明白了为什么以前热门资源下载“人越多越快”。
BitTorrent 是 P2P 文件分发的具体协议。几个术语要记住:洪流(torrent)是所有对等方的集合;文件块(chunk)是对等方之间传输的固定大小块,典型值 256KB;追踪器(tracker)负责跟踪对等方,每台机器加入洪流时先在 tracker 上注册。最稀缺优先原则是:优先请求邻居中副本最少的块,目的是让每个块在洪流里的副本数量更均衡。疏通机制则是定期为给你上传速度最高的 4 个对等方优先服务,每 10 秒更新一次;同时每 30 秒随机选一名邻居发送数据,避免完全封闭的小圈子。这块概念多,建议画一张“对等方—tracker—块请求”的流向图,画一遍就懂。
5. 新手最容易踩的五个坑
复习计算机网络时,很多错误其实是共性错误。下面这五个坑我当年全踩过,每一条给你说清现象、原因和解决办法,帮你绕过去。
5.1 坑一:传输时延和传播时延混着算
现象:做题时把分组大小和链路长度放进同一个公式,算出来的数毫无意义。原因:分不清“装车耗时”和“路途耗时”。解决:传输时延用分组长度 L 除以传输速率 R 计算,只看有个多长的分组、以多快的速率推上链路;传播时延用链路长度除以传播速度计算,只看链路有多长。考试时先判断题目问的是“推到链路上的时间”还是“在链路上跑的时间”,再选公式。
5.2 坑二:非持续连接的理解卡在“连接”上
现象:题目说网页里有 5 个对象,问你非持续连接需要多少次 RTT,算出来是 5 次或 6 次。原因:忽略了每个对象都要独占一个 TCP 连接,而且每次连接都要先经过一次握手 RTT。解决:记住公式“建立 TCP 连接一次 RTT + 请求对象一次 RTT = 一个对象两次 RTT”,然后乘以对象个数。持续连接则只需把建立连接的一次 RTT 平摊给多个对象,如果题目说“持续连接传输全部对象需要多少 RTT”,通常答案是一次握手 RTT 加所有对象各一次请求 RTT。
5.3 坑三:SMTP 是推,POP3/IMAP 是拉,方向弄反
现象:把 SMTP 当成“从邮件服务器下载邮件”的协议。原因:只看中文名“简单邮件传输协议”里的“传输”,没注意传输方向。解决:SMTP 是发送方邮件服务器向接收方邮件服务器推送,发信才用它;收信要用 POP3 或 IMAP,方向是邮件服务器到用户本地。简单记:你写完信寄出去,用的是 SMTP;你打开收件箱读信,用的是 POP3 或 IMAP。
5.4 坑四:端口号和协议对不上
现象:考试把 HTTP 写成 110 端口,把 FTP 数据连接当成 21 端口。原因:背协议时只记了功能,没把端口和传输层协议放进同一条记忆链。解决:按“默认端口+下层协议”成对记。HTTP 是 80/TCP,FTP 是 21/TCP,SMTP 是 25/TCP,POP3 是 110/TCP,DNS 是 53/UDP。注意 DNS 特别,它用的是 UDP,很多人一看到“重要服务”就默认 TCP,这是最容易错的点。
5.5 坑五:DNS 迭代查询和递归查询看图题丢分
现象:看到求箭头图,判断不出哪个节点发起了新的查询。原因:把“谁代替我查”和“告诉我去向”混为一谈。解决:看图时先找本地 DNS 服务器。如果本地服务器把请求转发给根服务器,并等待最终答案,那就是递归;如果根服务器返回“你该去问顶级域服务器”,然后本地服务器自己再去问,那就是迭代。一句话:递归是“代办”,迭代是“指路”。
6. 下一步学什么:从复习笔记到跑通第一个网络程序
概念复习到一定程度,光看书满足不了好奇心。下一步最值得做的事情,就是亲手写一个能通信的小程序。下面这个 UDP 套接字例子是我当年入门时跑通的第一个网络代码,代码量极小,却能让你直观看到“应用层报文怎么通过套接字交给运输层”。
在写代码之前,先理解一个小概念:套接字。它其实就是应用程序和运输层之间的一个软件接口,你可以把它想象成一扇门——进程通过这扇门向网络发送报文,也从这扇门接收报文。网络里怎么定位一个进程?答案是 IP 地址加端口号。IP 找到主机,端口号找到这台主机上的具体进程。理解了这一点,就能读懂下面这段代码。
先启动服务端,在一个终端里运行:
from socket import * serverPort = 12000 serverSocket = socket(AF_INET, SOCK_DGRAM) # AF_INET 表示 IPv4,SOCK_DGRAM 表示 UDP serverSocket.bind(('', serverPort)) # 绑定端口号,等待客户端来消息 print('服务器已就绪,等待接收...') while True: message, clientAddress = serverSocket.recvfrom(2048) # 接收数据,缓存长度 2048 字节 modifiedMessage = message.upper() # 将收到的内容转成大写 serverSocket.sendto(modifiedMessage, clientAddress) # 把结果发回客户端再启动客户端,在另一个终端里运行:
from socket import * serverName = '127.0.0.1' # 本机回环地址,表示服务器就在本机 serverPort = 12000 clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建 UDP 套接字,系统自动分配端口号 message = input('输入一段小写句子:') clientSocket.sendto(message.encode(), (serverName, serverPort)) # 发送到指定主机和端口 modifiedMessage, serverAddress = clientSocket.recvfrom(2048) # 接收服务器返回的结果 print(modifiedMessage.decode()) clientSocket.close()解释一下这两段代码的配合方式。服务端先绑定 12000 端口并进入死循环,随时等待客户端发来消息;客户端把用户输入的内容编码成字节流,通过 UDP 套接字发送到 127.0.0.1:12000。服务端收到后调用 upper() 方法把内容转成大写,再原路返回给客户端;客户端收到后解码并打印。整个过程没有建立连接,UDP 就是这种“发出去就不管”的风格。这也解释了为什么书上说 UDP 不可靠:万一消息丢了,客户端会一直阻塞在 recvfrom 等不到结果。
跑通这个例子之后,你会对“应用层到运输层的接口”有非常具体的体感。下一步建议按这个顺序继续:先把这个程序改成 TCP 版本,体会 TCP 必须先建立连接、再传输数据的“握手感”;然后结合笔记里的 HTTP 报文格式,用 Python 手写一个最简单的 HTTP 请求,把 GET 报文直接发给某个 Web 服务器,观察服务器返回的状态行和首部行。这样,你笔记里背的那些“请求行、状态码、首部行”就全都活过来了。
我从那以后养成了一个习惯:每复习完一个协议,就写一个几行的小程序去“戳”它一下。学 TCP 就写一次客户端连服务器,学 HTTP 就用代码发一个 GET 请求,学 DNS 就用系统命令查一次域名解析。概念背十遍,不如亲手跑通一遍。希望这套方法帮到你,祝你顺利迈过计算机网络这道坎。
本文还有配套的精品资源,点击获取