ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

计算机网络面试高频考点:TCP、HTTP、DNS与子网划分实战解析

计算机网络面试高频考点:TCP、HTTP、DNS与子网划分实战解析

华为OD技术面里,计算机网络几乎是跑不掉的一关。不管你是科班出身还是培训转行,投简历、过机考之后,紧接着的技术面就会从“能不能写代码”转向“基础到底牢不牢”。计算机网络作为计算机专业的基础课,面试官爱问、容易追问、也最容易暴露水平:面试者会背三次握手,却说不清为什么是三次;知道URL输入后会做DNS解析,却不知道递归和迭代的区别。这一篇我打算把OD技术面计算机网络部分的常见考法、答题逻辑和一些临时救场的话术完整梳理一遍,后面还会按系列继续往下拆,方便你直接照着准备。

这篇内容适合两类人:一类是刚过机考、正在系统准备技术面的人,另一类是工作几年想回过头补基础、跳槽面试的人。不管你属于哪一类,我的建议都是一样的——别只背八股,要把每个知识点背后的“为什么”弄明白。

1. 先摸清考情:OD技术面的计算机网络到底在考什么

1.1 技术面流程与计算机网络的位置

从我了解到的情况来看,OD技术面一般会安排一到两轮,面试时间通常在40到60分钟。前10到15分钟是自我介绍和项目背景,剩下的时间大部分会围绕基础知识和手写代码展开。计算机网络往往不是单独拎出来考,而是作为“基础能力摸底”的一部分,穿插在数据结构和操作系统之间,和它们交替追问。

很多候选人容易犯一个错误:把所有复习时间都花在刷题上,在机考阶段把算法练得滚瓜烂熟,却忽略了网络基础。结果一到技术面,面试官随口问一句“TCP和UDP有什么区别”,第一反应只能说出“一个可靠一个不可靠”,然后就没有然后了。这种答法很容易让面试官觉得基础不扎实,哪怕你后面的算法题写得再漂亮,整体印象分也会打折扣。

计算机网络在技术面里的位置其实很微妙。它不像手写算法那样有标准答案、非黑即白,但它出现的频率极高,而且天然适合面试官层层追问:从一个简单问题出发,往深处挖两三轮,候选人的知识边界马上就能探出来。所以准备这部分时,不要只准备“答案”,要准备“答案背后的逻辑链”。

1.2 高频考点地图

根据我对多场面试的复盘,计算机网络部分的高频考点大致可以按层级划分成下面几块。先记住这个整体分布,复习时心里就有谱了。

知识层级高频考点常见考察形式出镜率
应用层HTTP状态码、请求方法、HTTPS握手过程、DNS解析概念问答、场景分析极高
传输层TCP三次握手、四次挥手、可靠传输、流量控制、拥塞控制原理追问、画图/叙述流程极高
网络层IP地址分类、子网划分、CIDR、路由协议计算题、概念题高
数据链路层MAC地址、ARP协议、交换机工作原理概念问答中等
网络工具ping、telnet、curl、nslookup的实际使用面试官模拟场景提问中等

这里面,传输层和应用层是重中之重。原因很简单:日常开发中最常打交道的就是HTTP和TCP,面试官自己写代码时也在用,问起来最顺手、最容易判断候选人的真实水平。网络层下面的子网划分则偏向“熟练度”,只要计算题套路掌握了,基本是送分题。

另外一个容易被忽略的点是:面试官很喜欢用“给一个场景让你判断或选择”的方式出题,比如“视频通话卡顿,你会选TCP还是UDP”“一个请求在浏览器里转了很久,怎么排查”。这类题目没有固定答案,考的是你把原理映射到实际问题的能力。我后面会专门展开这部分。

2. 高频真题拆解:从问题到答题逻辑

2.1 输入一个URL后发生了什么

这道题几乎可以说是计算机网络面试的“必考题”,也是我最推荐大家认真准备的题目之一。很多候选人一听到这道题就开始背:先DNS解析、再TCP连接、发HTTP请求、服务器返回、浏览器渲染……背得头头是道,但面试官随便挑一个中间环节追问,就卡壳了。

先看一个合格的回答应该覆盖哪些环节:

  1. 用户在浏览器输入URL并回车
  2. 浏览器对URL进行解析,提取协议、域名、端口、路径等信息
  3. 浏览器先查本地DNS缓存,没有就请求DNS服务器解析域名,拿到IP地址
  4. 浏览器与服务器建立TCP连接(三次握手)
  5. 如果协议是HTTPS,还要额外进行TLS握手协商密钥
  6. 浏览器构造并发送HTTP请求报文
  7. 服务器处理请求并返回HTTP响应报文
  8. 浏览器解析响应内容,包括HTML、CSS、JS、图片等静态资源,同时继续发起子资源请求
  9. 浏览器渲染页面,完成展示

