面灵AI→

佑驾创新 服务端开发 二面面经:TCP、HTTP 各版本与 Linux Ctrl+C 原理

轮次
二面
时间
2026-09
来源
牛客网

《面试题目》

  1. 介绍实习
  2. 计算机网络:TCP、状态码、HTTP 各版本
  3. 操作系统:进程、线程、协程
  4. Linux 操作系统下 Ctrl+C 的原理
  5. 对 AI 的看法(聊天)

无手撕代码。

《参考解析》

  1. HTTP 各版本要按「解决了上一版什么问题」讲:HTTP/1.0 一次请求一个连接,开销全花在握手上;1.1 引入持久连接与管道化,但队头阻塞仍在,所以实践里靠域名分片、雪碧图这类土办法绕。HTTP/2 用二进制分帧把消息拆成帧、在同一条 TCP 连接上多路复用,头部用 HPACK 压缩(静态表 + 动态表 + 哈夫曼编码),还支持服务端推送与流优先级;它的残留问题是 TCP 层的队头阻塞——一个丢包会拖住整条连接上所有流。HTTP/3 干脆换掉传输层,跑在 QUIC(基于 UDP)之上,每个流独立重传,还内置 TLS 1.3 与连接迁移。状态码要能分类举例:2xx 成功(200、201、204)、3xx 重定向(301 永久、302 临时、304 协商缓存命中)、4xx 客户端错误(400、401、403、404、429 限流)、5xx 服务端错误(500、502、503、504 超时)。

  2. TCP 的高频追问:可靠传输靠的是序号与确认、超时重传、滑动窗口做流量控制、拥塞控制(慢启动、拥塞避免、快重传、快恢复)四件套。连接管理是三次握手建立、四次挥手释放,要能解释为什么是三次(确认双方收发能力并同步初始序号)、为什么挥手多一次(半关闭状态)、以及 TIME_WAIT 存在的两个理由(保证最后的 ACK 能到达、让旧连接的迷路报文在网络中消散)。UDP 无连接、不保证可靠与顺序、头部只有 8 字节,转发延迟低,适合直播、游戏、DNS 这类「宁愿丢也不要等」的场景。被问到选型时,给出「能不能容忍丢包、要不要自己实现重传」这两条判据即可。

  3. Linux 下 Ctrl+C 的原理:Ctrl+C 不是一个字节被程序读到,而是终端驱动层面的信号。键盘按下后,终端线路规程(line discipline)识别出 ^C 这个控制字符,把它转成 SIGINT 信号,交给当前前台进程组里的所有进程。进程如果没有注册处理器,内核执行默认动作——终止进程;注册了信号处理器就可以捕获它做优雅退出(保存状态、关闭连接、清理临时文件)。由此可以延伸三组对比:为什么放在后台跑的进程(或 nohup)里 Ctrl+C 没反应,因为它不是前台进程组成员;SIGINT 与 SIGTERM 都是可捕获的优雅退出信号,而 SIGKILL(kill -9)不能捕获、不能忽略,只能由内核强制终止,进程没有任何清理机会;信号处理函数里只能做异步信号安全的操作,别在里面做加锁和内存分配。

  4. 进程、线程、协程的取舍:进程是资源分配单位,有独立地址空间,隔离性好但切换要换页表、开销大、进程间通信要走管道或共享内存;线程是 CPU 调度单位,同一进程内共享堆和方法区、各自有栈和程序计数器,切换只需保存寄存器,但共享内存带来竞态与内存可见性问题。协程是用户态的轻量任务,由语言运行时或框架调度,切换不陷入内核、不需要系统调用,所以能开到几十万个,代价是它靠协作式让出(遇到阻塞 IO 要由运行时接管),一个协程里做 CPU 密集计算会卡住整个调度线程。面试里常被追问「IO 密集型为什么协程优势大」:这类任务绝大部分时间在等网络或磁盘,线程模型下每个等待都占着一个内核线程和栈空间,协程把等待变成了挂起与恢复的队列操作,内存与切换成本都降了一个数量级。