小红书 C++ 开发 业务面 面经

1. 自我介绍

(根据个人情况准备)

2. 说说HTTP的发展历程,HTTP/1.1、HTTP/2、HTTP/3有什么区别

答案:

HTTP/1.0

  • 短连接:每次请求都要建立TCP连接
  • 无状态
  • 只支持GET、POST等基本方法

HTTP/1.1

  • 长连接:Connection: keep-alive
  • 管道化:可以同时发送多个请求
  • 缓存控制:Cache-Control
  • 分块传输:Transfer-Encoding: chunked
  • Host头:支持虚拟主机

HTTP/2

  • 二进制分帧:不再是文本协议
  • 多路复用:一个TCP连接处理多个请求
  • 头部压缩:HPACK算法
  • 服务器推送:Server Push
  • 优先级和依赖:请求可以设置优先级

HTTP/3

  • 基于QUIC协议(UDP)
  • 解决队头阻塞:丢包不影响其他流
  • 0-RTT连接建立:更快
  • 连接迁移:IP变化不影响连接
  • 内置加密:TLS 1.3

对比总结

传输层

TCP

TCP

QUIC(UDP)

多路复用

队头阻塞

有(TCP层)

头部压缩

连接建立

快(0-RTT)

3. TCP的滑动窗口机制是什么?它能变小或向左移动吗

答案:

滑动窗口作用

  • 流量控制:防止发送方发太快
  • 提高效率:不用每发一个包就等ACK

工作原理

发送窗口:[已发送已确认][已发送未确认][可发送][不可发送]
接收窗口:[已接收已确认][可接收][不可接收]

窗口大小

  • 接收方通过ACK告知发送方窗口大小
  • 窗口大小 = 接收方缓冲区剩余空间

窗口能变小吗

  • 可以变小:接收方缓冲区满了,窗口变小
  • 可以变为0:接收方处理不过来,窗口为0,发送方停止发送
  • 窗口探测:窗口为0时,发送方定期发送探测包

窗口能向左移动吗

  • 理论上不应该:已确认的数据不应该撤回
  • 实际上不会:TCP协议规定窗口左边界只能右移或不动
  • 如果左移:会导致数据混乱,协议错误

示例

初始窗口:[1-10]
发送1-5,窗口:[6-10]
收到ACK 3,窗口:[4-13](右移)
接收方缓冲区满,窗口:[4-8](变小)

4. 如果网络波动很大,TCP协议有什么问题?如何优化

答案:

TCP在弱网下的问题

  1. 队头阻塞:一个包丢失,后续包都要等待影响整体传输效率
  2. 重传开销大:超时重传时间长快速重传也需要等3个重复ACK
  3. 拥塞控制过于保守:丢包就认为网络拥塞大幅降低发送速率恢复慢
  4. 连接建立慢:三次握手延迟高弱网下更明显

优化方案

  1. 应用层优化:减少请求次数:合并请求压缩数据:减少传输量分片传输:大文件分小块断点续传:失败后从断点继续
  2. 协议层优化:使用QUIC:基于UDP,无队头阻塞使用KCP:可靠UDP协议,牺牲带宽换延迟使用MPTCP:多路径TCP,同时用WiFi和4G
  3. 传输策略优化:自适应码率:根据网络调整数据量前向纠错(FEC):发送冗余数据选择性重传:只重传丢失的包
  4. TCP参数调优:调整初始拥塞窗口调整重传超时时间启用TCP Fast Open

实际应用

  • 视频直播:用QUIC或自研协议
  • 文件传输:断点续传+分片
  • 实时通信:WebRTC(基于UDP)

5. TCP第一次真正发送数据是在什么时候

答案:

TCP连接建立过程

  1. 第一次握手:客户端发送SYN
  2. 第二次握手:服务端发送SYN+ACK
  3. 第三次握手:客户端发送ACK

第一次发送数据

  • 第三次握手时可以携带数据
  • 客户端发送ACK的同时可以发送应用数据
  • 这是TCP第一次真正发送业务数据

为什么第三次握手可以带数据

  • 此时客户端已经确认服务端存在且可达
  • 连接已经建立(客户端视角)
  • 可以开始传输数据

为什么前两次握手不能带数据

  • 第一次握手带数据:容易被攻击(SYN Flood)
  • 第二次握手带数据:服务端还不确定客户端是否真实

TCP Fast Open(TFO)

  • 优化:第一次握手就可以带数据
  • 通过Cookie机制验证客户端
  • 减少一个RTT

6. 如果你是微信的开发工程师,如何设计"检测当前网络"功能

答案:

需求分析

  • 检测网络是否可用
  • 检测网络质量(延迟、丢包率、带宽)
  • 给用户友好提示

设计方案

1. 网络可达性检测

bool checkNetworkReachability() {
    // 方法1:ping微信服务器
    bool pingSuccess = ping("wechat.com", timeout);
    
    // 方法2:HTTP请求
    bool httpSuccess = httpGet("https://wechat.com/health", timeout);
    
    // 方法3:检查本地网络接口
    bool hasNetwork = checkNetworkInterface();
    
    return pingSuccess || httpSuccess;
}

2. 网络质量检测

struct NetworkQuality {
    int latency;      // 延迟(ms)
    float packetLoss; // 丢包率
    int bandwidth;    // 带宽(kbps)
};