面试官在这道题上的“杀手锏”是追问细节。DNS解析过程中,你的电脑不知道IP地址时,到底会问谁?这个问题考查的就是递归查询和迭代查询的区别:你的电脑先问本地DNS服务器,如果本地没有缓存,再由本地DNS服务器帮你去问根域名服务器、顶级域名服务器、权威域名服务器,拿到结果后缓存在自己这里,再返回给你——这是递归查询;而本地DNS服务器依次向各层级查询的过程,就是迭代查询。

TCP连接为什么是三次握手而不是两次?这题放在后面单独说。HTTP请求报文长什么样、状态码有哪些,也是这道题的天然延伸点。我的经验是,回答这道题时要主动“展开”,不要像个清单一样一条条念完就闭嘴。你可以把每个环节“一笔带过但点出关键词”,让面试官知道你清楚细节,比如“DNS解析时如果本地没缓存,会走递归+迭代的流程拿到IP”,这样既表达了信息量,也给了面试官一个切入点。

还要提醒一点,不要答出“从输入URL到页面展示一共经历了XX毫秒”这种毫无依据的数据。面试官想听的是机制,不是你拍脑袋的数字。

2.2 TCP三次握手与四次挥手:背诵之外,面试官真正想看什么

三次握手和四次挥手是计算机网络的万年考点。我见过太多人的准备方式就是背一张图:SYN,SYN+ACK,ACK;FIN,ACK,FIN,ACK。背得倒是挺熟,可面试官只要换一个角度问就露馅。

先说三次握手,重点是“为什么不是两次”。不要只回答“因为要确认双方的收发能力”,这只是一部分。更完整的理解是:两次握手无法避免历史重复连接初始化造成的资源浪费。客户端的一个过期SYN包如果先到达服务器,服务器回复SYN+ACK后就直接分配资源了,但客户端根本没有发起新连接,这个连接就是白建的。三次握手让客户端可以根据服务器的序号判断连接的新旧,发现是历史连接就发送RST终止,避免服务器白白消耗资源。

四次挥手也是一样,重点在于“为什么是四次”。因为TCP是全双工的,每一方的连接关闭都要经过一次FIN和一次ACK确认。理论上客户端和服务器的数据发送是独立的,所以两端各关各的,拆开来看就是四步。面试官还喜欢追问TIME_WAIT的作用:主动关闭方为什么要停留在TIME_WAIT状态而不是直接关闭?原因有两个——一是要确保最后一个ACK能让对方收到,如果对方没收到会重发FIN,你还需要继续回应;二是防止本连接的旧数据包出现在新连接中被错误接收。

如果面试官继续往深挖,还可能问TCP拥塞控制的四个算法:慢启动、拥塞避免、快重传、快恢复。慢启动是指连接初始时拥塞窗口很小,然后指数增长,直到触及阈值;到达阈值后进入拥塞避免阶段,窗口线性增长;丢包时依靠快重传机制,收到三个重复ACK就立即重传,而不是等超时;随后进入快恢复,窗口减半而不是从1重新开始。这四个算法几乎必考,建议把每个阶段的行为、触发条件、窗口变化规律都整理成一张图记下来。

回答这类问题的通用思路是:先给结论,再解释原理,最后补充一个实际场景。比如三次握手,先说“因为要确保双方序号同步并防止历史连接浪费资源”,再解释具体机制,最后说“如果没有三次握手,某个过期SYN包会导致服务器开一堆无效连接,资源就会很快被打满”。这样既有理论又能体现工程意识。

2.3 TCP与UDP的对比及衍生考点

TCP和UDP的对比属于基本功,但面试官往往不满足于“TCP可靠、UDP不可靠”“TCP有连接、UDP无连接”这种二维表格。他们更希望看到你能基于应用场景做判断。

我在模拟面试时经常用这几个问题来训练候选人:

  • 视频通话为什么常用UDP而不是TCP?
  • 网页HTTP为什么用TCP而不是UDP?
  • 直播软件用的是TCP还是UDP?
  • 如果让你设计一个实时对战游戏的消息传输方案,怎么选?

