声网 C++ 一面 面经

1. 自我介绍,说说你的求职意向和职业规划

回答框架:

  • 教育背景和技术栈
  • 项目经历和技术特长
  • 为什么选择声网/云平台方向
  • 短期目标(1-3年):技术深度、业务理解
  • 长期规划(3-5年):技术专家/架构师

2. 介绍一下你的实习项目,重点说说遇到的技术难点

回答要点:

  • 项目背景和业务场景
  • 你负责的模块和技术选型
  • 遇到的具体问题(性能、并发、稳定性)
  • 解决方案和技术手段
  • 项目成果和个人收获

3. 说说你对实时音视频系统的理解,客户端和服务端的交互流程是怎样的

答案:

核心流程

  1. 信令交互:客户端连接信令服务器(WebSocket/TCP)房间管理:创建、加入、离开用户状态同步:上线、下线、静音
  2. 媒体协商:SDP(Session Description Protocol)交换协商编解码器(H.264、VP8、Opus)协商分辨率、码率、帧率
  3. 媒体传输:RTP/RTCP协议传输音视频数据UDP为主,TCP作为备选服务端转发或混流
  4. 质量控制:带宽探测和自适应码率丢包重传(NACK)前向纠错(FEC)拥塞控制(GCC算法)

架构示例

客户端 → 信令服务器(房间管理、状态同步)
       ↓
       媒体服务器(SFU/MCU)
       ↓
       其他客户端

SFU vs MCU

  • SFU(Selective Forwarding Unit):选择性转发,服务端不解码
  • MCU(Multipoint Control Unit):混流,服务端解码再编码

4. 你们的服务是如何部署的?如何实现全球就近接入和负载均衡

答案:

部署架构

  • 多地域部署:北美、欧洲、亚太等
  • 每个地域多个可用区
  • 边缘节点:靠近用户,降低延迟

DNS负载均衡

  • GeoDNS:根据用户地理位置返回最近的IP
  • 健康检查:故障节点自动摘除
  • 权重分配:按服务器性能分配流量

就近接入策略

  1. 智能调度:客户端上报位置信息调度服务器计算最优节点考虑因素:延迟、负载、成本
  2. 延迟探测:客户端ping多个节点选择延迟最低的节点定期重新探测
  3. 动态切换:监控连接质量质量下降时切换节点平滑迁移,不中断服务

负载均衡

  • L4负载均衡:LVS、HAProxy
  • L7负载均衡:Nginx
  • 一致性哈希:会话保持

优化策略

  • CDN加速:静态资源
  • 专线优化:跨地域传输
  • 多路径传输:提高可靠性

5. 如果全国有多个服务节点,客户端发起请求,有什么优化策略

答案:

就近接入优化

  1. DNS智能解析:根据客户端IP返回最近节点缺点:DNS缓存导致不准确
  2. HTTP DNS:客户端直接请求调度服务器返回最优节点IP绕过运营商DNS劫持
  3. 延迟探测:
struct NodeInfo {
    string ip;
    int port;
    int latency; // 延迟(ms)
};

NodeInfo selectBestNode(vector<NodeInfo>& nodes) {
    // 并发ping所有节点
    for (auto& node : nodes) {
        node.latency = pingNode(node.ip, node.port);
    }
    
    // 选择延迟最低的
    return *min_element(nodes.begin(), nodes.end(),
        [](const NodeInfo& a, const NodeInfo& b) {
            return a.latency < b.latency;
        });
}

负载均衡优化

  1. 服务端负载上报:节点定期上报CPU、内存、连接数调度服务器根据负载分配
  2. 客户端负载感知:服务端返回当前负载客户端选择负载低的节点
  3. 动态扩缩容:监控负载,自动扩容K8s HPA(Horizontal Pod Autoscaler)

容灾策略

  • 主备切换:主节点故障,切换到备节点
  • 多活架构:多个节点同时服务
  • 降级策略:高峰期降低服务质量

6. 说说C++的智能指针,shared_ptr是线程安全的吗(保留原题)

答案:

三种智能指针

  • unique_ptr:独占所有权
  • shared_ptr:共享所有权,引用计数
  • weak_ptr:不增加引用计数,打破循环引用

shared_ptr线程安全性

  • 引用计数的增减是线程安全的(atomic操作)
  • 对象本身的读写不是线程安全的
  • 指针本身的修改不是线程安全的

