
简介计算机网络自顶向下复习笔记是面向本科生期末复习的PDF学习资料以TCP/IP模型为主线系统梳理第一章“计算机网络和因特网”相关概念包括主机、通信链路、分组交换机、ISP等基础术语以及电路交换与分组交换的对比、存储转发机制、时延类型与流量强度等常考知识点。同时覆盖网络接入方式DSL、电缆、FTTH、拨号、卫星、物理媒体分类和TCP/IP五层协议栈并延伸到应用层的HTTP、SMTP、FTP、DNS等协议帮助读者快速建立整体知识框架笔记对应用层至传输层内容略有删减建议结合大纲补充。资源共1个PDF文件压缩包大小4.08MB便于下载后随时打印或电子阅读。目前已有1070人学习适合需要系统梳理计算机网络核心原理、考前查漏补缺的本科生和备考者。1. 计算机网络自顶向下复习笔记期末冲刺为什么先啃这张协议栈表「计算机网络自顶向下」是本科计算机网络课最常用的主线而这套复习笔记最大的价值是把散在教材各章的知识点压缩成可以直接背的考点清单。期末复习最怕的不是题难而是你按 OSI 七层背了一堆名词老师考的是 TCP/IP 五层模型里的功能归属两者对不上。笔记里从应用层到物理层的分组名、协议、端口列得都很清楚适合一边对照《计算机网络自顶向下》原书一边刷题的本科生。需要提醒的是笔记里应用层到传输层的内容偏薄TCP 三次握手、拥塞控制这类高频考点得另外补后面我会给一套补全思路。2. 网络核心开篇从端系统到分组交换先把术语统一进一个场景2.1 端系统、链路和分组交换机一张图理解网络骨架笔记里的第一组术语其实是描述「一个分组从你的电脑到某台服务器中间经过什么」。主机也叫端系统是你手里那台笔记本、手机或者机房里的服务器它们挂在网络边缘。端系统之间靠通信链路连接链路的物理形态五花八门后面会展开。链路中间负责转发的设备是分组交换机最常见的是路由器和链路层交换机路由器工作在网络层链路层交换机工作在链路层这个区别在考试里经常作为选择题出现。ISP 是另一条线索。家庭用户通过 ISP 接入因特网ISP 之间又通过上层 ISP 互联最终形成「网络的网络」。TCP 和 IP 是这套体系的两个核心协议IP 负责把数据报从源主机送到目的主机TCP 负责在端系统之间可靠地传输报文。因特网标准由 IETF 研发标准文档叫 RFC你在看教材时经常看到 RFC 编号考试不会直接考编号但「协议定义了通信实体之间交换报文的格式、次序以及收到报文后的动作」这句定义几乎是期末简答题的原题。2.2 接入网与物理媒体DSL、Cable、FTTH 怎么区分家庭接入这节考点集中在「谁用什么线」。DSL 走本地电话公司的电话线Cable 走有线电视公司的同轴电缆FTTH 是光纤到户拨号只有 56kbps 基本淘汰卫星用于偏远地区。企业接入最常见的是以太网和 Wi-Fi广域无线网对应 3G 和 LTE。考试常给你一个场景让你选接入方式判断依据就是传输介质铜线、同轴还是光纤。物理媒体在笔记里分了两类。引导型媒体包括双绞铜线、同轴电缆和光纤非引导型媒体包括陆地无线电信道和卫星无线电信道。这里有个容易混淆的点双绞线和同轴电缆都是铜介质但双绞线便宜、抗干扰弱同轴电缆屏蔽性好光纤带宽大、抗电磁干扰最强。实际选择题会问「哪种媒体不受电磁干扰」答案永远是光纤。2.3 电路交换与分组交换资源预留和按需共享的博弈交换方式是期末必考的一块。电路交换的特点是先预留资源通信期间这条路径上的带宽被独占。它有两种复用方式频分复用 FDM 把频率切成多个频段时分复用 TDM 把时间切成固定时隙每个用户周期性地占用一个时隙。电路交换的优点是延迟稳定、适合实时通话缺点是利用率低因为预留的带宽即使空闲也不能给别的用户用。分组交换不预留资源数据被拆成分组每个分组独立转发按需共享链路带宽。笔记里总结了它和电路交换比较的三个结论更好的带宽共享、简单有效成本低、利用率高相对电路交换。但分组交换的代价是排队——分组到达交换机时如果链路正忙就得在缓冲区里排队排队溢出就丢包。所以电路交换适合恒定速率、实时性强的流量分组交换适合突发流量这也是为什么因特网最终选择了分组交换。2.4 四个时延与流量强度公式和边界条件要一起背时延题是计算题主力。处理时延是交换机检查分组首部、查路由表的时间排队时延是分组在缓冲队列里等待的时间传输时延是交换机把整组比特推到链路上的时间公式是 L/RL 是分组大小bitR 是传输速率bps传播时延是比特在链路上跑的时间公式是距离除以传播速度。注意传输时延和传播时延的区别前者是「把数据放到线上」的时间后者是「数据在线上走」的时间这是最常见的辨析题。分组交换采用存储转发机制交换机要收完整个分组才转发。一条 N 条链路的路径源和目的之间隔着 N-1 个交换机忽略处理、排队和传播时延传输时延大约是 N 倍的 L/R。排队时延的量化看流量强度分组到达平均速率 a pkt/s分组大小 L bits传输速率 R bps则比特到达速率 La bps流量强度 La/R。强度接近 0 时排队时延小接近 1 时延急剧增长超过 1 时队列无限增长最终丢包。吞吐量这节记住一句话文件传输场景下时延不是关键指标吞吐量才是瞬间吞吐量是接收速率平均吞吐量是文件大小除以总耗时。3. 五层协议栈与自顶向下路线先把 OSI 和 TCP/IP 的功能归属钉死3.1 因特网协议栈五层每层的职责、协议和分组名协议栈是最核心的框架知识。因特网用的是五层模型从上到下是应用层、运输层、网络层、链路层、物理层。应用层是网络应用及其协议所在的地方比如浏览器和 Web 服务器之间的 HTTP、邮件用的 SMTP、域名解析用的 DNS这一层的分组叫报文。运输层负责在应用程序之间传送应用层报文TCP 提供可靠传输UDP 提供尽力而为的传输分组叫报文段。网络层负责把分组从一台主机移动到另一台主机核心是 IP 协议分组叫数据报。链路层把数据报从一个节点移动到相邻节点分组叫帧。物理层把帧里的一个个比特从一个节点移动到下一个节点。把各层和分组名放在一张表里对照记忆是我复习时最有效的方法层核心职责典型协议/实现分组名应用层网络应用与协议HTTP、SMTP、FTP、DNS、P2P报文(message)运输层应用进程间传送报文TCP、UDP报文段(segment)网络层主机到主机的分组移动IP数据报(datagram)链路层节点到相邻节点的帧移动以太网、Wi-Fi、特定链路协议帧(frame)物理层逐比特移动与传输媒体相关比特(bit)自顶向下复习的意思是先学应用层再逐层往下。这套笔记遵循的就是这个顺序复习的时候建议也按这个顺序先看应用层协议怎么用运输层服务再看运输层怎么用网络层服务每一层只依赖下一层的接口这样每章的知识是「挂在」前一层上的不容易散。3.2 OSI 七层与五层的对应考试最爱问「某功能属于哪层」ISO 提出的 OSI 模型是七层应用、表示、会话、运输、网络、链路、物理。因特网把表示层和会话层合并进了应用层所以是五层。考试里常出现「数据加密、压缩属于哪一层」这类题按 OSI 是表示层按因特网五层模型你要写「应用层」。会话管理在 OSI 里是会话层在五层模型里同样归到应用层。这个差异不是理论陈旧的问题而是两种参考模型的设计取舍答题时先看清楚题目问的是哪个模型再作答。3.3 运输层 TCP vs UDP连接、可靠性和端口号运输层在期末占比重很大但笔记里内容偏少需要补。TCP 是面向连接的、可靠的字节流协议UDP 是无连接的、不可靠的数据报协议。TCP 用序号、确认、重传、流量控制和拥塞控制来保证可靠代价是首部开销大、有连接建立延迟UDP 首部只有 8 字节没有握手适合 DNS 查询、视频通话这类能容忍少量丢失但要求低延迟的场景。端口号是进程寻址的关键。进程通过套接字socket向网络收发报文可以简单理解为 IP 加端口号IP 找到主机端口号找到主机上的进程。HTTP 默认 80FTP 控制连接 21SMTP 25DNS 53POP3 110。考试常给一个 URL 让你说它默认走哪个端口或者问「某个协议用 TCP 还是 UDP」这里面唯一需要特别记的是 DNS 用 UDP 通常没问题但它也支持 TCP 做区域传送笔记里写的是 UDP按考试常规答案写 UDP 即可。4. 应用层协议速通HTTP、FTP、SMTP、DNS 的考点与端口对照4.1 HTTP 的连接方式和报文格式RTT 计算要会算HTTP 是应用层必考协议默认端口 80使用 TCP并且是无状态协议——服务器不保存客户过去的请求信息。这里要分清两种连接方式。非持续连接每个 TCP 连接只传一个请求报文和一个响应报文请求 10 个对象就要建立 10 个 TCP 连接。每接收一个对象要花两个 RTT一个 RTT 建立 TCP 连接一个 RTT 发送请求并接收对象此外还要加上文件传输时间。持续连接是 HTTP 1.1 的默认方式服务器发送响应后保持 TCP 连接打开后续对象复用这条连接大幅减少 RTT 开销。请求报文和响应报文的格式要能认出来。请求报文第一行是请求行包含方法字段GET、POST、HEAD、PUT、DELETE、URL 和 HTTP 版本后面是首部行Host 表明主机位置Connection: close 表示用非持续连接User-agent 表示浏览器类型Accept-language 表示期望语言。响应报文第一行是状态行包含协议版本、状态码和状态信息首部行里有 Date、Server、Last-Modified、Content-Length、Content-Type最后是实体体也就是对象本身。状态码是选择题常客我把重要的整理成表状态码含义200 OK请求成功对象在响应中301 Moved Permanently对象已被永久转移新 URL 在 Location 首部400 Bad Request服务器无法理解该请求404 Not Found请求的对象不存在505 HTTP Version Not SupportedHTTP 版本不支持这份笔记里写的「401 Not Found」是抄写错误正确的是 404。401 是 Unauthorized表示需要认证做题时认准 404 和 401 的差别别栽在这个地方。4.2 Cookie 与 Web 缓存无状态协议怎么跟踪用户HTTP 是无状态的但电商网站需要记住用户Cookie 就是为了解决这个问题。Cookie 有四个组件HTTP 响应报文里的 Set-Cookie 首部、HTTP 请求报文里的 Cookie 首部、用户端由浏览器管理的 cookie 文件、Web 站点后台的数据库。用户首次访问时服务器生成一个用户标识码通过 Set-Cookie 发给浏览器浏览器存进 cookie 文件后续每次请求带上 Cookie 首部服务器通过后端数据库核对身份。考试里常问「Cookie 存在哪里」答案是用户端和服务器端都有用户在客户端存标识服务器存对应的用户信息。Web 缓存器也叫代理服务器是能够代表初始 Web 服务器满足 HTTP 请求的网络实体通常由 ISP 购买和安装。它有两个作用减少客户请求的响应时间减少机构接入链路到因特网的流量。缓存器会存一份对象的副本但对象可能在源服务器上更新过所以要用条件 GET。客户向缓存器发请求缓存器向源服务器发条件请求带上 If-modified-since 首部值是该文件的最后修改时间。如果源服务器文件没变就返回 304 Not Modified 且不带实体体缓存器用自己的副本响应客户如果变了源服务器返回 200 和新文件。4.3 FTP、SMTP 与邮件访问协议控制连接和数据连接要分清FTP 用于主机间文件传输端口 21基于 TCP特点是使用两个并行的 TCP 连接控制连接和数据连接。控制连接贯穿整个会话传输命令和状态数据连接每次传输文件时新建传完就关。FTP 是有状态协议服务器需要维护用户在远程目录的位置和控制信息。与 HTTP 的无状态相比这是个经典对比题。SMTP 是邮件发送协议端口 25用于发送方邮件服务器把报文送到接收方邮件服务器也是 TCP 承载。三个特点常考一般不使用中间服务器发送邮件报文必须用 7 比特 ASCII 编码非文本内容得重新编码所有对象放在一个报文里。SMTP 是推协议主动把邮件推向对方服务器而 HTTP 和 POP3 这类拉协议是被动等待请求。邮件访问协议负责把邮件从服务器拉到本地POP3 端口 110分三个阶段特许阶段用户代理以明文发送用户名和口令事务处理阶段取回报文做删除或取消删除标记获取统计信息更新阶段退出后删除被标记的报文。POP3 服务器在会话过程中不携带状态信息。IMAP 比 POP3 更进一步允许在服务器上创建远程文件夹、给报文指派文件夹而且维护会话的用户状态信息比如文件夹名和报文关联。4.4 DNS 的层次结构与记录类型解析到底找谁要DNS 端口 53基于 UDP负责四件事主机名到 IP 的解析、主机别名到规范主机名的解析、邮件服务器别名的解析、负载分配。DNS 不是单台服务器而是一个层次体系根 DNS 服务器、顶级域服务器TLD负责 com、org、net 以及国家顶级域 cn、uk、权威 DNS 服务器记录组织机构的公共主机名和 IP再加上本地 DNS 服务器。查询方式有迭代查询和递归查询两种考试常常给一张图让你判断哪段是迭代、哪段是递归判据是「本地 DNS 是否替客户去问下一个服务器」替客户问就是递归返回「下一站地址让你自己问」就是迭代。DNS 记录是四元组 (Name, Value, Type, TTL)。TypeA 时 Name 是主机名、Value 是 IPTypeNS 时 Name 是域名、Value 是能获取该域主机 IP 的权威 DNS 服务器主机名TypeCNAME 时 Name 是别名主机名、Value 是规范主机名TypeMX 时 Name 是邮件服务器别名、Value 是规范名。DNS 的查询报文和回答报文格式相同这也是知识点。域名注册由 ICANN 授权的注册机构完成考点只到「向注册登记机构注册域名」这一步。5. 动手复现套接字编程UDP/TCP 最小实现与避坑清单5.1 UDP 套接字最小实现无连接但有地址套接字编程是应用层知识的落地。原笔记里的代码是 Python 2 语法直接跑会报错我按 Python 3 给你一个能跑的最小 UDP 客户端和服务端。先看客户端UDPClient.pyfrom socket import * # 服务器地址可以填域名或 IP 地址 serverName 127.0.0.1 serverPort 12000 # AF_INET 表示 IPv4SOCK_DGRAM 表示 UDP 套接字 clientSocket socket(AF_INET, SOCK_DGRAM) message input(Input lowercase sentence: ) # sendto 需要两个参数数据字节串和目的地址元组(主机, 端口) clientSocket.sendto(message.encode(), (serverName, serverPort)) # 2048 是缓冲区大小recvfrom 返回(数据, 源地址) modifiedMessage, serverAddress clientSocket.recvfrom(2048) print(modifiedMessage.decode()) clientSocket.close()逻辑说明客户端创建 UDP 套接字后不需要连接直接 sendto 把编码后的字节串发往指定地址然后阻塞在 recvfrom 等回包。参数里AF_INET指定 IPv4 地址族SOCK_DGRAM指定数据报套接字2048是接收缓冲区字节数改成 4096 同样可行但考试背 2048 就行。.encode()和.decode()是 Python 3 和 Python 2 最大的差异原笔记里直接传字符串Python 3 里必须转成字节串。再看服务端UDPServer.pyfrom socket import * serverPort 12000 serverSocket socket(AF_INET, SOCK_DGRAM) # bind 绑定端口 表示本机所有可用地址 serverSocket.bind((, serverPort)) print(The server is ready to receive) while True: message, clientAddress serverSocket.recvfrom(2048) modifiedMessage message.upper() serverSocket.sendto(modifiedMessage, clientAddress)逻辑说明服务端绑定 12000 端口后进入死循环recvfrom 收到的是(数据, 客户端地址)二元组处理完用 sendto 原路返回。bind((, serverPort))第一个参数空字符串表示接受本机任意网卡上的包如果写成127.0.0.1就只有本机回环能访问远程机器连不上。UDP 套接字没有连接状态服务端同一个套接字可以服务任意多个客户端这就是无连接协议的特点。5.2 TCP 套接字最小实现面向连接的字节流TCP 客户端比 UDP 多了一个 connect 步骤。看TCPClient.pyfrom socket import * serverName 127.0.0.1 serverPort 13000 # SOCK_STREAM 表示 TCP 流式套接字 clientSocket socket(AF_INET, SOCK_STREAM) # connect 建立 TCP 连接需要三次握手 clientSocket.connect((serverName, serverPort)) sentence input(Input lowercase sentence: ) clientSocket.send(sentence.encode()) # TCP 是字节流recv 可能一次收不完这里简单场景假设一次收完 modifiedSentence clientSocket.recv(1024) print(modifiedSentence.decode()) clientSocket.close()服务端TCPServer.py多了一个 listen 和一个 acceptfrom socket import * serverPort 13000 serverSocket socket(AF_INET, SOCK_STREAM) # bind 绑定端口listen(1) 表示允许 1 个连接排队 serverSocket.bind((, serverPort)) serverSocket.listen(1) print(The server is ready to receive) while True: # accept 返回新的连接套接字和客户端地址 connectionSocket, addr serverSocket.accept() sentence connectionSocket.recv(1024) connectionSocket.send(sentence.upper().encode()) connectionSocket.close()逻辑说明TCP 服务端先监听收到客户端 connect 后由内核完成三次握手accept 从已完成连接的队列里取一个连接返回一个专用的 connectionSocket。之后这个专用套接字负责收发数据监听的 serverSocket 继续等下一个连接。注意 TCP 是字节流协议没有消息边界recv(1024)一次可能只收到半个消息也可能收到两个消息。教学实验里收发都很短一次收完是常态真实场景要在应用层自己设计消息边界比如固定长度或者「长度头内容」的封装。5.3 避坑套接字实验与复习笔记的四个常见翻车点第一个坑Python 2 代码直接跑。现象是raw_input报 NameError、print modifiedMessage报语法错误。原因是原笔记基于 Python 2语法和 Python 3 不兼容。解决输入函数统一改成input()输出统一加括号字符串收发加.encode()和.decode()。第二个坑UDP 服务端收不到数据。现象是客户端 sendto 不报错但服务端一直阻塞。原因大概率是端口不一致或者服务端 bind 的 IP 范围不对。解决客户端把serverName填127.0.0.1服务端 bind(, serverPort)两端端口务必一致先在本机跑通再换局域网地址。第三个坑TCP 一次 recv 读不全数据。现象是客户端收到的字符串被截断或者粘包。原因是 TCP 是字节流recv 返回的是缓冲区当前可读的数据量和 send 的调用次数没有一一对应关系。解决教学实验可以接受小数据一次读出工程实现要定义消息边界比如前 4 字节放消息长度接收端先读长度再循环 recv 直到收满。第四个坑笔记里状态码和端口记混。现象是做题时把 401 当 Not Found、把 FTP 数据连接端口当 21。原因是不求甚解地背笔记而笔记自身也有抄写笔误。解决以 RFC 和教材为准建一张自己的协议速查表端口号、状态码、分组名三项对照考前每天默写一遍。提示套接字实验环境用本机回环地址跑不要开着防火墙做局域网实验Windows 上大概率被拦。6. 期末自测三板斧抓包验证、速查表与错题复盘自测方法比单纯重读笔记更有用。第一个方法是抓包验证。用 Python 在本地起一个最简单的 Web 服务然后在浏览器访问它用 Wireshark 抓回环接口的流量你能亲眼看到 HTTP 请求报文里第一行GET / HTTP/1.1首部行里的Host、User-Agent响应报文里的200 OK、Content-Length和Content-Type。抓包看一次比背十遍报文格式都牢。做法是python -m http.server 8000起服务Wireshark 选择 lo回环接口过滤条件写http就行。不用抓外网流量本地回环足够看懂格式。第二个方法是做速查表。把学过的协议按「协议名、端口、运输层、分组名、关键特点」五项列成一张表每个协议一行抄在 A4 纸上贴墙。这张表长这样协议端口运输层关键特点HTTP80TCP无状态持续/非持续连接FTP21TCP控制连接数据连接有状态SMTP25TCP推协议7 比特 ASCIIPOP3110TCP三阶段不携带状态DNS53UDP层次查询四元组记录这五条是期末简答和选择的常客端口和特点对应着记做题速度能快不少。第三个方法是错题复盘。把平时做错的题按「现象、原因、解决」三列整理成卡片考前只看卡片不看整本笔记。我复习时最受益的一个习惯是每次刷完一套卷子把自己记混的知识点当场写进卡片不再翻原笔记。有一道题我错得特别值——「HTTP 非持续连接接收一个对象需要几个 RTT」我填了 1 个正确答案是 2 个一个建连一个请求传输。从那以后我每次复习网络课都先自己默写一遍协议-端口-分组名对照表再去刷题正确率稳定提升。这套方法不只适用于计算机网络任何以记忆和辨析为主的课都通用。希望帮到你。本文还有配套的精品资源点击获取