NetworkQuality detectNetworkQuality() {
    // 1. 延迟检测:ping多次取平均
    int latency = 0;
    

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论
滑动窗口懂了
点赞 回复 分享
发布于 03-12 10:26 北京
太强了。
点赞 回复 分享
发布于 02-24 17:00 山东

相关推荐

03-30 20:53
东南大学 C++
一、自我介绍 / 岗位匹配 / 方向选择1.请做一下自我介绍。2.你之前主要投的是后台岗位,为什么后来转向客户端?3.你说自己和后台岗位匹配度不高,主要差在哪些方面?4.你对移动客户端开发岗位是怎么理解的?5.你为什么会考虑客户端 / SDK / AI 应用这些方向?二、实习项目整体理解:端侧特征平台做什么6.你在字节这段实习主要做了什么?7.你们这个 SDK 的定位是什么?是跨端的吗?8.你们这套东西更像 APM、数据采集,还是特征处理平台?9.你对这套业务在线上产品里的完整流程理解到什么程度?10.原始事件是怎么转成特征,并最终被业务方使用的?三、本地数据库 / SQL / 特征查询链路11.你们端上的数据是怎么存的?为什么用本地数据库?12.这个数据库用的是什么?它是普通数据库,还是有针对性能做特殊设计?13.你看到过哪些查询 / SQL 优化相关的内容?14.你做的 SQL 复用优化,本质上是在优化什么问题?四、设备特征缓存优化:设计、指标、并发问题15.你讲一下设备特征缓存优化这个需求的背景和方案。16.为什么会想到做 2s / 10s / 90s 这样的分层缓存?这些数值是怎么定的?17.你这个缓存是怎么检查过期、怎么更新的?18.这套缓存是你们第一次上线的吗?19.最终的优化收益是怎么测出来的?30%、Android 4.8%、iOS 2.5% 分别代表什么?20.你这里用到的智能指针和 concurrent hash map,线程安全和内存安全是怎么理解的?21.如果缓存瞬间失效,又来了很多并发请求,会不会出现类似缓存击穿的问题?你怎么处理?22.如果让你继续优化这套缓存,你觉得还能怎么做?五、特征 SQL 结果缓存 / 事件驱动失效 / TTL23.你说的特征 SQL 复用具体是怎么做的?24.所谓 SQL 签名化是什么意思,为什么要这么做?25.这个查询结果缓存的 key 和 value 分别是什么?26.查询结果缓存怎么判断是否还能复用?27.事件驱动失效机制具体是什么?为什么事件变了缓存就会失效?28.你这里有两个 TTL:设备特征缓存 TTL 和特征查询缓存 TTL,它们分别是怎么设计的?29.后期你提到不是直接删缓存,而是把最新结果插入缓存,这个思路具体是什么?30.这里有没有用队列或者别的方式维护事件变更?六、实习中的挑战 / 自动化测试 / MCP & Agent 生成用例31.这段实习里你遇到过最大的挑战是什么?32.这个需求是你一个人做的吗,还是 mentor 带着推进的?33.你提到自动化测试用例,这块具体做了什么?34.这些测试用例属于什么级别,是接口测试、单元测试,还是别的?35.你做的 MCP / Agent 自动补全测试用例,大致思路是什么?36.如果测试失败了,你们后续有没有自动分析、自动修复,还是主要人工处理?七、AI Coding:工具使用、代码占比、主要问题37.你现在 AI 用得多吗?平时会付费用哪些工具?38.你在项目里手写代码和 AI 生成代码的比例大概是多少?39.你主要用什么 AI coding 工具?40.你觉得 AI 写代码最大的优点和最大的问题分别是什么?41.如果 AI 生成的代码不符合你的预期,你一般怎么改进?八、多 Agent 项目:设计、评估、稳定性42.你这个 AI 投资分析系统整体是怎么设计的?43.多 Agent 的分工和整体执行流程是什么?44.你是一步步确认它生成的内容,还是一次性让它完成?45.你怎么判断一个 Agent 是否满足你的预期?46.Agent 和 Agent 之间通信的数据格式是谁定义的?47.多次运行的时候,Agent 之间输出的格式和结果能保持一致吗?48.如果模型不按你定义的格式输出,你会怎么优化?49.你这里 prompt、rule、skill 分别用在什么地方?九、上下文窗口 / 滑动窗口 / 记忆管理50.你高并发 AI 聊天系统里提到的“滑动窗口”具体是怎么做的?51.为什么要做这个滑动窗口?它解决了什么问题?52.这个窗口的 size、起点和终点是怎么定的?53.你怎么判断哪些上下文该保留,哪些该裁掉?54.你这个设计是不是严格来说不算真正的滑动窗口?55.如果让你重新设计这块上下文管理,你会怎么优化?十、C++ / 网络库 / 并发框架56.你这个高并发 AI 聊天系统里的网络库,是自己写的还是现成的?57.你给我讲一下这个网络框架的整体设计。58.epoll 在这里起到了什么作用?59.你的线程池是怎么设计的,为什么要动态扩容 / 缩容?60.你的网络库里,最核心的几个组件和职责分别是什么?十一、弱网排查 / 网络链路 / 协议优化61.如果用户反馈“很卡”,你怎么判断到底是不是弱网问题?62.如果线上只能看到网络日志,你会重点看哪些指标来排查?63.从输入网址到页面加载完成,整个网络链路里会经过哪些步骤?64.DNS、TCP 建连、资源下载这些环节分别可能出什么问题?65.如果 DNS 慢或者查不到,有什么优化思路?66.如果服务端响应慢或者 TCP 层有问题,你会怎么排查?67.对于弱网场景,有没有一些客户端侧的兜底优化手段?68.你了解哪些协议层面的优化,比如多路复用、QUIC 之类的吗?算法题:滑动窗口最大值面了一个半小时,面试官整体比较和蔼,不追问。转面客户端整体强度还是小了很多,不管了,现在能赚几年钱赚几年,有了AI以后哪个方向都是危机了,还是争取拿个好背书吧
点赞 评论 收藏
分享
评论
3
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务