这几个问题没有标准答案,考的是你对特性的理解和工程权衡能力。视频通话对延迟敏感,TCP的丢包重传机制会导致数据到达时间不可控,一旦重传就会卡顿,所以宁可允许少量丢包也要保证实时性,UDP更合适。HTTP需要完整准确地传输页面数据,丢一个字节都可能让页面渲染出错,所以选择TCP保证完整性。直播则更复杂——很多系统在TCP基础上做改进,或者使用基于UDP的自研传输协议,夹在“实时性”和“流畅度”之间做取舍。

回答这类问题的框架可以固定为:业务核心指标是什么、带来的约束是什么、TCP/UDP各自如何应对、最终选了谁以及为什么。

另外,面试中还经常出现“TCP的粘包问题”这样的衍生题。很多人一听就懵,其实核心原因很简单:TCP是面向字节流的协议,它不保护消息边界,应用层发来的多个数据包可能会被组合在一起发送,或者一个数据包被拆成多份。解决思路一般是应用层自己定义消息边界,比如固定长度、分隔符、在消息头中声明长度,等等。这类问题其实在后台开发里很常见,能答好会非常加分。

2.4 HTTP状态码、报文结构与HTTPS握手

HTTP相关的题目可以分三层:状态码、报文结构、HTTPS机制。每一层都有一些值得展开的细节。

状态码部分,至少要熟练区分几组容易混淆的:

状态码含义典型场景易混点
301永久重定向域名迁移、HTTP跳HTTPS和302混淆
302临时重定向未登录跳转登录页、短链跳转浏览器行为不同
403禁止访问权限不足和404混淆
404找不到资源URL写错、接口下线服务器不应暴露细节
500服务器内部错误代码异常和502区分
502网关错误反向代理无法连接后端常见于服务端异常

301和302的区别是高频追问点:301是永久重定向,浏览器会缓存这个重定向结果,下次直接访问新地址;302是临时重定向,浏览器每次都会先请求原地址再跳转,不会缓存。

报文结构的话,至少要知道请求行、请求头、请求体,以及响应行、响应头、响应体这几大块,并且能说出几个常见头字段的作用:Host、Content-Type、Content-Length、Authorization、Cookie、Set-Cookie、Cache-Control等等。面试官不一定会让你逐字背格式,但给你一个报文让你分析,你得能说出关键头字段的含义。

HTTPS部分,要能说明为什么它既用非对称加密又用对称加密。道理其实很直白:非对称加密安全但慢,对称加密快但密钥分发不安全,所以两者结合——用非对称加密协商出一个临时对称密钥,握手成功后用对称密钥加密通信数据。TLS握手的简化流程是:客户端发送随机数和支持的加密套件;服务器返回证书和随机数;客户端验证证书,生成预主密钥,用服务器的公钥加密后发给服务器;双方各自计算出会话密钥;之后通信全部使用会话密钥加密。这就是“一次非对称加密换取后续所有对称加密通信”的思路。

2.5 DNS解析过程与IP基础

DNS解析前面已经提到一部分,这里补充一些容易被追问的内容。面试官很可能问你“你们项目里的域名解析不小心配置错了,用户访问异常,怎么排查”。这里要用到nslookup命令,查解析记录、看解析到了哪个IP,再看本地有没有缓存。常见记录类型也要知道:A记录(域名到IPv4)、AAAA记录(域名到IPv6)、CNAME记录(域名别名)、MX记录(邮件服务器)、TXT记录(文本信息,常用于域名验证)。

IP部分,主要是子网划分和CIDR计算。这个放到下一章用实际题目演示,这里先提两个基本概念:一是公网IP和内网IP的区分,二是子网掩码的作用——它用连续的1表示网络位、连续的0表示主机位。面试官让你计算可用主机数时,记住公式是2的(主机位数量)次方减2,因为网络地址和广播地址不可分配。

3. 模拟实战:经典问答现场与操作示范

3.1 从输入URL到看到网页:把链路串成一个故事

这一节我模拟一次面试现场。面试官把“输入URL后发生了什么”这道题抛出来,候选人怎么答才能让面试官点头?给你一个参考模板,但不要背,理解后用自己的话复述:

“假设我在浏览器里输入了一个域名,比如www.example.com。首先,浏览器会解析这个URL,知道协议是HTTPS,域名是www.example.com,默认端口是443。接着开始域名解析:浏览器会先查本地缓存,也就是浏览器DNS缓存、操作系统hosts文件、操作系统的DNS缓存,如果都没有命中,就向本地DNS服务器发起递归查询。本地DNS服务器收到请求后,以迭代方式依次询问根域名服务器、com顶级域名服务器、example.com的权威服务器,最终拿到这个域名对应的IP地址,然后在本地缓存一份,再返回给我的电脑。”

