计算机网络原理考点解析:OSI分层、CRC校验与TCP/IP协议详解
简介:计算机网络原理是计算机类专业的核心课程,这份PDF围绕常见考点整理而成,覆盖从物理层到应用层的关键知识点,适合期末复习、考研备战及自学巩固。资源为1个PDF文件,大小27KB,体积小巧便于随时查看;内容包含30道左右的问答与选择题,按课时分块梳理,例如通信子网与资源子网、OSI参考模型、TCP/IP协议族、数据编码、比特填充、路由协议、DNS与HTTP等。已有1092人学习下载,被不少读者用作考前速览与查漏补缺材料。读者通过该PDF可快速回顾计算机网络核心概念,掌握典型题型和易混淆点,如波特率与比特率换算、停止等待协议窗口、HDLC含义、IP地址分类等,有助于提升备考效率。
1. 从“背考点”到“建模型”:这份计算机网络原理PDF的正确打开方式
计算机网络原理这门课,最耗精力的不是算法推导,而是大量“看着像常识、考起来全是坑”的知识点:HDLC标志字段为什么是01111110、四相调相下波特率怎么换算比特率、停止等待协议的发送窗口到底等不等于1。这份PDF把物理层到应用层的考点按课时和阶段测评整理成了一份结构化的复习地图,对准备网络工程师考试、考研复习计算机网络、以及刚转网络方向的开发运维同学都适用。我的建议是别把它当题库硬背,而是把每个答案还原到对应层的设计动机里。这样刷完一遍,遇到没见过的题也能顺着分层模型推出来。下面按“分层模型—物理与链路—网络与传输—应用与局域网—自测工具”的顺序重新过一遍。
2. 组网分层与协议三要素:OSI/TCP-IP 的对应关系先记牢
无论是自考、考研还是软考,计算机网络的第一组题目几乎都固定在“系统组成、功能、拓扑、分类”这几个点上。这些题看似送分,实际上决定了后面所有分层知识点能不能挂到一起。先判断资源在哪一层,再判断协议管什么,后面做CRC和窗口滑动才有落点。
2.1 通信子网与资源子网:先判断资源在哪里
计算机网络由通信子网和资源子网两部分组成。通信子网负责把数据从源节点搬到目的节点,核心部件是分组交换节点和通信链路;资源子网负责面向用户的计算、存储和软件服务,核心是主机、服务器和数据库。判断方法很简单:这条数据通路上的每个转发节点都属于通信子网,而真正拥有数据、处理数据的主机属于资源子网。
这个区分在判断设备归属时很关键。常见考题里“转发器工作在物理层,网桥和网卡工作在数据链路层,路由器工作在网络层”,本质就是在问设备介入的是哪一段通信子网。转发器和网桥不修改网络层头部,路由器要修改IP头部的TTL字段并重新选路,这是三者最明显的差异。
2.2 协议三要素:语法、语义与时序的工程含义
网络协议的三要素是语法、语义和时序。语法规定帧或报文的格式,比如字段顺序、长度、取值;语义规定每个控制字段的含义,比如SYN、ACK、FIN各自表达什么;时序规定事件发生的先后顺序,比如先握手还是先传数据。做协议分析时我一般也按这个次序排查:先抓包看格式是否合法,再对照控制字段语义判断状态,最后看时间戳确认是否触发超时重传。
协议要素里最容易混进来的是“接口”。接口不属于协议的组成,它描述的是同一节点内部上下层之间传递服务原语的位置。层与层之间通过接口交换数据和服务请求,但接口本身不规定网上传输的内容格式。
2.3 拓扑与分类:总线、星型、环型背后的取舍
总线拓扑是所有站点通过硬件接口连接到同一根公共传输介质上,这根公共介质就是总线。它结构简单、布线成本低,但同一时刻只允许一个站点发送数据,需要分布式控制策略来确定发送权,实时性相对弱。星型拓扑所有流量经过中心节点,排查故障容易,代价是中心节点压力大。环型拓扑数据沿环单向传递,每个节点都有中继功能。树型拓扑在星型基础上扩展,覆盖范围更大。
按覆盖范围分类,局域网、城域网、广域网三者的差异在规模而不在技术复杂度。局域网通常用广播信道,广域网通信子网则普遍采用点到点链路和分组交换。判断拓扑类型时,抓住“介质是否共享”这一条:共享介质的优先级自然是总线型和树型这类广播式结构。
2.4 TCP/IP 与 OSI 的对应关系:一张表记住四层到七层
TCP/IP参考模型分为应用层、传输层、互连层和主机-网络层四层,其中互连层对应OSI的网络层,主机-网络层对应OSI的数据链路层和物理层。应用层则把OSI上三层的会话、表示、应用全部收入囊中。对应关系如下表:
| OSI七层 | TCP/IP四层 | 典型协议 |
|---|---|---|
| 应用层、表示层、会话层 | 应用层 | HTTP、SMTP、DNS、FTP |
| 传输层 | 传输层 | TCP、UDP |
| 网络层 | 互连层 | IP、ICMP、ARP、RARP |
| 数据链路层、物理层 | 主机-网络层 | 以太网、X.25、令牌环 |
记忆上不用死背。从HTTP开始往下数:HTTP属于应用层,它把数据交给TCP,TCP加端口信息后交给IP,IP负责寻路,最后落到以太网传输。这条链路完整走一遍,四层和七层的对应关系自然就清楚了。想直观看到互连层每跳选路,可以用系统自带的traceroute观察:
traceroute -n example.com
参数 -n 表示不解析每跳节点的主机名,直接显示IP地址。输出里每一行代表一个路由器接口,也就是一个网络层转发点。如果中间某一跳全是星号,说明该节点不回ICMP超时报文,但并不代表链路一定中断。
3. 物理层与数据链路层:编码、CRC 和滑动窗口的演算
物理层定义的是比特怎么在介质上传输,数据链路层解决的是比特怎么成帧、怎么检错、怎么可靠交付。这一层是全网记忆量最大的地方,也是计算题最密集的地方。把这几个公式和协议判据掌握好,大部分选择题可以直接推导。
3.1 波特率与比特率:四相调相那 8000b/s 怎么来的
比特率和波特率的关系是 R = B × log₂(M),其中R是比特率,B是波特率,M是码元的离散状态数。四相调相系统有4个相位,每个码元携带log₂4=2比特信息。题目给波特率4000波特,代入公式得到 R = 4000 × 2 = 8000b/s,选B。
这个公式引申出两个极限类考点。奈奎斯特公式给出无噪声信道的码元速率上限为 2H,比如10kHz带宽的信道,码元速率极限是20Kbaud。香农公式给出带噪信道的容量上限 C = H × log₂(1 + S/N),信噪比30dB等于1000倍,3kHz带宽下最大传输速率约30kbps。做题时看关键词:题目说“无噪声”或“码元速率”就用奈奎斯特;题目给了“信噪比”或“dB”就用香农。
3.2 数字编码与时钟自含:为什么不归零编码要配时钟线
物理层协议定义的标准有四个特性:机械、电气、功能和规程,也就是通常说的“机电功规”。RS-232C这类物理层接口就是按照这四个维度定义的,其中串行通信的方向结构分为单工、半双工和全双工。
数字编码是物理层另一个高频点。不归零编码用恒定电压表示0和1,每个码元时间中点作为采样点。它的缺点是长串相同比特时没有跳变,接收端无法提取时钟信号,因此不自含时钟。曼彻斯特编码在每个码元中间必有一次跳变,跳变既代表数据又充当时钟,属于自含时钟编码。差分曼彻斯特编码同样自含时钟,但数据由跳变方向决定。三者对比如下:
| 编码方式 | 自含时钟 | 特征 |
|---|---|---|
| 不归零编码 | 否 | 电平直接表示0/1,需额外时钟线 |
| 曼彻斯特编码 | 是 | 码元中间跳变,上升/下降沿表示1/0 |
| 差分曼彻斯特编码 | 是 | 根据码元起始处是否跳变表示0/1 |
这里容易错的是“调相编码”。调相属于模拟调制技术,不属于数字编码技术,出现这个选项时要排除。编码之外,电话语音PCM采样频率8kHz也值得记:语音信号最高频率约4kHz,按奈奎斯特采样定理取2倍得到8kHz。
3.3 用 Python 手算 CRC:从生成多项式到冗余位 1010
循环冗余校验是数据链路层最经典的检错方式。题目里信息位是1011001,对应多项式 G(x) = x⁶ + x⁴ + x² + 1;生成多项式是11001,对应 G(x) = x⁴ + x³ + 1。生成多项式最高次幂是4,所以先在信息位后面补4个0,再做模2除法,余数就是冗余位。
def crc_remainder(bits: str, divisor: str) -> str:
block = list(bits + "0" * (len(divisor) - 1))
for i in range(len(bits)):
if block[i] == "1":
for j in range(len(divisor)):
block[i + j] = "0" if block[i + j] == divisor[j] else "1"
return "".join(block)[-(len(divisor) - 1):]
info = "1011001"
gen = "11001"
print(crc_remainder(info, gen)) # 1010
这段代码的要点是: block 长度等于信息位加生成多项式长度减1,也就是补了4位0;循环扫描到某一位为1时,从这一位开始和生成多项式按位异或,相当于模2除法中的“相减”。最后截取末尾4位就是余数1010。接收端把信息位加冗余位拼起来,再用同一个生成多项式除,余数为0则认为数据没被破坏。
提示:做CRC计算题时,补零个数看生成多项式的最高次幂。比如11001是4次多项式,就补4个0;信息位本身只是被除数,不参与决定补零个数。
3.4 停止等待、Go-back-N 与选择重传:窗口参数对照
数据链路层可靠传输协议按窗口大小分类,停止等待协议发送窗口等于1、接收窗口等于1;Go-back-N协议发送窗口大于1、接收窗口等于1,出错时从错帧开始重传后续所有帧;选择重传协议发送窗口大于1、接收窗口也大于1,只重传真正出错的帧。三种协议对比:
| 协议 | 发送窗口 | 接收窗口 | 重传单位 |
|---|---|---|---|
| 停止等待 | 1 | 1 | 单帧确认后发下一帧 |
| Go-back-N | >1 | 1 | 出错帧及其后全部帧 |
| 选择重传 | >1 | >1 | 仅出错帧 |
停止等待实现最简单,但每一帧都要等确认,信道利用率低;Go-back-N在丢包率高的链路上会出现大量无效重传;选择重传效率最高,代价是接收方要缓存乱序到达的帧。选择重传里有个配套考点:如果帧序号用3位二进制编码,最大序号是7,超出7就需要更大的序号空间。
3.5 HDLC 帧同步与比特填充:01111110 背后的逻辑
HDLC全称高级数据链路控制规程,是面向比特的同步协议。它的帧头帧尾都是标志字段01111110,问题在于数据帧里完全可能出现连续的6个1,这时如果没有特殊机制,接收端会把数据中间的内容误认为帧边界。解决办法是比特填充:发送端每遇到连续5个1,就在后面插入一个0;接收端收到连续5个1后,删除后面紧跟的0。
def bit_stuff(bits: str) -> str:
result, count = [], 0
for bit in bits:
if bit == "1":
count += 1
result.append(bit)
if count == 5:
result.append("0")
count = 0
else:
count = 0
result.append(bit)
return "".join(result)
print(bit_stuff("011111100110111110"))
count 记录当前位置连续出现的1的个数,达到5个就插入一个0并清零;遇到0则说明不是连续5个1,计数器清零。接收端反向执行:遇到连续5个1就删除后一个0。考试里如果给出一段二进制让判断填充是否正确,先数连续1的个数,再看第6个位置是不是被插入的0。
4. 网络层与传输层:路由、IP 编址和 TCP/UDP 端口
过了物理层和数据链路层,网络层与传输层是协议树的主干。网络层负责跨网寻路,传输层负责端到端的进程通信。这两层的关键是分清“设备做什么”和“协议怎么做”。
4.1 网络层三大功能与路由器职责边界
网络层的主要功能包括路由选择、拥塞控制和网际互连。路由选择决定数据报从哪个接口出去,拥塞控制避免中间节点缓冲耗尽,网际互连解决异构网络之间的通信问题。需要注意,差错校验不出现在网络层功能里,帧校验是数据链路层的职责。
路由器工作在网络层,负责建立路由表、维护路由表和分组转发。题目里“不属于路由器功能”的选项往往是协议转换,协议转换是网关的特征。路由协议方面,OSPF全称开放最短路径优先协议,是链路状态路由协议;RIP是距离向量路由协议,主机里的RIP工作在被动态,路由器里的RIP工作在主动态,因为只有路由器才需要周期性地广播和接收路由更新。
4.2 IP 地址结构:网络标识与主机标识
IPv4地址由4个字节共32位组成,结构上分成网络标识和主机标识两部分。网络标识决定主机属于哪个网络,主机标识决定是该网络内的哪台设备。A类地址首字节范围1到126,默认掩码255.0.0.0,分配给大型网络;B类首字节128到191,掩码255.255.255.0.0,用于中型网络;C类首字节192到223,掩码255.255.255.0,是最常见的小型局域网配置。
| 地址类别 | 首字节范围 | 默认子网掩码 | 适用规模 |
|---|---|---|---|
| A类 | 1 – 126 | 255.0.0.0 | 大型网络 |
| B类 | 128 – 191 | 255.255.0.0 | 中型网络 |
| C类 | 192 – 223 | 255.255.255.0 | 小型局域网 |
做题快速判类的方法是看十进制首字节落在哪个区间。比如192.0.21.36首字节192属于C类,而198.25.257.1是无效地址,因为第二段257已经超出0到255的范围。IP地址里的“网络标识+主机标识”组合题也常以D类组播地址干扰,A、B、C三类之外的地址类型不要选。
4.3 TCP 与 UDP 行为差异:面向连接可靠传输 vs 无连接数据报
TCP服务采用面向连接的可靠传输,数据传输前先建立连接,传输过程有确认、重传、排序和流量控制。UDP采用面向无连接的数据报传输,发送前不建立连接,直接交给网络层发出。因此UDP传输过程中可能出现分组丢失、分组重复和分组乱序,而“建立连接”是TCP才有的行为。
TCP连接释放采用对称方式,双方各自关闭自己方向的传输通道,所以需要四次挥手完成全部关闭。传输层地址不是网卡物理地址也不是IP地址,而是主机进程的端口号。端口号的原题口径是“服务器的端口范围小于256”,这在早期教材里常见;按主流编号规则,周知端口范围是0到1023。
4.4 用一段 socket 代码验证 TCP 的“连接”
把TCP的三次握手落到实际操作,用Python的socket库打开一条到HTTP服务器的连接:
import socket
with socket.create_connection(("example.com", 80), timeout=5) as s:
s.sendall(b"HEAD / HTTP/1.0\r\nHost: example.com\r\n\r\n")
print(s.recv(128))
create_connection 内部完成域名解析和TCP三次握手,返回的socket对象就代表一条已建立的连接; sendall 保证整段字节发出; recv(128) 读取服务端返回的前128字节。执行这条代码相当于手动模拟了浏览器访问网站的第一步:应用层HTTP请求交给TCP,TCP加上端口信息建立连接,IP再根据目标地址选路转发。
5. 应用层与局域网协议:DNS、邮件和以太网怎么看
应用层是最靠近用户的一层,DNS、邮件、HTTP都属于这里。局域网部分则集中在以太网标准和介质访问控制上。把协议端口、域名层级、帧长标准串起来,这块内容基本就不会再丢分。
5.1 DNS 解析链:从域名到 IP 再到 ARP 的完整路径
DNS的全称是域名系统,基本作用是把域名转换成IP地址。域名结构里有国家顶级域名,例如CN,也有网络专用和通用顶级域名,例如COM、NET、EDU、GOV、ORG。题目问“属于国家顶级域名”时答案就是CN。
域名服务器按职责分为本地域名服务器、根域名服务器和授权域名服务器。“远程域名服务器”不是标准分类,属于干扰项。主机要访问别名时,先请求本地域名服务器,本地没有缓存就向上请求根域名服务器,最终由授权域名服务器给出结果。验证解析结果用系统命令:
nslookup example.com
返回结果里的Address字段就是解析出的IP地址。需要说明的是,应用层拿到IP之后,数据链路层在以太网上传输时还要把IP解析成MAC地址,这个工作由ARP协议完成。互连层的四个重要协议IP、ICMP、ARP、RARP正好覆盖了寻址、差错报告和地址解析这几件事。
5.2 邮件协议分工:SMTP 发送、POP3 接收、HTTP 端口 80
邮件系统的发送和接收由不同协议承担。用户发送邮件使用SMTP协议,也就是简单邮件传输协议;接收邮件使用POP3协议,POP3把邮件从服务器下载到本地客户端阅读。IMAP协议更灵活,可以只浏览邮件头部,再由用户决定是否下载或删除。客户端浏览器和Web服务器之间的应用层通信协议则是HTTP。常用应用层协议端口如下:
| 协议 | 端口 | 用途 |
|---|---|---|
| SMTP | 25 | 发送邮件 |
| POP3 | 110 | 接收邮件 |
| IMAP | 143 | 接收邮件,可部分下载 |
| HTTP | 80 | 网页访问 |
| HTTPS | 443 | 加密网页访问 |
做题时注意区分“用户到服务器”和“服务器到服务器”。用户把邮件投递到SMTP服务器用SMTP,服务器之间转发也用SMTP,而用户从服务器取回邮件用的是POP3。FTP对应文件传输服务,DHCP对应动态主机配置,DNS对应域名解析,看到协议匹配功能时不要张冠李戴。
5.3 以太网与无线局域网:10BASE-T、802.11 和帧长上限
10BASE-T是传统以太网标准,传输速率10Mb/s,介质使用双绞线。快速以太网100BASE-TX同样用双绞线,100BASE-FX则用光缆介质,100BASE-T4也是双绞线。题目问“100BASE-TX采用的介质”时选双绞线,问“光缆方案”时选100BASE-FX。
以太网最大帧长是另一个固定考点。经典以太网最大数据帧长为1518字节,其中用户数据区默认1500字节,加上14字节以太网头、4字节帧校验字段,正好1518字节。无限局域网标准是802.11,它与802.3以太网、802.4令牌总线、802.5令牌环并列记忆:看到“无线”就选802.11。这一组标准编号在IEEE 802体系里固定,不要混记。
5.4 虚拟局域网划分与 ATM 信元的 53 字节
虚拟局域网可以在二层网络上隔离广播域,常见划分方式包括按交换机端口划分、按主机MAC地址划分、按第三层协议划分。按“进程端口号”划分不是虚拟局域网的划分方法,因为进程端口属于传输层之上的概念,和局域网二层分组不在同一层。这里的干扰项很好识别,只要看到“进程端口号”就能直接排除。
异步传输模式ATM是另一类常考概念。ATM的信元固定长度为53字节,其中5字节是信头,48字节是信息字段。固定长度信元的优势是交换节点可以用硬件并行处理,不用像变长分组那样做复杂缓冲调度。53这个数字没有推导逻辑,属于纯记忆类考点,考前过一遍即可。
6. 把考点变成可自测的抽卡脚本:用 Python 给这份 PDF 做间隔复习
PDF里的考点大多是“一句话答案”类型,比如窗口参数、端口号、标志字段。这类内容最有效的复习方式不是从头翻到尾,而是随机抽卡、默写、对答案、把错题重新入队。下面这段脚本把题目存成JSON列表,每轮随机打乱后逐题输出。
import json, random
cards = [
{"q": "停止等待协议的发送窗口、接收窗口分别为?", "a": "1 和 1"},
{"q": "HDLC 帧标志字段是什么?", "a": "01111110"},
{"q": "带宽 10kHz 的无噪声信道,码元速率极限是多少?", "a": "20Kbaud"},
{"q": "选择重传协议中 3 位帧序号的可用序号范围?", "a": "0 到 7"},
]
random.shuffle(cards)
for c in cards:
print("Q:", c["q"])
input("按回车显示答案")
print("A:", c["a"])
代码里 random.shuffle 打乱题目顺序, input 阻塞等待用户回忆答案,按下回车后才显示标准答案。这样做比直接读PDF多了一层必要的“主动回忆”,记忆保留率明显更高。想和Anki这类工具结合时,把同样的结构写成两列CSV,第一列是问题、第二列是答案,导入Anki就能生成卡片。
错题处理可以做得再细一点。把每轮答错的题目收集起来,重新加入队列尾部:
wrong = []
for c in cards:
ans = input("默写答案: ")
if ans.strip() != c["a"]:
wrong.append(c)
cards.extend(wrong)
这里 ans.strip() 去掉首尾空格再比较,避免手误造成误判; extend 把错题追加到原列表末尾,下一轮打乱后还会再次出现。想实现真正的间隔重复,可以给每条记录加一个 next_time 字段,用当前时间判断题目是否到复习时间。这样一套轻量脚本就能把这份计算机网络原理PDF从“看过一遍”变成“能复现出准确答案”,比考前临时翻找要稳妥得多。
更多推荐


所有评论(0)