跳转到内容

腾讯云面试题整理

💡

面试概况:本次腾讯云面试共两轮。第一轮为技术面,涵盖计算机网络(13题)、操作系统(4题)、数据库(2题)、项目经验(6题)和编程题(1题);第二轮为技术+综合面,在计算机网络和操作系统基础上,增加了职业规划与综合能力考察(15题)。以下按类别整理所有面试题及参考答案。


一、计算机网络

📌

网络部分是面试重点,两轮面试均有大量网络相关问题,涉及网络模型、TCP协议、路由转发、应用架构等方面。第一轮侧重深度原理,第二轮侧重基础和实践排查。

1.1 网络访问全链路 & 基础协议(第一轮)

Q1: 从对网页(如HTTPS www.qq.com)发起访问的整个全链路网络模型过程

📝

参考要点:

  1. DNS解析:浏览器缓存 → OS缓存 → 本地DNS服务器 → 根DNS → 顶级域DNS → 权威DNS,获取www.qq.com的IP地址
  2. TCP三次握手:客户端SYN → 服务器SYN+ACK → 客户端ACK,建立连接
  3. TLS/SSL握手:ClientHello → ServerHello+证书 → 密钥交换 → 加密通信建立
  4. HTTP请求:构造HTTP GET请求,包含请求头(Cookie、User-Agent等)
  5. 网络层路由:数据包经过多跳路由器转发,通过路由表逐跳到达目标服务器
  6. 服务器处理:负载均衡 → Nginx反向代理 → 后端服务处理 → 返回HTTP响应
  7. 浏览器渲染:解析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地址是怎么确定的?

参考要点:

  1. 主机检查目标IP是否在同一子网内(通过子网掩码判断)
  2. 同一子网:目标IP的MAC地址就是下一跳MAC,通过ARP获取
  3. 不同子网:下一跳是默认网关的MAC地址,同样通过ARP获取网关MAC
  4. 每一跳路由器重复此过程:查路由表确定下一跳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,这个转发的过程是怎样的?

📝

参考要点:

  1. 每台路由器维护路由表,包含目标网络、下一跳地址、出接口
  2. 路由器收到数据包,提取目标IP,在路由表中查找最长前缀匹配
  3. 若没有直连路由,匹配默认路由(0.0.0.0/0)发往上游ISP路由器
  4. 经过多跳AS自治系统间路由(BGP协议),逐跳转发,最终到达目标服务器的网关
  5. 每一跳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发现连接不上对方了,应该怎么排查?

📝

参考要点:

  1. ping:检查网络层是否可达(注意:ICMP被封不影响TCP)
  2. telnet/nc:检查目标端口是否可达(telnet IP PORT 或 nc -zv IP PORT)
  3. traceroute:定位中间哪个节点断了
  4. 检查防火墙:iptables/安全组规则是否放行端口
  5. 检查服务状态:目标服务是否启动、是否监听正确端口(netstat -tlnp / ss -tlnp)
  6. 抓包分析:tcpdump/wireshark查看TCP握手情况,是SYN无响应、被RST还是超时
  7. 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)实现。面试整体从基础理论→工程实践→综合能力逐层递进。