荣耀 通软 一面(10.12)
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 介绍一下自己做过的项目(实习项目、简历上的 Web Server 和手写 TCP 项目)
- 场景题:针对某个特定场景,如果让你自己去设计一个 TCP,你会如何去设计?
《参考解析》
「设计一个 TCP」这类题怎么答:没有思路时最不该说的就是「不知道」。这类题的正确打开方式是「先反问场景,再按需求取舍」——问清楚约束:是内网还是公网、丢包率与带宽如何、对延迟还是吞吐更敏感、连接数规模、是否需要可靠性与顺序性。拿到约束后,把 TCP 提供的机制逐条拆开,说明在这个场景下要不要保留:可靠传输(序列号 + ACK + 超时重传 + 快速重传 + SACK)——如果场景容忍丢帧(实时音视频)就可以弱化;有序性(滑动窗口与接收缓冲)——多路复用场景可能允许乱序交付;流量控制(接收窗口)与拥塞控制(慢启动、拥塞避免、快重传快恢复 / CUBIC / BBR)——内网低丢包可以简化拥塞控制甚至关闭;连接管理(三次握手四次挥手)——短连接高频场景或许用无连接或 QUIC 式 0-RTT 更合适;以及校验和、MSS 与分片、Nagle 与延迟确认的取舍。这样答出来,哪怕没有唯一标准答案,面试官也能看到你有完整的协议知识框架和工程判断。
为什么这类题会挂人:面试官不是要一个「新协议」,而是看你在陌生问题面前有没有结构化的思考路径。作者复盘时说「这是唯一的追问,提醒了几次仍然不知道」,这正是失分点——提醒之后仍然没有尝试拆解,说明没有可迁移的方法论。可复用的模板是:澄清约束 → 列出可选项 → 说明取舍依据 → 给出一个方案并讲它的代价 → 补充如何验证(压测指标、丢包实验)。
项目介绍怎么讲:面试官让介绍「Web Server 和手写 TCP 项目」时,不要平铺直叙功能,而是按「为什么做 → 核心难点 → 怎么解决 → 结果」讲。手写 TCP 的难点在于状态机与重传:连接状态迁移、序列号与确认号管理、超时重传与快速重传、滑动窗口与流量控制、以及为什么实际项目里会用成熟的协议栈。Web Server 的难点在并发模型(多线程 / epoll 事件循环 / 协程)、HTTP 解析与连接复用(keep-alive)、以及简单的压测结果(QPS、并发连接数、延迟)。带上量化的压测数据,可信度会完全不同。
这一轮的教训:八股少不代表好过——开放设计题更考验平时的思考习惯。准备方式很具体:把 TCP、HTTP、线程池、缓存、消息队列这几个高频组件各自准备一个「如果让我重新设计,我会怎么取舍」的版本,并想清楚每个机制存在的理由。