“拿到IP之后,我的电脑开始和服务器建立TCP连接。三次握手的过程是,客户端发送一个SYN报文,服务端收到后回复SYN+ACK,客户端再回一个ACK。这一步的目的是同步双方的初始序列号,而且能确认双方的收发能力都正常。因为这里是HTTPS,TCP连接建立后还要再做一次TLS握手,协商出后面用来加密数据的对称密钥。”

“连接建立后,浏览器构造一个HTTP请求,里面包括请求方法、请求路径、请求头,比如Host、User-Agent、Cookie等等,然后发送过去。服务器收到请求后,找到对应的资源,返回一个HTTP响应,状态码是200,响应体里就是HTML内容。浏览器拿到HTML后开始解析,遇到CSS和JS会再发起新的请求去加载这些资源,同时根据HTML内容构建DOM树,最终渲染成用户看到的页面。”

为什么这个版本比较保险?因为它把每个环节都提到了,但每个环节都留了“钩子”:你提到三次握手时其实可以细讲,提到HTTPS时可以细讲TLS,提到DNS缓存时可以展开递归和迭代。面试官如果感兴趣,自然会顺着你的话往下问,而你因为早就知道这些钩子,完全不会被动。这就是“带节奏”的技术面技巧。

3.2 子网划分与CIDR计算题复盘

子网划分几乎是必考的计算题,而且一旦会了就是送分题。我出几道典型的,带你把过程走一遍。

典型题目一:某公司有一个网段192.168.1.0/24,需要划分成4个规模相同的子网,请写出新的子网掩码、每个子网的网络地址、广播地址和可用主机范围。

步骤一:确定需要借几位主机位。2的2次方等于4,所以要借2位子网位。原来的/24变成了/26。

步骤二:新的子网掩码是255.255.255.192,因为前24位不变,后面继续借2位,11111111.11111111.11111111.11000000,换成十进制就是192。

步骤三:这个/26一共有4个子网,每个子网有64个地址(2的6次方),主机位是6位,所以可用主机数是64减2,一共62个。

步骤四:四个子网分别如下:

子网网络地址广播地址可用主机范围掩码
1192.168.1.0/26192.168.1.63192.168.1.1 ~ 192.168.1.62255.255.255.192
2192.168.1.64/26192.168.1.127192.168.1.65 ~ 192.168.1.126255.255.255.192
3192.168.1.128/26192.168.1.191192.168.1.129 ~ 192.168.1.190255.255.255.192
4192.168.1.192/26192.168.1.255192.168.1.193 ~ 192.168.1.254255.255.255.192

很多候选人在考场上会卡住的地方是“可用主机范围写不对”。记住两点:网络地址是主机位全0,广播地址是主机位全1,可用主机就是中间那段。这个思路比背表好使,因为题目一变你也能应付。

再给一道进阶题:一个网址对应的IP是192.168.10.65/27,请问它所在的子网里有多少可用主机地址?/27说明主机位是5位,可用主机数2的5次方减2等于30。判断192.168.10.65所在子网时,先看子网掩码255.255.255.224,也就是最后一个字节是11100000,每32个IP一个子网,64到95是一个子网,所以192.168.10.65所在子网网络地址是192.168.10.64,广播地址是192.168.10.95,可用范围是65到94。这道题如果你能快速答出“30个,192.168.10.64到192.168.10.95是它的子网”,基本就没问题了。

考场上还有一个速算技巧:只要记住几个关键cidr值就行。/24有256个地址、/25有128个地址、/26有64个地址、/27有32个地址、/28有16个地址。多用几次就熟悉了。

3.3 网络命令的实战考察

技术面不只是在白纸上考试,有时候面试官会给一个线上问题场景,让你说用什么命令、看什么参数。这里挑几个最常碰到的。

ping用来检测本机到目标网络是否可达,基于ICMP协议,重点看的是“通不通”和“延迟多少”。面试官可能会追问TTL是什么,即数据包每经过一个路由器就减1,减到0就丢弃,用来防止数据包在网络上无限转发。telnet则是用来测试端口连通性的,常见的用法是telnet 某IP 端口,如果你看到“Unable to connect”说明端口不通。curl是后端开发最常用的命令之一,curl -I可以只看响应头,curl -v能看到完整交互过程。nslookup用来查DNS记录,比如nslookup www.example.com可以看域名解析到的IP。

