第4章 计算机网络高频问题
C++微服务面试中,计算机网络是必考模块,高频题目覆盖TCP三次握手、HTTP/2.0特性、RPC与HTTP对比三大主题。面试官期待你不仅能复述协议细节,还能从对比维度和实际网络编程经验出发,展示对底层性能的理解。本章结构化回答框架:协议细节 → 工作原理 → 关键机制 → 对比其他协议 → 结合性能实践。
公司侧重点:字节跳动、阿里、腾讯等大厂格外关注候选人对epoll、Reactor模型、序列化效率、连接管理的掌握,经常从“为什么这样设计”和“如何优化”入手追问。
🔹 面试问答卡片 #1:TCP三次握手
面试问题:请详细说明TCP三次握手的流程,以及为什么需要三次而非两次?
面试官考察点:TCP协议状态机理解、可靠性设计思想、经典场景(如SYN Flood)的应对能力。
回答框架:
- 流程描述:SYN → SYN-ACK → ACK,附带序列号/确认号、状态变更(CLOSED→SYN_SENT→SYN_RCVD→ESTABLISHED)。
- 解释为何不是两次:防止已失效的SYN请求占服务器资源(举例:客户端重传后旧包到达)。
- 延伸对比:四次挥手(FIN序列)、半关闭状态。
简短示例回答(60-100字):
第一次客户端发送SYN(seq=x);服务器回复SYN+ACK(seq=y, ack=x+1);第三次客户端发送ACK(seq=x+1, ack=y+1)。三次握手确保双方收发能力正常。若只需两次,客户端已超时的SYN包可能让服务器白白建立连接,浪费资源。
可能追问:
- 第三次握手能否携带数据?
- SYN Flood攻击原理及防范(SYN Cookie)?
- 为什么挥手需四次且必须等待2MSL?
- TCP半连接队列与全连接队列区别?
⚠ 避坑提醒:切忌只背流程不问原因;主动引出“防止已失效连接”案例;提及状态机时务必准确(如SYN_RCVD而非SYN_RECEIVED)。
🔹 面试问答卡片 #2:HTTP/2.0 核心特性
面试问题:HTTP/2.0相比HTTP/1.1有哪些核心改进?如何提升性能?
面试官考察点:对HTTP协议演进的理解、多路复用原理、头部压缩机制、以及实际业务中的优化收益。
回答框架:
- 协议细节:二进制分帧(帧+流),多路复用解决队头阻塞(HOL)。
- 关键机制:HPACK头部压缩、服务端推送、流优先级。
- 对比HTTP/1.1:1.1的多连接并发 vs 2.0的单连接多流;1.1的文本头部 vs 2.0的压缩头部。
- 不足之处:TCP层的队头阻塞依然存在(丢包影响所有流)。
简短示例回答(60-100字):
HTTP/2.0采用二进制分帧和多路复用,多个请求共享同一TCP连接并发传输,消除HTTP/1.1的线头阻塞;HPACK压缩头部减少开销;支持服务端推送。相比1.1页面加载提速40%以上,但底层TCP丢包仍会阻塞所有流,于是催生了HTTP/3(QUIC)。
可能追问:
- HTTP/2.0的流优先级如何调度?
- QUIC相比HTTP/2.0解决了哪些问题?
- 实际生产环境中如何开启h2c(明文)或h2(TLS)?
- 多路复用与HTTP/1.1的keep-alive有何区别?
⚠ 避坑提醒:不要只说“更快”,必须点出具体技术细节;主动指出TCP级队头阻塞是HTTP/2的短板,体现深度理解。
🔹 面试问答卡片 #3:RPC vs HTTP REST
面试问题:在微服务架构中,RPC(如gRPC)与HTTP REST相比有哪些优劣势?你如何在C++项目中选择?
面试官考察点:对序列化(Protobuf/Thrift)、传输协议(TCP/HTTP2)、服务发现的理解,以及实际架构决策能力。
回答框架:
- RPC核心要素:IDL定义接口、二进制序列化(Protobuf/Thrift)、长连接复用。
- 对比维度:性能(带宽/延迟)、通用性、调试便捷性、生态成熟度。
- 典型场景:内部服务调用选gRPC(基于HTTP/2,支持双向流、低延迟);对外API通常选REST(便于跨语言/浏览器)。
简短示例回答(60-100字):
gRPC基于HTTP/2,使用Protobuf序列化,比JSON的REST节省30-50%带宽,且支持多路复用和双向流。但REST在异构系统、前端场景更通用。在C++微服务内部,我会优先用gRPC;对外暴露RESTful API并通过适配层转换。
可能追问:
- gRPC与Thrift的序列化效率与生态对比?
- 如何实现RPC客户端负载均衡(如一致性哈希)?
- RPC如何实现超时、重试与熔断?
- 为什么gRPC推荐使用HTTP/2而非原始TCP?
⚠ 避坑提醒:别只说“RPC快”,要量化并说明原因;且注意HTTP/2本身就是RPC常用载体;回答时最好结合C++实际项目经验。
📊 高频知识点对比表
| 维度 | TCP三次握手 | HTTP/2.0 | RPC(gRPC) |
|---|---|---|---|
| 协议层次 | 传输层 | 应用层 | 应用层(基于传输层) |
| 核心机制 | 状态机/序号/窗口 | 多路复用/HPACK | IDL/Protobuf/流式 |
| 面试侧重点 | 为什么三次?状态细节 | 对比1.1,HOL问题 | 与REST对比,选型理由 |
| 公司关注点 | 网络编程基础/内核细节 | 代理/CDN/性能优化 | 序列化/连接复用/服务治理 |
💡 复习提示:建议熟练背诵各协议的状态机(CLOSED→LISTEN→SYN_SENT…)、HTTP/2帧结构、Protobuf编码特点。面试时主动加入“如果我来设计/优化会怎么做”的思考,分数陡升。