示例

shared_ptr<int> p = make_shared<int>(42);

// 线程安全:拷贝shared_ptr
shared_ptr<int> p2 = p; // 引用计数原子增加

// 不安全:修改对象
*p = 100; // 多线程需要加锁

// 不安全:修改指针本身
p = make_shared<int>(200); // 多线程需要加锁

使用建议

  • 优先用unique_ptr
  • 需要共享时用shared_ptr
  • 注意循环引用,用weak_ptr

7. TCP和UDP的区别,分别适用于什么场景(保留原题)

答案:

区别

连接

面向连接

无连接

可靠性

可靠(确认、重传)

不可靠

顺序

保证顺序

不保证

速度

开销

大(20字节头部)

小(8字节头部)

应用

HTTP、FTP、邮件

视频、游戏、DNS

TCP特点

  • 三次握手建立连接
  • 确认应答、超时重传
  • 流量控制、拥塞控制
  • 适合对可靠性要求高的场景

UDP特点

  • 无连接,直接发送
  • 不保证可靠性和顺序
  • 低延迟
  • 适合实时性要求高的场景

应用场景

  • TCP:文件传输、网页浏览、邮件
  • UDP:实时音视频、在线游戏、DNS查询、直播

实时音视频为什么用UDP

  • 低延迟优先于可靠性
  • 丢包可以容忍(人眼人耳有容错)
  • 应用层实现选择性重传(NACK)

8. 说说TCP三次握手的过程,为什么需要三次(保留原题)

答案:

三次握手过程

  1. 客户端发送SYN,进入SYN_SENT状态
  2. 服务端收到SYN,回复SYN+ACK,进入SYN_RCVD状态
  3. 客户端收到SYN+ACK,回复ACK,进入ESTABLISHED状态
  4. 服务端收到ACK,进入ESTABLISHED状态

为什么需要三次

  1. 确认双方收发能力:第一次:服务端确认客户端发送能力第二次:客户端确认服务端收发能力第三次:服务端确认客户端接收能力
  2. 防止旧连接请求:客户端发送SYN1,网络延迟客户端超时重发SYN2,建立连接延迟的SYN1到达服务端如果只有两次握手,服务端会建立连接,浪费资源三次握手,客户端不会回复ACK,连接不会建立
  3. 协商初始序列号:双方交换初始序列号(ISN)防止数据混乱

9. 场景题:服务端没有启动,客户端发送TCP连接请求,抓包会看到什么

答案:

抓包结果

  1. 客户端发送SYN包
  2. 服务端回复RST(Reset)包
  3. 连接失败

详细过程

  • 客户端:connect() → 发送SYN
  • 服务端:端口未监听 → 内核回复RST
  • 客户端:收到RST → connect()返回错误(Connection refused)

Wireshark抓包示例

1. 192.168.1.100 → 192.168.1.200  TCP  SYN  Seq=0
2. 192.168.1.200 → 192.168.1.100  TCP  RST, ACK  Seq=0 Ack=1

其他场景

  • 服务端主机不可达:ICMP Destination Unreachable
  • 防火墙拦截:无响应,客户端超时重传
  • 服务端队列满:不回复,客户端超时

10. 说说C++的拷贝构造和赋值运算符,浅拷贝和深拷贝的区别

答案:

浅拷贝

  • 只拷贝指针值,不拷贝指针指向的内容
  • 多个对象共享同一块内存
  • 析构时会double free

深拷贝

  • 拷贝指针指向的内容
  • 每个对象有独立的内存
  • 安全,但开销大

示例

class String {
    char* data;
    size_t len;
    
public:
    // 构造函数
    String(const char* str) {
        len = strlen(str);
        data = new char[len + 1];
        strcpy(data, str);
    }
    
    // 浅拷贝(默认)
    // String(const String& other) : data(other.data), len(other.len) {}
    
    // 深拷贝
    String(const String& other) {
        len = other.len;
        data = new char[len + 1];
        strcpy(data, other.data);
    }
    
    // 拷贝赋值
    String& operator=(const String& other) {
        if (this != &other) {
            delete[] data; // 释放旧内存
            len = other.len;
            data = new char[len + 1];
            strcpy(data, other.data);
        }
        return *this;
    }
    