这些命令本身不难,难的是面试官围绕命令展开的追问。比如“页面访问很慢,你会怎么排查”,这种题就是让你把命令组合起来用:先ping看网络通不通,再telnet看端口通不通,再用curl看响应时间和服务端返回的状态码,逐步缩小范围。能把排查思路说成一条清晰的链路,比背十个命令都管用。

4. 高频失分点与备战心得

4.1 这5个回答方式最容易被面试官质疑

第一,只念答案不给理由。比如问“TCP可靠吗”,回答“可靠,因为有确认重传机制”,这就太单薄了。应该继续说明确认重传怎么运作的:发送方发数据后启动超时定时器,接收方收到后返回ACK,超过时间没收到ACK就重传。面试官想听的是机制链条,不是标签。

第二,概念混着讲。比如把“TCP连接状态”和“HTTP连接状态”混在一起,或者把IP地址和MAC地址的作用搞混。一旦出现这种情况,面试官很容易对你整个基础水平产生怀疑。

第三,说不清“为什么”。很多候选人能说出三次握手是SYN、SYN+ACK、ACK,但问“为什么不能是两次”就卡住了。平时的复习必须追问自己——每个结论背后的原因是什么。

第四,忽略版本差异。面试官问HTTP时,如果你只回答HTTP/1.1的内容而不提HTTP/2或者HTTP/3,容易让人觉得你的知识停留在教科书年代。至少要知道HTTP/2多路复用、HTTP/3基于UDP等几个核心差异,哪怕只知道一两点也比完全不知道强。

第五,答不上来就沉默。这对技术面的伤害很大。你可以先说“这块我了解得不多,我的理解大概是……”,哪怕说错了,也能让面试官看到你的思维过程,比冷场强得多。

4.2 被追问到不会的地方,怎么稳住

技术面几乎没有不问倒人的。面试官往上深挖时,一般都会碰到候选人的知识边界,这是正常现象。关键在于边界的处理方式。

建议用“三层退让法”兜底。第一层:直接说出我目前会到什么程度。比如“我知道TCP的重传机制分超时重传和快速重传,但快速重传的具体触发条件我记得不太准确了”。第二层:给一个自己认为合理的推演过程。你可以补充“如果让我猜,应该是收到三个重复ACK就触发重传,因为这样可以避免等待超时,更快恢复”。这一层即使猜得不对,面试官也会看到你的逻辑能力。第三层:明确告诉面试官“这个问题我还没系统掌握,面试结束后希望再了解一下”。

这里要特别注意一个心态问题:不要一被追问就慌乱。我在实际面试中看到过不少候选人,前面答得很好,一到最后一段深挖有点卡住,马上声音就虚了,语速也飘了。这种落差反而比“没答上来”更吃亏。你越镇定,面试官越觉得这只是一个“目前没覆盖到的角落”,而不是“基础差”。

4.3 最后的复习优先级与时间规划建议

假设你离技术面还有一周时间,建议把复习安排按四段走。

前两天过基础:建议用一到两天把计算机网络的分层结构、各层核心协议过一遍,重点是TCP、UDP、HTTP、DNS、IP地址这些核心概念。不要急着背题,先保证能用自己的话解释清楚。

第三到第四天练表达:找一道题,比如“输入URL后发生了什么”,对着镜子或者录音讲一遍,逼自己在三分钟之内讲完并且不卡壳。这一步至关重要。很多人知识都懂,一开口就乱,就是因为没练过口语化的表达。

第五到第六天做模拟:可以找同样在准备面试的人互问,或者搜索一些计算机网络面试题集,每个问题先自己回答一次,再对照答案看缺了什么。这个阶段不用贪多,每天十道题就够,关键是把回答打磨得完整。

最后一天查漏:把常见的高频考点列表拿出来逐个过,遇到不熟练的直接回到基础部分重新看,不要硬背。同时准备好自己的“知识边界说明”:哪些方向你比较熟,哪些还在补课,心里有数即可。

我个人在帮别人模拟面试时发现,很多人会在“TCP/IP协议簇放在哪一层”这种小地方突然卡住,比如ARP到底属于网络层还是链路层。这类边界问题容易被忽视,建议最后一天集中把类似的小概念校对一遍,花不了多少时间,却能避免面试现场出现尴尬的冷场。

最后一天晚上就不要再熬夜刷题了,早点睡。技术面考察的是长期积累的底子,不是你最后一晚能突击出来的东西。把状态调整好,比多记一个冷门知识点更值钱。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进