计算机网络这门课我前前后后复习过三遍每一遍的感受都不一样。第一遍是考前突击抱着教材从物理层一路背到应用层背完脑子里只剩一堆缩写第二遍是准备面试开始琢磨为什么要有这个协议这个字段到底解决什么问题第三遍是工作几年后回头翻才发现当年觉得枯燥的那些分层、握手、重传机制其实全是真实系统里天天在用的东西。这篇复习笔记不是教材搬运而是把我踩过的坑、绕过的弯路、以及后来真正想明白的地方摊开讲一遍。不管你是正在准备期末、准备面试还是工作后想补一补底层基础下面这些内容应该都能对上你的需求。核心关键词就几个分层模型、TCP/IP、三次握手、拥塞控制、HTTP、DNS我会围绕它们把整张知识网串起来而不是孤立地背名词。1. 复习计算机网络最容易走偏的三个方向很多人复习网络的第一反应是打开教材目录从第一章开始逐字看。我试过效率极低而且看完第三章就忘了第一章。问题不在于不努力而在于复习路径选错了。网络这门课的知识是网状结构不是线性的你得先建立骨架再填肉。1.1 把分层模型当成背诵清单而不是理解工具教材讲OSI七层和TCP/IP四层很多人上来就背物理层、数据链路层、网络层、传输层、会话层、表示层、应用层背得滚瓜烂熟但问他为什么需要分层答不上来。这就是典型的把工具当成了目的。分层的本质是关注点分离。你可以这样理解寄快递的时候你只管把东西装进箱子、写好地址至于快递公司怎么分拣、走哪条高速、用卡车还是飞机你不需要操心。每一层只对上一层负责层与层之间通过接口交互。物理层管比特怎么在介质上传输数据链路层管相邻节点之间怎么可靠地传帧网络层管从源到目的怎么选路传输层管端到端的可靠性应用层管具体业务逻辑。我复习时的做法是每学一层就问自己三个问题——这一层解决什么问题它向上提供什么服务它依赖下一层做什么把这三个问题答清楚比背十遍层次名称有用得多。比如传输层它解决的是进程到进程的通信问题向上给应用层提供端口寻址和可靠性选项向下依赖网络层的尽力而为交付。这样一串联TCP和UDP的差异就自然出来了TCP在不可靠的IP之上做可靠传输UDP则基本不做额外保证。提示复习分层时拿一个真实场景走一遍全流程比如在浏览器输入一个网址到页面显示把每一层在这个过程中的动作标出来比干背层次表有效十倍。1.2 协议细节背得太多机制动机想得太少第二个坑是沉迷协议字段。TCP首部二十字节每个字段几位、什么含义背得一字不差但面试官问为什么TCP首部里要有窗口字段就卡住了。字段是结果机制动机才是原因。举个典型例子TCP的序号和确认号。很多人知道序号是字节编号确认号是期望收到的下一个字节编号但不知道为什么这么设计。原因在于TCP是字节流协议不是消息协议它不保留消息边界所以只能用字节编号来追踪哪些数据被确认了。这个设计直接导致了粘包问题——应用层发两次数据接收方可能一次读到因为TCP眼里只有连续的字节流。理解了这一点你就明白为什么应用层协议要么用长度字段、要么用分隔符来自己划边界。再比如慢启动。为什么TCP连接刚建立时要慢慢增加发送速率而不是一上来就全速发因为网络状况未知贸然高速发送可能瞬间压垮中间链路造成大量丢包。慢启动的指数增长是在试探网络容量找到阈值后再转为线性增长。这个动机想通了拥塞控制的整套逻辑就顺了。1.3 只看理论不动手抓包一次胜过读十页书第三个坑最致命全程纸上谈兵。我第一遍复习时三次握手背得滚瓜烂熟但真让我在抓包工具里指出SYN、SYN-ACK、ACK三个包我找不准。后来逼着自己用抓包工具看了一次真实连接建立过程那些字段瞬间就活了。动手这件事没有替代品。你可以用系统自带的命令行工具看DNS解析、看路由跳转、看端口监听用抓包工具看握手、看重传、看窗口变化。哪怕只是在本机访问一个本地服务抓一次包你看到的SYN包里的选项字段、窗口缩放因子都是教材上干巴巴的文字变成活的证据。复习到传输层时抓一次TCP流复习到应用层时抓一次HTTP请求响应复习到网络层时用路由追踪看路径每一层都动手验证一次记忆深度完全不一样。2. 从输入网址到页面呈现一条主线串起所有知识点我后来复习网络只用一条主线在浏览器输入一个网址按下回车到页面显示出来中间发生了什么。这条线能把应用层、传输层、网络层、数据链路层全部串起来而且顺序自然不会东一榔头西一棒子。2.1 DNS解析先把名字换成地址浏览器拿到网址后第一件事是解析域名。这里涉及DNS协议它跑在UDP之上默认端口53。为什么用UDP不用TCP因为DNS查询通常很小一问一答用UDP省去握手开销快。当然大响应或区域传送会用TCP但日常解析基本是UDP。解析过程是递归加迭代的组合。本机先查本地缓存再查hosts文件然后问本地DNS服务器。本地DNS服务器如果没缓存就从根域名服务器开始逐级问顶级域服务器、权威域名服务器最后拿到IP。这个过程中根服务器只告诉你去问com服务器com服务器只告诉你去问某权威服务器这种指路不代劳的方式叫迭代查询而本机对本地DNS服务器的请求是递归的即你帮我查到底。复习时容易忽略的是缓存和TTL。DNS记录有生存时间过期才重新查询。实际排障时很多域名改了但访问还是旧地址的问题就是本地或中间DNS缓存没过期。我踩过一次坑迁移服务后改了A记录本机死活解析到旧IP最后发现是操作系统DNS缓存作祟清一下就好了。这类经验教材不会写但实际很有用。2.2 TCP连接建立三次握手到底在确认什么拿到IP后浏览器要通过TCP建立连接HTTP/1.1和HTTP/2都是HTTP/3走QUIC另说。三次握手的过程大家都熟客户端发SYN服务端回SYN-ACK客户端再发ACK。但复习时要问为什么是三次不是两次或四次核心在于双方都要确认对方的收发能力。第一次握手服务端确认了客户端能发第二次握手客户端确认了服务端能收能发但此时服务端还不知道客户端能不能收所以需要第三次握手让客户端确认。两次不够因为服务端无法确认自己的SYN-ACK被收到四次多余三次已经足够双方都确认双向通道可用。三次握手还携带了关键信息初始序号。双方各自随机选一个初始序号后续所有字节都基于它编号。为什么随机而不是从零开始防止旧连接的延迟报文被新连接误认。这个细节在复习时值得多想一层。还有一个常被忽略的点第三次握手可以携带数据。客户端发ACK时如果已有数据要发可以捎带上去这叫捎带确认的思想。不过实际实现中很多协议栈在第三次握手时不带数据等连接完全建立再发这是实现选择问题。2.3 请求响应与连接管理短连接、长连接与队头阻塞连接建立后浏览器发HTTP请求。早期HTTP/1.0默认短连接一个请求一个TCP连接用完就关效率极低。HTTP/1.1引入持久连接默认保持连接复用多个请求可以走同一个TCP连接。但HTTP/1.1有个著名问题队头阻塞。同一个连接上请求是串行的前一个响应没回来后一个就得等。HTTP/2用多路复用解决这个问题同一个TCP连接上可以并行交错多个请求响应流用流ID区分。但HTTP/2仍然受TCP层队头阻塞影响——一个TCP包丢了后面所有流都得等重传。HTTP/3干脆换到QUIC基于UDP在传输层就解决了队头阻塞。复习这条线时把HTTP版本演进和传输层机制连起来看理解会深很多。很多人孤立地背HTTP/2多路复用但不知道它为什么还解决不了TCP层队头阻塞就是因为没把应用层和传输层打通看。2.4 页面渲染前的最后一段连接关闭与状态码响应回来后连接是否关闭取决于Connection头。如果是keep-alive就保持否则关闭。关闭时涉及四次挥手因为TCP是全双工的两个方向要分别关闭。主动关闭方发FIN对方回ACK等自己数据发完再发FIN最后对方回ACK。为什么比握手多一次因为握手时服务端的SYN和ACK可以合并成一个包发而挥手时被动关闭方收到FIN后可能还有数据要发不能立刻关所以ACK和FIN分开发。状态码这块复习时别只背200、404、500。重点理解3xx重定向和缓存相关头。301永久重定向会被浏览器缓存302临时重定向默认不缓存除非显式设置。缓存控制靠Cache-Control、ETag、Last-Modified这些头配合强缓存和协商缓存的区别是复习重点强缓存直接本地用不发请求协商缓存要发请求问服务端资源变没变没变就返回304让浏览器用本地副本。3. 传输层是复习的重心也是面试的高频区如果时间有限传输层值得花最多精力。TCP的可靠性机制、拥塞控制、流量控制是网络复习里信息密度最高、也最能体现理解深度的部分。3.1 可靠传输的四大支柱确认、重传、序号、校验TCP保证可靠靠的是四样东西配合。序号给每个字节编号让接收方知道收到哪了、缺哪了。确认让发送方知道哪些被收到了。重传处理丢失分超时重传和快速重传。校验和检测数据在传输中是否损坏。超时重传的关键是超时时间怎么定。定太短没丢也重传浪费带宽定太长真丢了等半天。TCP用自适应重传根据往返时间动态计算。具体是测量每次往返时间用指数加权移动平均算平滑往返时间和偏差超时时间取平滑值加若干倍偏差。这个设计思想值得体会网络状况是变化的固定超时不可行必须自适应。快速重传是另一个优化如果发送方连续收到三个对同一序号的重复确认就认为那个包丢了不等超时直接重传。为什么是三个一个可能是乱序两个也可能是乱序三个重复确认基本能确定是丢了。这是工程上的经验折中。3.2 流量控制与拥塞控制一个管接收方一个管网络这两个概念特别容易混。流量控制是接收方告诉发送方我缓冲区快满了你慢点发靠窗口字段实现。拥塞控制是发送方自己判断网络可能堵了我主动降速靠拥塞窗口实现。实际发送窗口取两者最小值。流量控制里有个经典问题零窗口死锁。接收方缓冲区满了通告窗口为零发送方停发。等接收方腾出空间发窗口更新通知如果这个通知丢了双方就僵住了。解决办法是发送方启动坚持定时器定期发窗口探测逼接收方回应当前窗口。拥塞控制是复习重点四个阶段要理清慢启动指数增长拥塞避免线性增长快重传收到三个重复确认立即重传快恢复不回到慢启动而是降到阈值附近继续线性增长。很多人背了阶段名但说不清转换条件复习时画一张拥塞窗口随时间变化的曲线把每个阶段的触发条件和窗口变化标上去比背文字强。阶段触发条件窗口变化退出条件慢启动连接建立或超时重传每收到一个确认翻倍指数达到慢启动阈值拥塞避免窗口达到阈值每往返时间加一线性检测到丢包快重传收到三个重复确认立即重传丢失包进入快恢复快恢复快重传后阈值减半窗口设为阈值恢复正常增长注意不同TCP实现如Reno、NewReno、CUBIC在细节上有差异复习时先掌握经典Reno的逻辑再了解现代实现的改进方向别一上来就陷进具体算法的公式里。3.3 UDP不是不可靠的TCP而是另一种设计哲学很多人复习时把UDP当成TCP的残缺版这是误解。UDP的设计哲学是最小开销不握手、不确认、不重传、不排序、不管拥塞只做端口寻址和校验。它把可靠性、有序性、流量控制这些责任全部交给应用层。这种设计在特定场景下是优势。实时音视频丢一帧无所谓等重传反而造成卡顿用UDP更合适。DNS查询一问一答用UDP省握手。游戏状态同步旧数据没意义重传反而有害。理解UDP的价值关键是理解不是所有应用都需要可靠传输把可靠性做成可选项而不是默认项是更灵活的设计。复习时可以把TCP和UDP做个对照表从连接、可靠性、有序性、开销、适用场景几个维度对比但重点不是背表而是理解每个差异背后的取舍逻辑。4. 网络层与链路层路由、寻址与那些容易忽略的细节网络层和链路层在复习时容易被轻视觉得不如TCP有意思。但实际排障时这两层的问题最多而且面试也常考。4.1 IP地址、子网掩码与CIDR算清楚再谈其他IP寻址是网络层的基础。IPv4地址三十二位分网络部分和主机部分靠子网掩码划分。传统分类地址A、B、C类已经过时现在用无类别域间路由即用斜杠加前缀长度表示网络部分位数比如192.168.1.0/24表示前二十四位是网络号。复习时一定要会手算子网。给定一个地址和前缀能算出网络地址、广播地址、可用主机范围。方法很简单把前缀之外的位全部置零得网络地址全部置一得广播地址中间就是可用范围。比如10.0.5.130/26前缀二十六位主机部分六位网络地址是10.0.5.128广播地址是10.0.5.191可用范围是129到190。这个计算在实际工作中天天用配路由、划VLAN、排查地址冲突都离不开。我见过不少人复习时跳过这块觉得简单结果实际配网络时算错掩码折腾半天。建议拿几个随机地址练手练到条件反射。4.2 路由选择最长前缀匹配与路由表路由器转发包时查路由表规则是最长前缀匹配。目的地址可能匹配多条路由选前缀最长的那条因为前缀越长越具体。比如同时有10.0.0.0/8和10.1.0.0/16两条路由去10.1.2.3的包会走第二条。默认路由0.0.0.0/0前缀长度为零是最不具体的所以只有在没有其他匹配时才用。这个设计很优雅不需要为每个目的地址配路由配一条默认路由兜底即可。复习时还要理解自治系统和路由协议的分工。内部网关协议如OSPF管一个自治系统内部的路由追求快速收敛外部网关协议如BGP管自治系统之间追求策略可控。为什么分开因为内部追求效率外部涉及不同管理域的利益和政策不能简单用最短路径。4.3 ARP与MAC地址解析的隐形桥梁网络层用IP寻址链路层用MAC寻址两者之间靠地址解析协议搭桥。同一局域网内主机知道目的IP但不知道目的MAC就广播一个ARP请求谁是这个IP对应主机单播回复自己的MAC。ARP有个特点无状态、可缓存。解析结果缓存一段时间过期重新解析。这带来一个安全隐患ARP欺骗攻击者伪造ARP响应把网关IP映射到自己MAC流量就经过攻击者。复习时了解这个机制能理解为什么局域网安全需要额外手段。还有个细节跨网段通信时源主机ARP解析的是网关的MAC不是目的主机的MAC。包先发给网关网关再转发。很多人复习时没注意这点以为端到端直接解析实际是逐跳解析。4.4 NAT地址不够用的补丁也是排障的常客IPv4地址枯竭网络地址转换是主要缓解手段。私有地址在内部用出公网时转换成公网地址。家用路由器就是典型NAT设备内部多台设备共享一个公网IP。NAT的工作方式是维护一张转换表把内部地址加端口映射到外部地址加端口。出方向改源地址入方向改目的地址。这带来一个问题外部主动发起的连接进不来因为没有映射表项。所以需要端口映射或打洞技术。复习时理解NAT对理解P2P通信、端口映射、连接跟踪都有帮助。实际排障时为什么外网访问不了内网服务十有八九是NAT没配映射。5. 应用层协议HTTP之外你还该知道什么应用层协议很多复习时抓重点HTTP是核心DNS前面讲过再加邮件协议和文件传输的基本概念即可。5.1 HTTP的方法、状态码与头部体系HTTP方法里GET和POST的区别是高频考点但别只背GET在URL里POST在body里。本质区别是语义GET是获取资源应该是安全且幂等的POST是提交数据可能改变服务端状态不保证幂等。幂等的意思是执行一次和执行多次效果相同GET、PUT、DELETE是幂等的POST不是。状态码分五类1xx信息、2xx成功、3xx重定向、4xx客户端错误、5xx服务端错误。重点掌握几个200成功、301永久重定向、302临时重定向、304未修改配合缓存、400请求错误、401未认证、403禁止、404不存在、500服务端错误、502网关错误、503服务不可用。头部体系分请求头、响应头、通用头、实体头。复习时重点理解内容协商Accept系列、缓存控制Cache-Control、ETag、连接管理Connection、认证Authorization。这些头在实际开发和排障中用得最多。5.2 HTTPS不是新协议而是HTTP加了一层HTTPS本质是HTTP over TLS。TLS在传输层之上、应用层之下提供加密、完整性校验和身份认证。握手过程比TCP复杂涉及证书验证、密钥交换、对称密钥协商。复习时不必深挖密码学细节但要理解几个关键点非对称加密用于握手阶段交换密钥对称加密用于数据传输因为对称加密快。证书解决信任问题由证书颁发机构签名浏览器内置根证书来验证链。前向保密指即使长期密钥泄露过去的会话也解不开靠每次会话生成临时密钥实现。5.3 邮件与文件传输了解即可别陷太深邮件涉及SMTP发信、POP3或IMAP收信。SMTP是推协议把邮件推到服务器POP3和IMAP是拉协议从服务器取邮件。区别在于IMAP支持在服务器上管理文件夹和状态同步POP3通常下载后删除。文件传输协议FTP用两个连接控制连接传命令数据连接传文件。主动模式下服务器主动连客户端数据端口被动模式下客户端连服务器。实际中被动模式更常用因为客户端常在NAT后面服务器主动连不进来。这部分复习投入产出比不高掌握基本概念和端口号即可把时间留给传输层和HTTP。6. 复习节奏与自测方法怎么知道自己真会了最后聊聊复习方法本身。网络知识点多且杂没有节奏很容易陷入看了忘、忘了看的循环。6.1 三轮复习法骨架、细节、串联我的做法分三轮。第一轮建骨架只抓分层模型和每层核心协议不抠细节目标是能画出输入网址到页面显示的全流程图。第二轮填细节针对每层的重点机制深入比如TCP的拥塞控制、HTTP的缓存机制目标是能讲清每个机制的动机和流程。第三轮串联和自测把跨层的问题打通比如HTTP/2的多路复用为什么还受TCP队头阻塞影响目标是能回答综合性问题。三轮的时间分配大概是二比五比三。第一轮快建立全局观第二轮慢啃硬骨头第三轮查漏补缺重点看错题和模糊点。6.2 自测的四个层次名词、流程、动机、对比判断自己会不会可以按四个层次自测。名词层能不能准确说出协议名、字段名、端口号。流程层能不能完整描述一个机制的步骤比如三次握手、四次挥手、DNS解析。动机层能不能解释为什么这么设计比如为什么TCP握手是三次、为什么DNS用UDP。对比层能不能说清相似概念的区别比如TCP和UDP、流量控制和拥塞控制、301和302。大部分人卡在流程层能背步骤但说不清动机。复习时每学一个机制强迫自己回答为什么答不上就回去补。对比层是最高要求也是面试区分度最高的地方。6.3 抓包与画图两个最有效的动手手段抓包前面提过这里强调具体做法复习传输层时用抓包工具过滤某个TCP流看握手、数据传输、挥手全过程对照字段看序号、确认号、窗口、标志位的变化。复习应用层时抓一次HTTP请求看请求行、头部、body再看响应。复习网络层时用路由追踪工具看包经过哪些跳。画图同样重要。把三次握手画成时序图把拥塞控制画成窗口曲线把DNS解析画成树状查询路径。画的过程就是梳理逻辑的过程画不出来的地方就是没理解的地方。提示画图别追求好看追求准确。每个箭头代表什么包、每个字段什么含义标清楚。画完对照教材检查比反复读文字有效。复习计算机网络这件事说到底不是背多少名词而是建立一张能自我解释的知识网。每个机制都有它要解决的问题每个设计都有它的取舍。你把为什么想通了细节自然记得住你动手抓过包、画过图抽象概念自然变得具体。我第三遍复习时最大的感受是当年觉得枯燥的那些协议细节其实都是前人踩过无数坑之后沉淀下来的工程智慧理解了这层复习就不再是苦差事而是挺有意思的拆解过程。