1. 线上大量 TIME_WAIT 怎么办?

来源:主动关闭连接的一方进入 TIME_WAIT。常见于服务端主动关闭 + 短连接高并发(如连接池满时服务端 close、代理转发场景)。

排查:netstat -ant | grep TIME_WAIT | wc -l;ss -s 看汇总。

解决(按推荐顺序):

  1. 根本:长连接复用(HTTP keep-alive/连接池),减少建连-断连频率
  2. 调整内核参数(谨慎,有副作用):
    • net.ipv4.tcp_tw_reuse = 1(仅对客户端出站连接有效,复用 TIME_WAIT 连接)
    • net.ipv4.tcp_timestamps 开启(tw_reuse 依赖)
    • tcp_max_tw_buckets:超出则销毁新 TIME_WAIT(缓解,不是根治)
  3. 应用侧:服务端尽量不主动 close(让客户端关)

CLOSE_WAIT 堆积:则是代码 bug——收到 FIN 后应用没调 close(连接未释放),排查:jstack 看哪个线程持有未关闭的连接/IO 流。

🎯 面试要点

  • TIME_WAIT 多 = 连接频繁关闭(架构问题);CLOSE_WAIT 多 = 代码没关(bug)——先区分再答
  • 调整内核参数要讲清副作用(tw_reuse 影响 NAT 场景等),显示工程素养

2. 什么是 TCP 粘包/拆包?怎么解决?

原因:TCP 是字节流协议,没有消息边界。多个消息可能被合并发送(粘包),一个消息也可能被拆成多次发送(拆包)。应用层需要自己定义边界。

解决(三种主流):

  1. 固定长度:每个消息定长,不足补位。简单但浪费
  2. 分隔符:消息末尾加特殊字符(\n、\r\n)。注意内容中不能出现分隔符
  3. 长度前缀(最常用):消息头 4 字节记录长度 + 消息体。Netty 的 LengthFieldBasedFrameDecoder 就是干这个的
自定义协议:长度前缀
// 协议:| 4字节总长度 | 消息体 |
// 发送方:
ByteBuf buf = new ByteBuf(...);
buf.writeInt(msg.length);      // 长度头
buf.writeBytes(msg.getBytes());

// 接收方:
// 先读 4 字节长度 → 读满 length 字节才算一个完整消息
// Netty:pipeline.addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4))

🎯 面试要点

  • 粘包/拆包是 TCP 的特性不是 bug;UDP 有消息边界所以没有这问题
  • RPC 框架(Dubbo 协议)都自带长度头——面试可举例

3. HTTPS 能防中间人攻击吗?证书的作用?

🎯 面试要点

  • HTTP 明文抓包随便看;HTTPS 抓包要用中间人证书(如 Charles 需安装它的 CA)——原理就是这个
  • 证书有效期/续期:免费 Let's Encrypt(90 天自动续)

4. 一台服务器最多能建立多少 TCP 连接?

🎯 面试要点

  • 连接数不是性能指标:活跃连接才是;C10K → C10M 问题是网络面试经典话题
  • nginx 高并发配置:worker_connections、ulimit 调大、epoll
  • 调优命令:ulimit -n 65535;sysctl 看 tcp 内存 net.ipv4.tcp_mem

🎤 常见面试追问

  1. 线上 TIME_WAIT 过多怎么办?(背流程)——先确认来源(服务端主动关短连接);根本解:长连接复用;辅助:tcp_tw_reuse(仅出站)+ tcp_timestamps;别乱调 tcp_tw_recycle(有坑)。
  2. CLOSE_WAIT 和 TIME_WAIT 分别代表什么?——CLOSE_WAIT 多 = 代码没关连接(bug,查线程);TIME_WAIT 多 = 连接频繁关闭(架构/配置问题)。先区分再治。
  3. HTTPS 能被中间人攻击吗?——标准情况下不能(证书链验证);但用户安装了伪造根证书(企业代理/钓鱼)或忽略证书警告时会被中间人。Charles 抓包就是装它的 CA 实现的。
  4. 一台服务器最多多少连接?——四元组决定(源 IP:端口 组合),单 IP 客户端约 6.5 万上限;服务端主要看 fd 上限(ulimit -n)和内存。C10K/C10M 是经典话题。
  5. 为什么说"活跃连接"比"连接数"重要?——连接数多是"占着资源"不算压力;活跃连接(正在读写)才消耗 CPU/带宽——压测看的是活跃数。

📖 名词解释(本页术语)

术语 大白话解释
netstat / ss查看网络连接的命令:netstat -antp 看端口和连接状态(TIME_WAIT 统计用)。ss 更快。
四元组唯一标识一条 TCP 连接:源 IP + 源端口 + 目标 IP + 目标端口。
ulimit -nLinux 文件描述符上限(默认 1024):连接数超过就报 "too many open files"——高并发必调大。
中间人攻击(MITM)攻击者在通信双方之间拦截/篡改数据。HTTPS 的证书验证就是防它。
C10K 问题"一万并发连接"问题:BIO 一连接一线程撑不住,IO 多路复用(epoll)是答案——网络编程经典话题。
长连接 / 短连接短连接:用完就断(产生大量 TIME_WAIT);长连接:复用(HTTP keep-alive、连接池)——性能优化常见手段。
tcp_tw_reuse内核参数:复用 TIME_WAIT 连接(仅对客户端出站连接有效),缓解 TIME_WAIT 堆积。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。