字节一面:从网卡驱动问到 HTTP/3,手撕判断树的子结构
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 介绍一下你的项目经历中最能体现个人能力的那一段。
- 是否测试过 Redis 的性能?
- 网卡驱动了解吗?
- TCP 和 UDP socket 编程的区别与特点是什么?
- ARP 协议的作用是什么?
- ARP 解析的具体是什么 IP?第一次没有 MAC 时是怎么发送的?
- HTTP 1.0、1.1、2.0、3.0 的区别是什么?
- 手撕:判断树的子结构。
《参考解析》
Redis 性能测试:要能给方法而不是结论。工具用 redis-benchmark 或自己写压测(控制并发与 pipeline 深度),看的指标是 QPS、P99 延迟、连接数与内存碎片率;变量要控制——单机还是集群、是否开 AOF/RDB、value 大小、是否 pipeline。结论要落到「瓶颈在哪」:CPU 单线程、网络 RTT、还是持久化 fork 抖动。
网卡驱动:能讲到「收包路径」就够。硬件收包 → DMA 写入环形缓冲 → 触发中断 → NAPI 软中断轮询收包(中断合并降低 CPU 占用)→ 协议栈处理。发送侧是队列 + doorbell。再补一句多队列与 RSS 让不同流落到不同 CPU,以及 XDP/eBPF 在驱动早期处理包的场景。
TCP vs UDP socket 编程:TCP 面向连接、可靠有序、有流控与拥塞控制,编程上是 listen/accept 的多连接模型或 connect 的客户端模型,读写是字节流所以要自己处理粘包(长度前缀或分隔符);UDP 无连接、不保证顺序与到达,编程上 recvfrom/sendto 带地址,需要自己在应用层做重传、序号与分片。选型看「可容忍丢包换低延迟」还是「必须完整有序」。
ARP 的作用与首次发送:ARP 把同一广播域内的 IP 解析成 MAC。查询的目标 IP 是「下一跳 IP」——同网段就是目的主机 IP,跨网段则是网关 IP。第一次没有 MAC 时,主机会广播一个 ARP Request(目的 MAC 全 F),目标主机/网关单播回 ARP Reply,结果进 ARP 缓存(有老化时间)。所以「第一次怎么发」的答案是:先发广播请求,拿到 MAC 再发数据帧;期间数据包会被排队或丢弃。
HTTP 版本演进:1.0 短连接、每个请求一个 TCP;1.1 默认长连接 + 管线化(但有队头阻塞)、新增 Host 头与分块传输;2.0 二进制分帧 + 多路复用 + 头部压缩(HPACK)+ 服务端推送,解决应用层队头阻塞但 TCP 层仍在;3.0 换到 QUIC(基于 UDP),解决传输层队头阻塞、支持 0-RTT 建连与连接迁移。
手撕「判断树的子结构」:isSubStructure(A, B) 递归——若 B 为空返回 false(约定空树不是子结构),若 A 为空返回 false;否则判断「以 A 为根是否包含 B」(doesHave:B 空则 true,A 空或值不等则 false,否则递归左右)或「A 的左子树包含 B」或「A 的右子树包含 B」。注意 doesHave 与主函数是两个递归,混用是这题最常见的错误。