第4章 计算机网络高频问题

C++微服务面试中,计算机网络是必考模块,高频题目覆盖TCP三次握手、HTTP/2.0特性、RPC与HTTP对比三大主题。面试官期待你不仅能复述协议细节,还能从对比维度和实际网络编程经验出发,展示对底层性能的理解。本章结构化回答框架:协议细节 → 工作原理 → 关键机制 → 对比其他协议 → 结合性能实践。

公司侧重点:字节跳动、阿里、腾讯等大厂格外关注候选人对epoll、Reactor模型、序列化效率、连接管理的掌握,经常从“为什么这样设计”和“如何优化”入手追问。
协议细节 状态/报文/标志位 工作原理 流程/生命周期 关键机制 滑动窗口/多路复用 对比维度 HTTP/1.1 vs 2.0 vs RPC 结合性能实践 epoll/连接池/序列化 回答时按此路径组织内容,每个节点控制在2-3句话

🔹 面试问答卡片 #1:TCP三次握手

面试问题:请详细说明TCP三次握手的流程,以及为什么需要三次而非两次?

面试官考察点:TCP协议状态机理解、可靠性设计思想、经典场景(如SYN Flood)的应对能力。

回答框架:

  1. 流程描述:SYN → SYN-ACK → ACK,附带序列号/确认号、状态变更(CLOSED→SYN_SENT→SYN_RCVD→ESTABLISHED)。
  2. 解释为何不是两次:防止已失效的SYN请求占服务器资源(举例:客户端重传后旧包到达)。
  3. 延伸对比:四次挥手(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编码特点。面试时主动加入“如果我来设计/优化会怎么做”的思考,分数陡升。