腾讯云面试题整理
面试概况:本次腾讯云面试共两轮。第一轮为技术面,涵盖计算机网络(13题)、操作系统(4题)、数据库(2题)、项目经验(6题)和编程题(1题);第二轮为技术+综合面,在计算机网络和操作系统基础上,增加了职业规划与综合能力考察(15题)。以下按类别整理所有面试题及参考答案。
一、计算机网络
网络部分是面试重点,两轮面试均有大量网络相关问题,涉及网络模型、TCP协议、路由转发、应用架构等方面。第一轮侧重深度原理,第二轮侧重基础和实践排查。
1.1 网络访问全链路 & 基础协议(第一轮)
Q1: 从对网页(如HTTPS www.qq.com)发起访问的整个全链路网络模型过程
参考要点:
- DNS解析:浏览器缓存 → OS缓存 → 本地DNS服务器 → 根DNS → 顶级域DNS → 权威DNS,获取www.qq.com的IP地址
- TCP三次握手:客户端SYN → 服务器SYN+ACK → 客户端ACK,建立连接
- TLS/SSL握手:ClientHello → ServerHello+证书 → 密钥交换 → 加密通信建立
- HTTP请求:构造HTTP GET请求,包含请求头(Cookie、User-Agent等)
- 网络层路由:数据包经过多跳路由器转发,通过路由表逐跳到达目标服务器
- 服务器处理:负载均衡 → Nginx反向代理 → 后端服务处理 → 返回HTTP响应
- 浏览器渲染:解析HTML → 构建DOM树 → CSSOM树 → 渲染树 → 布局 → 绘制
五层模型:应用层(HTTP/HTTPS) → 传输层(TCP) → 网络层(IP) → 数据链路层(MAC) → 物理层
Q2: DNS解析后,IP到MAC的映射中,IP怎么拿到下一跳的MAC地址?
回答:判断目的IP是否同一个网段,如果不是同一个网段直接发给网关;如果是同一个网段,查询ARP缓存列表;如果不在列表里,进行ARP广播操作,查询所有主机。
补充:ARP协议(Address Resolution Protocol)通过广播ARP请求包("谁的IP是X.X.X.X?请告诉我你的MAC地址"),目标主机收到后单播回复ARP响应,包含其MAC地址。获取后会缓存到ARP表中。
Q3: 下一跳的MAC地址是怎么确定的?
参考要点:
- 主机检查目标IP是否在同一子网内(通过子网掩码判断)
- 同一子网:目标IP的MAC地址就是下一跳MAC,通过ARP获取
- 不同子网:下一跳是默认网关的MAC地址,同样通过ARP获取网关MAC
- 每一跳路由器重复此过程:查路由表确定下一跳IP → ARP获取下一跳MAC → 转发
Q4: 以访问腾讯QQ.com为例,本地是192.168的C类网段,要访问43开头的公网IP,怎么知道要把包发到网关?
回答:通过子网掩码与目标IP做按位与运算,发现不在同一网段,则将包发往默认网关。
具体过程:源IP 192.168.x.x 与子网掩码255.255.255.0做与运算 → 得到网络号192.168.x.0;目标43.x.x.x与同一掩码做与运算 → 网络号不同 → 判定为跨网段 → 发往默认网关。
Q5: 怎么知道网关地址是什么?
回答:DHCP获取到的;如果是DHCP分配的那么肯定可以找到网关地址;如果是手动分配,也是需要手动配置知道的。
Q6: 路由器没有办法直达目标43开头的公网IP,这个转发的过程是怎样的?
参考要点:
- 每台路由器维护路由表,包含目标网络、下一跳地址、出接口
- 路由器收到数据包,提取目标IP,在路由表中查找最长前缀匹配
- 若没有直连路由,匹配默认路由(0.0.0.0/0)发往上游ISP路由器
- 经过多跳AS自治系统间路由(BGP协议),逐跳转发,最终到达目标服务器的网关
- 每一跳TTL减1,TTL=0时丢弃并返回ICMP超时
1.2 应用架构与安全(第一轮)
Q7: 做QQ.com这类应用,不会将裸机+公网IP直接暴露在公网,有哪些好的设计方案?
回答:
- Nginx做反向代理
- CDN存储静态资源
- 内部服务全部使用私有IP地址
- 对外只提供一个公网IP地址
- 通过域名,所有流量先打到高防节点,用来防DDoS
补充架构设计:
- 接入层:DNS智能解析 + CDN边缘节点 + 高防IP/DDoS清洗
- 网关层:Nginx/OpenResty反向代理 + API网关 + WAF
- 服务层:微服务架构,内网通信,K8s/容器化部署
- 数据层:主从读写分离 + Redis缓存 + 消息队列削峰
Q8: 如何预防DDoS攻击?
参考要点:
- 高防IP/高防节点:流量先经过清洗中心,过滤恶意流量
- CDN分散流量:利用CDN节点分散攻击流量
- SYN Cookie/SYN Proxy:防御SYN Flood攻击
- 速率限制(Rate Limiting):限制单IP请求频率
- WAF:应用层DDoS防护(CC攻击)
- Anycast:将攻击流量分散到多个节点
- 黑洞路由:极端情况下将目标IP流量全部丢弃
Q9: QQ.com这类高访问量的首页,访问量巨大,若部署多台服务器会消耗大量资源,且后端内容更新会带来较大压力,有什么解决办法?
回答:
- 一些数据可以缓存在Redis里面,这样不用每次查询数据库
- 首页本质上是很多静态文件,可以放在CDN中,缓解中心节点的带宽压力
补充优化方案:
- 多级缓存:CDN边缘缓存 → Nginx本地缓存 → Redis分布式缓存 → 数据库
- 静态化+SSI:页面静态化,动态内容通过SSI/ESI嵌入或AJAX异步加载
- 推送式更新:内容更新后主动推送到CDN节点预热,而非被动回源
- 分片发布:灰度发布,逐步更新服务器,避免全量重启
1.3 TCP协议深入(第一轮)
Q10: 讲一下TCP滑动窗口这块的技术
参考要点:
- 核心概念:滑动窗口是TCP实现流量控制和可靠传输的机制,发送方和接收方各维护一个窗口
- 发送窗口:由接收方通告的窗口大小(rwnd)和拥塞窗口(cwnd)共同决定,取两者最小值
- 窗口滑动:收到ACK后窗口右移,发送新的数据段
- 累计确认:接收方确认连续的字节流,不确认单个包
- 窗口字段:TCP头部16位窗口字段,最大值65535字节;窗口缩放选项可扩展到1GB
Q11: 既然TCP三次握手能协定发送端和接收端的性能基准,为何不将多个数据包合并成一个大包发送以提高效率,反而要引入滑动窗口?
参考要点:
- MTU限制:以太网MTU通常1500字节,超过需要分片,分片丢失导致整包重传
- 流水线传输:滑动窗口允许多个包同时在网络中传输(pipelining),提高链路利用率
- 流量控制:接收方处理能力动态变化,滑动窗口能实时适应
- 拥塞控制:大包更容易造成网络拥塞,滑动窗口配合拥塞算法动态调整发送速率
- 首部开销:合并大包并不能减少太多开销,合理大小的包对整体效率更有利
Q12: 讲一下TCP的流量控制技术
参考要点:
- 基于滑动窗口:接收方在ACK中告知剩余缓冲区大小(rwnd, receive window)
- rwnd=0:接收方缓冲区满,发送方暂停发送;定期发送窗口探测包(Zero Window Probe)
- 糊涂窗口综合征(Silly Window Syndrome):接收方通告极小窗口,发送方发小包 → 双方各自的解决方案(Nagle算法 vs Clark方案)
- 与拥塞控制的区别:流量控制是端到端的,防止发送方压垮接收方;拥塞控制针对网络路径
Q13: 除了超时重传,TCP还有哪些重传机制?
回答涉及:快速重传
参考要点:
- 超时重传(RTO):最基本的重传机制,定时器超时未收到ACK则重传
- 快速重传(Fast Retransmit):发送方收到3个重复ACK(Dup ACK),不等超时立即重传
- 选择性确认(SACK):接收方告知发送方哪些段已收到,发送方只重传真正丢失的段(而非整个窗口)
- D-SACK(Duplicate SACK):告知发送方哪些段被重复接收,帮助区分丢包和乱序
1.4 网络基础与排查(第二轮)
Q1: 局域网内如何连接两台计算机?ping命令底层原理是什么?ICMP协议是什么?什么协议会用到ICMP?ARP协议是什么?
参考要点:
- 局域网连接:通过交换机/路由器连接,同一网段可直接通信;需要配置IP地址和子网掩码
- ping底层原理:发送ICMP Echo Request(type=8) → 目标回复ICMP Echo Reply(type=0),计算RTT
- ICMP协议:Internet Control Message Protocol,网络层协议,用于传递错误报告和诊断信息(不可达、超时、重定向等)
- 使用ICMP的协议/场景:ping、traceroute/tracert(利用TTL超时返回ICMP Time Exceeded)、PMTUD(Path MTU Discovery)
- ARP协议:Address Resolution Protocol,通过IP地址获取MAC地址,工作在网络层和数据链路层之间
Q2: 讲一讲TCP/IP五层架构分别是啥,每一层的协议和作用
参考要点:
|
层级 |
常见协议 |
作用 |
|---|---|---|
|
应用层 |
HTTP/HTTPS, DNS, FTP, SMTP, WebSocket |
为应用程序提供网络服务接口 |
|
传输层 |
TCP, UDP |
端到端数据传输、流量控制、差错控制 |
|
网络层 |
IP, ICMP, ARP, OSPF, BGP |
逻辑寻址、路由选路、分片与重组 |
|
数据链路层 |
Ethernet, MAC, VLAN, PPP |
相邻节点间帧传输、介质访问控制 |
|
物理层 |
RJ45, 光纤, 无线电波 |
比特流的物理传输介质和信号规范 |
Q3: TCP滑动窗口是干啥的?发送方和接收方的滑动窗口分别由什么决定?
参考要点:
- 发送方窗口:min(接收方通告窗口rwnd, 拥塞窗口cwnd)。rwnd来自ACK中的窗口字段,cwnd由拥塞控制算法(TCP Cubic/BBR)动态调整
- 接收方窗口:取决于可用缓冲区大小(应用读取速度),即rwnd = 缓冲区总大小 - 已接收未读取的数据量
- 作用:实现流水线传输提高吞吐量、流量控制、可靠传输(累计确认+选择性重传)
Q4: 一方TCP发现连接不上对方了,应该怎么排查?
参考要点:
- ping:检查网络层是否可达(注意:ICMP被封不影响TCP)
- telnet/nc:检查目标端口是否可达(telnet IP PORT 或 nc -zv IP PORT)
- traceroute:定位中间哪个节点断了
- 检查防火墙:iptables/安全组规则是否放行端口
- 检查服务状态:目标服务是否启动、是否监听正确端口(netstat -tlnp / ss -tlnp)
- 抓包分析:tcpdump/wireshark查看TCP握手情况,是SYN无响应、被RST还是超时
- DNS检查:nslookup/dig确认域名解析正确
Q5: 断开的TCP,客户端会如何重新发起连接?
参考要点:客户端检测到连接断开(RST/超时/KeepAlive探测失败)后,关闭旧socket,重新执行三次握手建立新连接。一般由应用层实现重连策略:指数退避重试、固定间隔重试。TCP KeepAlive可用来探测连接是否存活。
Q6: MTU、MSS、RTT字段是什么含义?
参考要点:
- MTU(Maximum Transmission Unit):链路层最大传输单元,以太网默认1500字节。超过需IP分片
- MSS(Maximum Segment Size):TCP最大报文段大小,= MTU - IP首部(20) - TCP首部(20),通常1460字节。在三次握手中通过MSS选项协商
- RTT(Round-Trip Time):往返时延,数据从发送到收到ACK的时间。用于计算RTO(重传超时),通过指数加权移动平均(EWMA)平滑计算
二、操作系统
2.1 内存管理(第一轮)
Q1: 讲一下虚拟内存这块的相关知识
参考要点:
- 核心概念:每个进程拥有独立的虚拟地址空间,通过MMU(内存管理单元)将虚拟地址转换为物理地址
- 分页机制:虚拟内存和物理内存划分为固定大小的页(page),通过页表(Page Table)映射
- 页表结构:多级页表减少内存开销(如Linux的PGD→PUD→PMD→PTE四级页表)
- TLB:Translation Lookaside Buffer,页表缓存,加速地址转换
- 缺页异常(Page Fault):访问的页不在物理内存中,触发缺页中断,从磁盘换入
- 交换空间(Swap):物理内存不足时,暂时不用的页换出到磁盘
- 写时复制(Copy-on-Write):fork时父子进程共享内存页,仅在写入时复制
Q2: 32位操作系统最大地址空间是4G,若仅插了1G内存条,且系统本身还要占用一部分,为何进程的最大寻址空间还是4G?
参考要点:
- 虚拟地址 vs 物理地址:进程看见的是虚拟地址空间(32位=4GB),不是物理内存
- 按需调页(Demand Paging):不是一次性把4GB都映射到物理内存,而是用到哪页才加载哪页
- 交换技术:物理内存不够时,不活跃的页换出到磁盘(Swap),腾出空间给活跃页
- 实际分配:进程能malloc 4GB,但实际能用的受限于:物理内存+Swap大小 - 内核占用
- 内核空间:32位Linux通常1GB内核空间+3GB用户空间,进程实际用户态最多3GB
2.2 进程与线程(第一轮)
Q3: 讲一下进程和线程的区别,以及同一进程内不同线程共享的资源有哪些?
回答中列举的共享资源:
- 堆内存(Heap)
- 代码段(程序执行的指令)
- 数据段(全局变量、静态变量)
- 打开的文件描述符fd
- 进程ID、父进程ID
- 信号处理方式
- 当前工作目录
- 用户ID/组ID
- 内存映射区
- 环境变量
补充:线程独享的资源
- 栈空间(每个线程独立的栈)
- 寄存器(PC、SP等)
- 线程ID
- 线程局部存储(TLS)
进程 vs 线程核心区别:进程是资源分配的基本单位,线程是CPU调度的基本单位;进程间地址空间隔离,线程共享地址空间;进程切换开销大(页表切换、TLB刷新),线程切换开销小。
Q4: 线程之间/进程之间的同步通信技术有哪些?
参考要点:
|
线程间 |
进程间(IPC) |
|
|---|---|---|
|
同步 |
互斥锁(mutex)、自旋锁(spinlock)、读写锁(rwlock)、条件变量(condition variable)、信号量(semaphore)、屏障(barrier) |
信号量、文件锁(flock/fcntl)、记录锁 |
|
通信 |
共享全局变量、无锁队列(lock-free queue) |
管道(pipe/FIFO)、消息队列、共享内存(最高效)、Socket(本地/网络)、信号(Signal)、内存映射文件(mmap) |
2.3 操作系统基础(第二轮)
Q1: 线程和进程的区别是啥?进程之间隔离的是什么?线程之间共享的是什么?多进程存在什么问题?栈空间和堆空间存储的是什么?什么情况会爆栈?什么情况会堆溢出?
参考要点:
- 进程间隔离:独立地址空间,无法直接访问对方内存(隔离性最强)
- 线程间共享:堆、代码段、数据段、fd、信号处理等(同上Q3)
- 多进程问题:创建/切换/销毁开销大;IPC通信复杂;占用更多内存资源
- 栈(stack):存储函数调用帧(局部变量、返回地址、参数)。爆栈:递归过深、局部大数组、无限递归
- 堆(heap):存储动态分配的内存(malloc/new)。堆溢出:内存泄漏耗尽、分配过量不释放
Q2: 虚拟内存是干啥的?如果某个进程没有在页表中读取到地址怎么办?为什么要分用户态和内核态?什么时候会从用户态到内核态?
参考要点:
- 虚拟内存作用:隔离各进程、扩展可用内存(通过Swap)、简化内存管理、支持内存保护
- 缺页处理:触发缺页异常→内核检查地址是否合法→合法则分配物理页并从磁盘加载/零页填充→更新页表→返回重试指令;非法则发送SIGSEGV段错误
- 用户态/内核态原因:保护系统安全,防止用户程序直接访问硬件和关键系统资源
- 切换时机:系统调用(syscall)、中断(interrupt)、异常(exception)。如read/write/fork/mmap等系统调用时从用户态陷入内核态
Q3: Linux的fork进程的原理是什么?Linux中有线程吗?
参考要点:
- fork原理:调用fork()→内核复制父进程的task_struct、页表、文件描述符表等→子进程返回0,父进程返回子进程PID。采用写时复制(COW)优化,父子共享物理页,仅在写入时复制
- Linux线程:Linux使用clone()系统调用创建线程,通过不同标志(CLONE_VM共享地址空间, CLONE_FILES共享fd等)控制资源共享程度。Linux内核中线程和进程都用task_struct表示,本质相同(NPTL线程模型,1:1映射)
Q4: Linux中如何看一个TCP连接?如何排查内存和CPU利用情况?如何查看网卡传输速度?如何在Linux上抓包?
参考要点:
|
场景 |
常用命令 |
|---|---|
|
查看TCP连接 |
ss -tlnp(监听), ss -tanp(所有), netstat -tlnp |
|
查看内存 |
free -h, top/htop, cat /proc/meminfo, vmstat |
|
查看CPU |
top/htop, mpstat, pidstat, cat /proc/stat |
|
查看网卡速度 |
ethtool eth0, sar -n DEV, iftop, nload, cat /proc/net/dev |
|
抓包 |
tcpdump -i eth0 port 80 -w output.pcap, tshark, wireshark(图形化) |
三、数据库
3.1 MySQL锁机制(第一轮)
Q1: 简单讲一下MySQL的锁机制
参考要点:
- 按粒度:全局锁(FLUSH TABLES WITH READ LOCK)、表级锁(Table Lock/元数据锁MDL)、页级锁(BDB引擎)、行级锁(InnoDB)
- 按模式:共享锁(S锁/读锁)、排他锁(X锁/写锁)、意向锁(IS/IX,表级)
- InnoDB行锁:Record Lock(记录锁)、Gap Lock(间隙锁)、Next-Key Lock(临键锁=Record+Gap)
- 加锁方式:SELECT ... FOR UPDATE(X锁), SELECT ... LOCK IN SHARE MODE(S锁,8.0改为FOR SHARE)
- 死锁检测:InnoDB自动检测,回滚较小事务
Q2: 在什么情况下会触发MySQL的表/索引的间隙锁、行锁之类的锁?
参考要点:
- 行锁(Record Lock):对索引记录加锁。WHERE条件使用唯一索引精确匹配且记录存在时(如WHERE id=5 FOR UPDATE)
- 间隙锁(Gap Lock):锁定索引记录之间的间隙,防止其他事务在间隙中插入。触发条件:唯一索引范围查询(WHERE id BETWEEN 5 AND 10)、非唯一索引等值查询、RR隔离级别下
- 临键锁(Next-Key Lock):行锁+间隙锁的组合,InnoDB RR级别的默认行锁算法。防止幻读
- 表锁:DDL操作(ALTER TABLE)、LOCK TABLES显式加锁、MyISAM引擎的读写操作
四、项目相关
4.1 小米AI排障项目(第一轮)
Q1: 你做了蛮多项目,觉得哪个项目是你最想讲的、最有挑战难度的?
(候选人的回答指向小米AI排障项目)
Q2: 先说明小米这个项目是什么,实现的效果是怎样的
项目背景(基于后续问题推断):小米实习期间做的AI排障相关工作,使用大模型构建智能排障Agent系统,帮助一线/研发同学进行故障诊断和问题排查。
Q3: 你认为达成该项目80%左右准确率的最关键一点是什么?
(未记录详细回答)
Q4: 若想进一步提升这个80%的准确率,你觉得应该怎么做?
(未记录详细回答)
Q5: 除了微调模型,如何将当前模型无法解决的10%-15%的问题进行优化,实现这部分准确率的提升?
(未记录详细回答)
可能的思路:
- 优化RAG检索质量(知识库结构化、query改写、HyDE等)
- 引入多路召回+重排序
- 添加规则兜底策略
- 工具链优化(更精准的排障工具调用)
- 人工反馈闭环(RLHF/DPO)
Q6: 如何让一线同学/研发同学将解决后的问题信息有效录入到知识库,而非问题解决完就结束,不再做信息沉淀?
参考要点:
- 流程嵌入:将知识录入作为工单关闭的必要步骤,不录入无法结单
- 降低录入成本:AI自动生成排查过程摘要,人工只需确认/修改
- 激励设计:将知识贡献纳入绩效考核、设立积分奖励、每月表彰
- 即时反馈:录入的知识被后续工单引用/解决了问题后,通知贡献者
- 模板化录入:提供结构化模板(故障现象→根因→解决方案→验证方法),降低写作门槛
4.2 AI排障深入(第二轮)
Q2: 介绍一下你在小米实习期间做的那个AI排障相关工作
(未记录详细回答,与第一轮项目问题关联)
Q3: 对于AI排障Agent而言,最难的是什么?针对一个具体的问题,怎么让AI能够知道正确的排查步骤?
参考要点:
- 最难:将人类排障经验知识化、结构化,让AI能理解故障排查的因果链路;问题泛化
- 正确排查步骤:知识库存储排障SOP/排查树(决策树)→根据故障现象匹配→工具调用(日志查询、监控查询)→根据返回结果决策下一步→循环直至定位根因
Q4: 那怎么做好这个泛化?
(未记录详细回答)
可能的思路:问题模板化(具体错误→抽象类别)、多层次知识库(通用知识→业务特化知识)、相似案例检索、Agent反思/自我修正。
Q5: 如果要让AI做推理的话,知识库是什么样的输入方式?碰到一些没遇到过的问题,怎么去做知识输入,让AI知道第一步排查什么,第二步调用什么工具,第三步调用什么工具?
参考要点:
- 知识库结构:排障SOP文档、排查决策树、历史工单及解决方案、工具API描述
- 新问题处理:Few-shot提示(类似案例)、思维链推理(CoT,分解步骤)、ReAct模式(推理+行动交替)、人工反馈补充知识
- 知识输入方式:结构化存储排障步骤(现象→Step1:检查X→工具A→Step2:根据X结果检查Y→工具B...)
Q6: (这个AI排障系统)效果怎么样?
(未记录详细回答,第一轮提到约80%准确率)
Q7: 那是你一个人开发的吗?
(未记录详细回答)
Q8: 除了这块之外,大模型用的是哪个大模型?
(未记录详细回答)
Q9: 所以你没有测过其他大模型哪个效果更好一点?
(未记录详细回答)
五、代码编程
Q1: 实现一个LRU缓存(要求实现O(1)的时间复杂度)
参考要点:LRU(Least Recently Used)缓存,使用哈希表 + 双向链表实现O(1)的get和put操作。
核心思路:
- 哈希表(Dictionary/HashMap) → O(1)查找
- 双向链表 → O(1)插入和删除
- get(key):查哈希表,存在则移到链表头部(标记为最近使用),返回值
- put(key, value):存在则更新值并移到头部;不存在则插入头部,超过容量则删除链表尾部(最久未使用)
- 链表用假头假尾(dummy head/tail)简化边界操作
示例代码(Java):
六、职业规划与综合面试(第二轮)
Q1: 你自己的职业规划是希望怎么去演进?
(未记录回答)
Q10: 技术栈上我看你主要是做Java开发对吧?
(未记录回答)
Q11: 你对Go语言有了解吗?
(未记录回答)
Q12: K8s、函数计算这些你有使用过吗?
(未记录回答)
Q13: 我比较好奇,你实习了挺多岗位的,为什么没有去选择一些有留用机会的岗位去实习?
(未记录回答)
Q14: 你几月份毕业?
(未记录回答)
Q15: 那看看中心这边还有什么问题没有?
(未记录回答,通常为反问环节)
总结:腾讯云面试技术深度较强,计算机网络是绝对重点(两轮共19题),涵盖TCP协议细节、网络架构设计、安全防护等;操作系统侧重内存管理和进程线程模型;数据库聚焦InnoDB锁机制;项目考察围绕AI排障Agent的实际落地;编程题考察了经典LRU缓存的O(1)实现。面试整体从基础理论→工程实践→综合能力逐层递进。