    // 移动构造(C++11)
    String(String&& other) noexcept 
        : data(other.data), len(other.len) {
        other.data = nullptr;
        ot

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

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

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

全部评论
感谢分享,吸欧气!
点赞 回复 分享
发布于 02-27 21:34 四川

相关推荐

节前特殊时期,如若简历通过,面试时间均为年后,面试形式:线上视频面试,面试轮次三到四轮,具体看团队。以下是岗位jd(共两个):岗位名称前端开发实习生--国际化广告CRM与交易平台【base上海/杭州】职位描述ByteIntern:面向2027届毕业生(2026年9月-2027年8月期间毕业),为符合岗位要求的同学提供转正机会。团队介绍:国际化广告CRM与交易平台负责构建和维护面向全球广告销售及营销代理以及合作伙伴的全球客户关系管理平台和交易平台,与销售运营管理平台紧密协作,致力于打造稳定、灵活且智能的平台。我们通过各类智能营销工具提升商业化效率和客户满意度,保障客户资金交易的稳定性和安全性,为国际化业务的商业化变现实现收入、风险、效率与客户体验之间的平衡。1、负责前端技术选型和开发工作;2、优化前端功能设计,解决各种浏览器和终端设备的兼容性问题;3、通过技术手段,提升用户体验并满足高性能要求;4、通用组件、类库编写,提升开发效率和质量。职位要求1、2027届本科及以上学历在读,计算机相关专业优先;2、精通HTML、CSS、JS,熟悉页面架构和布局,熟悉HTML5/CSS3等常用技术;精通JavaScript、AJAX、DOM、jQuery等技术;3、熟悉常用UI框架,如Bootstrap、Pure、kendo等;熟悉NodeJS,熟练使用Grunt、gulp、Webpack等构建工具;4、具备MVVM框架开发经验,如React、VueJS、AngularJS等;5、良好的沟通和团队协作能力、热爱技术、责任心强、能推动技术框架的落地使用。岗位名称前端开发实习生—国际化广告商业平台【base北京/上海/杭州/深圳】职位描述ByteIntern:面向2027届毕业生(2026年9月-2027年8月期间毕业),为符合岗位要求的同学提供转正机会。团队介绍:国际广告平台团队负责字节跳动国际短视频业务的大型广告系统建设,是推动国际化产品商业化营收的核心力量之一。自成立以来,我们始终紧跟国际化产品发展的步伐,不断创新,致力于打造服务全球广告主的综合数字化营销服务平台,为广告主、创作者和用户搭建起一座价值互通的桥梁。我们诚邀怀揣梦想与激情的你,加入我们的行列,一同探索广告科技的无限可能!1、负责前端技术选型和开发工作;2、优化前端功能设计,解决各种浏览器和终端设备的兼容性问题;3、通过技术手段,提升用户体验并满足高性能要求;4、通用组件、类库编写,提升开发效率和质量。职位要求1、2027届本科及以上学历在读,计算机相关专业优先;2、精通HTML、CSS、JS,熟悉页面架构和布局,熟悉HTML5/CSS3等常用技术;精通JavaScript、AJAX、DOM、jQuery等技术;3、熟悉常用UI框架,如Bootstrap、Pure、kendo等;熟悉NodeJS,熟练使用Grunt、gulp、Webpack等构建工具;4、具备MVVM框架开发经验,如React、VueJS、AngularJS等;5、良好的沟通和团队协作能力、热爱技术、责任心强、能推动技术框架的落地使用。
点赞 评论 收藏
分享
4月12号,腾讯二面。面试官问:&quot;你简历上这个推荐系统,能详细讲讲吗?&quot;我深吸口气,开始背准备好的答案:&quot;这个推荐系统基于协同过滤算法,使用Spark处理大数据,Redis做缓存...&quot;&quot;等等,&quot;面试官打断我,&quot;我没问技术。这个系统要解决什么问题?&quot;我愣了:&quot;就是给用户做推荐啊...&quot;&quot;推荐什么?为了什么目标?提升DAU还是转化率?&quot;&quot;应该是...提升活跃度...&quot;我越说越没底气。面试官摘下眼镜:&quot;你负责的部分,具体解决了什么问题?&quot;我脑子一片空白,半天憋出一句:&quot;处理用户行为数据...&quot;沉默了十秒钟。面试官语气变淡:&quot;好的,聊下一个问题。&quot;那次面试不到25分钟就结束了。走出腾讯大楼,深圳的太阳晒得人发晕,我却浑身发冷。明明准备了很多次,为什么临场就是说不出来?晚上我把之前所有面试录音听了一遍,越听越不对劲。我发现自己每次回答都很&quot;死板&quot;——像在背课文,不是在交流。面试官问A我就背答案A,追问就卡壳。更可怕的是,我准备面试的方式有问题。我把网上的&quot;高频面试题100道&quot;全背下来了,但实际面试中,面试官问的往往不在这100道里。我这才意识到:我把面试当成了&quot;考试&quot;,以为背好题就能过。但面试不是考试,是&quot;对话&quot;。周末我找在阿里的表哥做模拟面试。他按真实标准来问,把我&quot;虐&quot;得体无完肤。问题一:自我介绍没记忆点我按准备的版本说了两分钟。表哥打断:&quot;你说这么多,我能记住你什么?&quot;&quot;记住我名字?&quot;&quot;不,我连名字都记不住。你的介绍就像念简历,毫无特点。&quot;问题二:回答缺少结构表哥问我最有挑战的项目,我想到哪说到哪。他再次打断:&quot;你说了一分钟,全是碎片信息。能不能用清晰的结构讲?&quot;我试了几次,根本不知道怎么&quot;有结构地&quot;讲。问题三:遇到不会的就慌表哥突然问:&quot;如果让你设计秒杀系统,怎么做?&quot;我脑子空白:&quot;我没做过...&quot;&quot;没做过不代表不能想。&quot;但我就是不知道怎么应对。问题四:数据模糊,没说服力&quot;你那个系统上线后效果怎么样?&quot;&quot;挺好的,很稳定。&quot;&quot;什么叫'挺好'?能量化吗?&quot;&quot;这个...没太关注数据...&quot;表哥摇头:&quot;面试官最烦这种模糊表达。'挺好''不错'没有任何信息量。&quot;模拟面试后,表哥总结:&quot;你的问题不是准备不够,而是方向错了。你在准备'答案',但面试官要看'思考过程'。&quot;我彻底推翻了之前的准备方式,重新设计了清单:准备一:重构自我介绍用&quot;标签+故事+钩子&quot;替代流水账。&quot;我是XX,您可以理解为'用数据驱动决策的后端工程师'。去年实习时发现订单系统会崩溃,我主动提出异步处理方案,把处理时间从5秒降到800ms,支撑618零故障。这让我对高并发优化有了深入理解。看到贵司在做XX业务,特别想知道你们怎么处理的?&quot;准备二:用&quot;STAR+思考&quot;讲项目不只讲过程,更要讲思考。S(情境)-&nbsp;要有冲突:&quot;大促前一周系统会崩,不解决肯定出事&quot;T(任务)-&nbsp;目标明确:&quot;一周内把并发从1000提升到5000&nbsp;QPS&quot;A(行动)-&nbsp;分层讲述:&quot;分三步:定位瓶颈、优化方案、压测验证&quot;R(结果)-&nbsp;数据+收获:&quot;最终支撑8000&nbsp;QPS零故障,让我明白要建立常态化监控&quot;准备三:针对JD定制提取JD关键词,找简历上最匹配的2-3个项目,把80%时间花在这些项目上。设计&quot;引导话术&quot;,主动提及这些项目。准备四:模拟实战找人做真实模拟,录音回听找问题,每个问题限时2-3分钟练习。改变方式后,我投了字节。二面时用新框架讲项目,面试官听得很认真,还不时点头。他问:&quot;如果并发再大10倍怎么处理?&quot;以前我会慌,这次我先理清思路:&quot;可以从三个层面考虑:架构层面做服务拆分,技术层面用Redis集群+限流,业务层面用排队削峰。具体选哪个要看场景,紧急情况我会优先限流+缓存,因为改动小见效快。&quot;面试官说:&quot;你思路挺清晰的,思维方式和我们团队挺match。&quot;一周后拿到了offer。准备时我用了AiCV简历王,能根据JD生成针对性面试题,模拟真实场景,帮我发现了很多没注意到的问题。总结一下:面试的本质不是证明你多完美,而是让面试官看到你的思考、潜力、真诚。三个建议:准备&quot;思考&quot;不是&quot;答案&quot;——每个项目花1-2小时深度复盘用&quot;故事&quot;不是&quot;陈述&quot;——有场景有冲突有解决过程针对JD靶向准备——提取关键词,重点准备匹配项目
查看10道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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