前几天一个做DevOps的朋友跟我吐槽,说自己面试几家公司的运维和平台研发岗,笔试环节几乎都绕不开计算机网络,而且每次都挂在一些“看似基础的高频题”上:TCP三次握手为什么不是两次、/26这个网段到底能分配多少个可用IP、交换机收到一个目的MAC未知的帧会怎么处理。我让他把题目发来看了一圈,发现这些内容在《计算机网络》这门课里确实属于“重要、高频”的范畴,但教材和题海往往不会告诉你怎么把它们串成一张能直接用的知识网。
这篇文章就是一份带有个人踩坑经验的高频考点梳理上篇,覆盖从分层模型到传输层的内容。适合正在准备期末考、考研408、后端或DevOps岗位面试的读者,也适合工作中需要排查网络问题但基础不牢的工程师。我会把每一块考点背后的“为什么”讲清楚,再给出可以直接用来答题和排障的记忆框架。应用层和常见安全机制留在下一篇,先把地基打牢。
1. 一张课后答疑截图,讲透分层模型为什么年年考、人人错
1.1 “背得出七层名字”不等于“理解分层”
我见过太多人能把OSI七层倒背如流,从物理层一路背到应用层,表情都不带变的。但只要你抛出一个具体问题——路由器工作在哪一层、交换机在哪一层、集线器在哪一层——很快就有人答错。
错的原因不是记性差,而是把“设备的物理形态”和“协议分层逻辑”混在一起了。判断一个设备属于哪一层,要看它解封装到哪一层、读取哪个字段来转发。交换机解封装到数据链路层,读取目的MAC地址,根据MAC地址表转发,所以它是二层设备。路由器解封装到网络层,读取目的IP地址,查询路由表决定下一跳,所以它是三层设备。集线器只做信号放大和广播,甚至不解析MAC地址,严格说就是物理层设备。
这里有个很实用的类比。你在小区收快递:快递公司按城市分拣是网络层的工作,到了小区之后物业按楼栋号分拣是数据链路层的工作,门卫按门牌号确定具体哪户才算应用层。这个类比不完全严谨,但理解“越往上,信息粒度越细”是够用的。
1.2 到底背五层还是七层?选错框架容易被扣分
除了OSI七层模型,你可能还见过TCP/IP四层模型和TCP/IP五层模型。这三个模型在一个教室里出现,每年都有人被绕晕。
实际互联网的协议栈更接近五层模型:物理层、数据链路层、网络层、传输层、应用层。OSI七层是把五层的“应用层”拆成了表示层和会话层,又把数据链路层和物理层拆开,在学术讨论和标准制定时很有意义,但日常开发和排障中几乎不单独提“会话层”和“表示层”。
考试和面试建议锚定“五层模型”,同时知道OSI七层的拆分方式即可。下面这张表是高频考点的浓缩版,建议保存下来反复看:
| 层级 | 核心职责 | 数据单元常用名称 | 典型协议 | 典型设备 |
|---|---|---|---|---|
| 物理层 | 透明传输比特流 | 比特 | 无(定义电气特性) | 中继器、集线器 |
| 数据链路层 | 相邻节点间可靠传帧 | 帧 | 以太网、PPP | 交换机、网卡 |
| 网络层 | 源到目的地址寻址与路由 | 分组 / 数据报 | IP、ICMP、OSPF | 路由器 |
| 传输层 | 端到端通信、可靠性控制 | 报文段(TCP)/ 用户数据报(UDP) | TCP、UDP | 无独立硬件 / 四层负载均衡 |
| 应用层 | 为用户提供应用功能 | 报文 | HTTP、DNS、FTP | 应用程序、七层负载均衡 |
请注意,这里最容易出错的点是“分组、数据报、报文段、帧”这些名词属于哪一层。很多笔下写得快的同学会把IP数据报写成报文段,这一分丢得很冤。
1.3 数据在层与层之间是怎么“递”过去的
理解分层之后就要理解封装和解封装。发送端从上往下,每层在数据前面加一个属于自己的头部;接收端从下往上,每层剥掉对应头部再交给上层。这个过程就是“封装/解封装”。
具体到一次HTTP请求,浏览器先把HTTP报文交给TCP层,TCP层加20字节TCP头部,把它封装成报文段;IP层再加20字节IP头部,封装成IP数据报;数据链路层再加14字节以太网头部和4字节帧检验序列,封装成帧;物理层把帧变成比特流发送到网线或无线信道上。
考试里经常给一个“从上到下数据单元依次是什么”的填空题,按“报文段 → IP数据报/分组 → 帧 → 比特”记就不会乱。排障的时候,我们抓包看到的一般都是帧,Wireshark会自动拆开各层头部显示,能直接看到IP源地址、TCP端口和HTTP内容,这也是为什么懂分层的人看抓包不会懵。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 物理层与数据链路层:一直被忽略、一考就送命的“底层两兄弟”
2.1 物理层不只是信号:速率、带宽、时延计算题年年有
物理层乍一看离应用最远,但它是一切的承载者。很多没有实际接触过网络设备的人觉得物理层就是“两根线”,其实笔试面试常考的是几个计算公式和单位换算。
数据从发送方发出到接收方收到,总时延由四部分构成:发送时延、传播时延、处理时延、排队时延。发送时延等于数据帧长度除以发送速率,传播时延等于信道长度除以信号传播速率。经典干扰项是——带宽明明很高,为什么延迟还是很高?因为带宽决定的是“单位时间内能塞进管道的比特数”,而传播时延取决于“管道长度和介质中的光速”。一公里光纤的传播时延,我习惯用五微秒左右来估算,因为光在光纤中的速度约为2×10^8米每秒。
带宽、吞吐量、速率这三个词也经常被拿来挖坑。带宽是链路最大能力,吞吐量是实际通过量,速率是当前正在用的传输速度。如果你的系统被第三方风控提示“网络中存在异常流量”,那通常是对方在网络层和传输层观察到了请求频率、并发连接数或TCP握手行为的异常,而不是物理层的噪声问题。这类行为分析和物理层关系不大,但说明计算机网络是从物理层到应用层联动的整套体系。
2.2 以太网帧结构:一个你能背但总记不全的高频点
以太网是现在最主流的数据链路层协议,不管你是用Wi-Fi还是有线,数据都被封装成以太网帧。帧结构是所有网络工程师的基础功。
一个标准以太网帧包含:目的MAC地址6字节、源MAC地址6字节、可能存在的VLAN Tag 4字节、类型/长度字段2字节、数据部分46到1500字节、帧检验序列FCS 4字节。所谓“巨型帧”允许数据部分超过1500字节,但在跨运营商链路时很容易被丢,内部局域网可以开,广域网别乱动。
最小帧长为什么是64字节?这个可以从历史讲起:传统共享式以太网用CSMA/CD避免冲突,发送方必须保证在数据帧发送完成前能检测到最远端的碰撞,所以帧太短不行。现在的交换式以太网基本都是全双工,冲突域被消灭,CSMA/CD已经退出日常应用,但考试还是很爱考这个概念,你需要知道它的存在和目的。
FCS字段用于帧尾部校验,常用CRC循环冗余校验。CRC能检错但不能纠错,收到校验错的帧直接丢弃。这解释了为什么底层的“可靠传输”其实是个错觉——数据链路层能发现错误,但真正做错误恢复的是上面的TCP层。
2.3 ARP缓存与交换机“记忆”:排障时最好用的底层知识
数据链路层离不开MAC地址,但访问一个IP地址时怎么知道对方的MAC地址?答案是ARP协议。
ARP的核心逻辑是:主机或路由器先查自己的ARP缓存表,如果没有目的IP对应的MAC地址,就在所在广播域内发送一个ARP广播请求。只有目的IP对应的设备会回复单播ARP应答。这里有一个高频判断题:ARP请求是广播还是单播?答案是请求广播、应答单播。
实际排查中,ping不通的第一件事不是反复ping,而是看ARP缓存。在Windows上用arp -a,Linux上用ip neigh,能看到IP和MAC的对应关系。如果目标设备的ARP表项状态异常,比如指向一个不存在或错误的MAC,那数据帧就会发到错误的位置。这也是ARP欺骗的入口:攻击者伪造ARP应答,把合法IP的MAC改写成攻击者电脑的MAC,从而截获流量。你不需要把ARP欺骗做成攻击工具,但理解原理能帮你排查“突然所有外网请求都超时”这类诡异问题。
交换机转发也依赖MAC地址表:收到一个源MAC未知的帧,会先把源MAC记录进表并关联端口;收到目的MAC未知的帧,会向所有端口泛洪。所谓“交换机记性越好,泛洪越少”说的就是这个MAC地址表。这里顺带记一个考点:交换机属于数据链路层设备,但它也能配置VLAN,甚至有三层交换机这类支持IP路由的设备,别因为一个“三层交换机”就把基础概念搞混。
3. 网络层:IP地址规划与路由协议,笔试面试的主战场
3.1 子网划分从“会算”到“秒算”:一套固定套路
网络层最核心的就是IP协议,而IP地址的子网划分又是公认的必考高频点。很多题目不是难,是算得慢。
先建立最基础的公式:网络地址 = IP地址与子网掩码按位相与;广播地址 = 当前这个子网的网络地址加上主机位全为1的部分;一个子网可分配主机数 = 2的“主机位数”次方减去2。减去2是因为网络地址和广播地址不能分配给主机。
举例说明。地址192.168.1.66,子网掩码255.255.255.192,也就是前缀/26。掩码最后一段192的二进制是11000000,主机位是6位。把66转成二进制01000010,与11000000相与得到01000000,即64,所以网络地址是192.168.1.64。这个子网的广播地址是主机位全1,也就是01011111,即95,所以广播地址是192.168.1.95。可用主机范围是192.168.1.65到192.168.1.94,一共62台。
这种方法建议练到几乎是条件反射。我再分享一个偷懒表,做题时直接对应,不用每回都写二进制:
| 前缀 | 掩码 | 主机位数 | 每个子网可用IP数 |
|---|---|---|---|
| /24 | 255.255.255.0 | 8 | 254 |
| /25 | 255.255.255.128 | 7 | 126 |
| /26 | 255.255.255.192 | 6 | 62 |
| /27 | 255.255.255.224 | 5 | 30 |
| /28 | 255.255.255.240 | 4 | 14 |
| /29 | 255.255.255.248 | 3 | 6 |
| /30 | 255.255.255.252 | 2 | 2 |
需要注意的是,/30这种子网只有2个可用地址,通常用于路由器和路由器相连的链路,刚好占用两端,不多不少。
3.2 路由转发靠“最长前缀匹配”,不是“最短路径优先”
知道IP地址之后,必须知道数据包怎么从源地址到达目的地址。路由器不关心整个路径,它只根据路由表决定“下一跳”,每一跳都这样接力。
路由表匹配遵循最长前缀匹配原则:如果有多条路由项都能匹配目的IP,前缀更长、更具体的路由优先生效。这个原则很直观——按“国家→省→市→区”逐级细化,“你住在哪个小区”永远比“你在哪个国家”更能指导路线选择。默认路由/0作为兜底,匹配不到时才走它。
动态路由协议是另一个高频题点。RIP是距离向量协议,以跳数为度量,最大有效跳数15,适合小型网络;OSPF是链路状态协议,维护全网拓扑,基于最短路径算法计算,收敛快,适合中大型企业内部网络;BGP用于自治系统之间的路由交换,属于路径向量协议,看重策略而非单纯的低延迟。这三者一旦放进同一道选择题里,就非常考验概念边界。
我之所以强调这些,是因为后端和DevOps岗位排查“跨机房访问时延高”时,经常要查看路由路径。bash里traceroute和ip route是基本工具。traceroute能显示每一跳的IP和时延,它的原理靠ICMP超时消息:把TTL从1开始递增,每过一跳路由器会丢掉TTL为0的包并回一个ICMP时间超时报文。
3.3 IP分片、TTL与协议字段:容易被新同学遗漏的高频选择题
IPv4报头固定20字节,里面有三个字段几乎每年都会碰到。TTL是8位,每经过一个路由器减1,减到0就丢弃,同时回发ICMP超时报文,traceroute依赖的就是这个。协议字段用来告诉IP层“上层是什么”:1代表ICMP,6代表TCP,17代表UDP。抓包时你看到的EtherType字段是0x0800,表示上层是IPv4,这和IP头部里的协议字段不是一个东西,别混。
IP分片也是常客。当数据包超过路径MTU时,路由器可能分片。IPv4报头里的DF标志位表示“不分片”,MF表示“还有更多分片”,片偏移表示当前分片在原数据报中的偏移。TCP为了避免IP分片,会主动协商一个较小段长,比如通常使用1460字节作为最大报文段大小,让IP数据报总长正好落在MTU 1500字节以内。UDP没有这种协商,所以UDP包更容易触发分片。
IPv6就干脆很多:中间路由器不再分片,只有源端允许分片,报头基本固定40字节,还取消了校验和字段,直接干到简单服务器友好。这个设计理念值得体会:把转发路径上的函数简化,把复杂留给边界。
4. 传输层:TCP的可靠性设计与UDP的高效性能,面试官最爱深挖的地方
4.1 端口号与套接字:一个IP怎么承载无数连接
传输层最大的作用是提供端到端的进程通信,靠的就是端口号。端口字段16位,范围0到65535,其中0到1023是知名端口,通常需要特权绑定。高频端口要背熟:HTTP是80,HTTPS是443,SSH是22,DNS是53。
一个连接的四元组是“源IP、源端口、目的IP、目的端口”。上网浏览时,你的浏览器会随机用一个高位端口(比如50000)去连接服务器的443端口,服务器回应时目的端口就是那个50000。靠这个四元组,一台服务器才能同时维持几十万条TCP连接。
理解套接字后,面试中“一台服务器最多能支持多少TCP连接”这类题就不会瞎答:理论上受限于文件描述符、内存和四元组组合数,而服务器端能同时连接的客户端数量远大于端口数,因为区分连接靠的是四元组而不是服务器端口号。
4.2 TCP三次握手和四次挥手:每个状态都不是白给的
TCP三次握手应该是计算机网络里被问得最多、也答得最套路化的点。背出“SYN、SYN+ACK、ACK”只是第一步,真正值钱的是能讲清楚为什么必须是三次。
第一次握手客户端发送SYN,服务器收到后能确认客户端的发送能力正常;第二次握手服务器回SYN+ACK,客户端收到后能确认服务器的发送和接收能力正常;但这时服务器还不能确认客户端的接收能力是否正常,直到第三次握手客户端发来ACK,服务器才确认客户端接收正常。换句话说,三次握手让双方都确认了“对方能收、对方能发、我能收、我能发”这四项基本能力。只有两次的话,服务器永远不知道客户端的接收端是否在线。
四次挥手更复杂,但高频考点集中在一个词:TIME_WAIT。主动关闭连接的一方在发送最后一个ACK后进入TIME_WAIT状态,持续约2MSL(最大报文存活时间的两倍)。为什么不是直接关闭?两个原因:第一,确保最后一个ACK能成功到达对方,如果丢了还能靠超时重传;第二,让网络中残留的旧重复报文自然过期,避免污染下一个相同四元组的新连接。TIME_WAIT一般出现在主动关闭方,也就是客户端居多,但服务器主动断开连接时也会出现大量TIME_WAIT。高并发调优时很多人会去调短TIME_WAIT,我的建议是:先理解状态再动手,不要盲目开TIME_WAIT reuse这类技巧,因为场景错了很容易引入连接串话问题。
还有一个高频坑是CLOSE_WAIT。被动关闭方收到FIN后处于CLOSE_WAIT,此时应用层还没有调用close,如果程序一直不关闭socket,就会出现大量CLOSE_WAIT堆积。业务层这种问题往往比TIME_WAIT更值得查。
4.3 可靠传输不是“发了等确认”那么简单:滑动窗口与拥塞控制
TCP实现可靠传输的基础是序号、确认号、重传超时。但是你如果只知道“每发一个包等一个ACK”,就理解不了一个关键问题:为什么还要滑动窗口?
停止等待协议确实简单,但信道利用率很低——一发一收,大部分时间在等待。滑动窗口的思想是允许发送方连续发送多个报文段,接收方累积确认或挨个确认,发送方窗口内的数据可以不等ACK就发出去。窗口大小直接影响吞吐量,同时接收方也能通过窗口字段反推当前还能收多少,这叫流量控制。拥塞控制则是从网络整体层面的调控,和流量控制要区分开:一个是尊重接收方的能力,一个是尊重网络链路的能力。
拥塞控制高频四件套分别是慢启动、拥塞避免、快重传、快恢复。慢启动阶段拥塞窗口指数增长,但到慢启动阈值后转为线性增长的拥塞避免;出现三个重复ACK就触发送发快重传,不必等超时;快重传后进入快恢复,把拥塞窗口降半而非回到初始值。考试想要拿分,背下四个状态的触发条件和窗口变化曲线基本就够了。
UDP则完全是另一套哲学:不保证可靠交付,没有连接状态,头部只有8字节,发送速度快。很多高频判断题问“DNS用TCP还是UDP”,答案是DNS查询通常使用UDP,区域传送或超长响应时可能用TCP。不要死记“DNS是UDP”,传输层选择要结合场景。HTTP/3基于QUIC,而QUIC又跑在UDP之上,本质就是用UDP把可靠性搬到用户态重新设计,这也说明“UDP不如TCP”是个很粗糙的判断。
5. 学习资料与复习路线:王道、谢希仁、自顶向下到底怎么配
5.1 我的资料搭配思路,不选最厚的,只选最省时间的
现在市面上的计算机网络教材和视频课很多,有人推荐谢希仁《计算机网络》、有人推荐《计算机网络:自顶向下》、有人只刷王道考研复习指导。我的看法是,这取决于你的目标和时间预算。
如果你的目标是考研408或期末考,谢希仁的教材体系完整,非常适合搭框架,王道的讲义则带着很浓的“考点驱动”风格,把高频计算题和选择题整理得很方便。我自己当年是先花两周过一遍谢希仁的分层章节,再用王道做专项突破,最后回到真题套卷。不要本末倒置,一开始就沉迷刷题而忽略原理。
如果你的目标是后端、运维、DevOps类的技术面试,我更推荐一本《计算机网络:自顶向下》。它从应用层切入,先讲HTTP、DNS这些你能感知到的东西,再往下探到TCP和IP,整个阅读过程很“工程化”。配合湖科大教书匠这类偏原理推导的视频课,能把三次握手、滑动窗口这些概念在动画里看清楚。视频倍速看即可,不用每一个细节都暂停。
5.2 高频考点自测清单:一篇上篇到底覆盖了哪些必考题
我不喜欢给读者列一个“知识大纲”,但愿意给一个能用来自测的清单。你可以先自己回答一遍,答不出的回到对应章节再看。
这套高频自测题建议在五天内完成两轮:
- 五层模型中,交换机、路由器、集线器各自工作在哪一层?
- 数据经过发送端时,数据单元的名称变化顺序是什么?
- 以太网帧的最小长度是多少字节?为什么这么设计?
- ARP请求和ARP应答分别是广播还是单播?
- 192.168.1.100/27的网络地址、广播地址、可用主机范围分别是什么?
- 最长前缀匹配和默认路由的关系是什么?
- TTL字段的作用是什么?traceroute如何利用它?
- IPv4报头中的协议字段的常用取值有哪些?
- 三次握手为什么不能省略第三次?
- TIME_WAIT出现在四次挥手的哪一方?为什么需要2MSL?
- CLOSE_WAIT堆积一般说明应用程序出了什么问题?
- 滑动窗口、流量控制、拥塞控制三者分别解决什么问题?
- RIP、OSPF、BGP三者属于哪类路由协议?
5.3 把知识变成经验:我最常让新人做的一个练习
每次带新同学,我不建议他们一上来就背考点清单。我会让他们用自己的话解释一次这个场景:在浏览器里输入一个网址并按下回车,从网卡发送数据帧开始,到服务器返回数据,中间每一层分别做了什么。
如果能把这个问题顺畅讲出来,说明分层模型、ARP、IP路由、TCP连接这些概念已经不再是考点,而是工具箱里的零件。剩下要补的,无非是抓包观察这三个过程:打开Wireshark,过滤tcp.port==443,看一次完整的TCP三次握手;过滤arp,看一次ARP广播和单播应答;再用traceroute看一次逐跳的ICMP超时反馈。
我自己踩过的坑是:第一遍看自顶向下时觉得什么都懂了,等到上机抓包时才发现根本分不清TCP报文段里的确认号是“已经收到的最后一个字节序号”还是“期望收到的下一个字节序号”。这里记住关键点:确认号表示期望收到的下一个字节序号,这一句话在滑动窗口和TCP重传的理解里值很多分。
计算机网络的内容到这里,刚好把从物理层到传输层的高频考点过完一轮。这些知识不需要你全部背下来,但需要你形成一个可以在排障、面试和做题时随时调用的框架。下一篇我会补上和实际工作更贴近的应用层与安全高频点,比如HTTP状态码、DNS解析过程、HTTPS握手,以及如何用这些知识快速定位一个网页打不开的问题。在上篇结束前,建议你把上面的自测清单亲手写一遍答案,写出来的那一刻,你大概率会发现——“原来我在没看底库的时候,还是漏掉了不少细节”。
