Q1:TCP 和 UDP 有什么区别?在 K8s 场景下分别常见于哪些地方?
- 核心要点
- TCP 是 面向连接、可靠传输、按序到达 的协议。
- UDP 是 无连接、尽力而为、不保证顺序 的协议。
- TCP 有确认应答、重传、流量控制、拥塞控制;UDP 没有这些机制,协议头也更小。
- K8s 场景里:
kube-apiserver、etcd、大多数 Web 服务通信通常走 TCP- DNS 常用 UDP 53,报文过大或特殊场景会回退到 TCP 53
- 某些实时日志、监控、流式场景可能使用 UDP
- 易错点
- 不能简单说 UDP “不可靠就没用”,它适合 低时延 场景。
- 不能说 TCP “一定更快”,TCP 是 更可靠,但控制开销更大。
- DNS 不只是 UDP,也可能走 TCP。
- 深挖点
- 为什么视频、语音、游戏偏 UDP:允许少量丢包,但不能接受高延迟。
- 为什么 K8s 控制面大量使用 TCP:状态一致性和可靠性交付更重要。
- 如果面试官追问,可以补充:TCP 面向字节流,UDP 面向报文。
Q2:TCP 为什么能够保证可靠传输?
- 核心要点
- 通过 序列号 保证数据有序。
- 通过 ACK 确认应答 确认数据是否到达。
- 通过 超时重传 处理丢包。
- 通过 校验和 检测传输错误。
- 通过 流量控制 防止接收方被压垮。
- 通过 拥塞控制 避免网络被打爆。
- 易错点
- 校验和只能发现错误,不能单独保证可靠性。
- ACK 不是“每个包都单独确认”的绝对固定模式,还可能有 累计确认。
- TCP 保证的是 传输层意义上的可靠,不代表应用一定正确处理了业务。
- 深挖点
- 如果出现乱序,接收端依赖序列号重排。
- 如果 ACK 丢了,发送端可能触发重传,但接收端可根据序列号去重。
- 可以延伸到 重传触发方式:超时重传、快速重传。
Q3:TCP 三次握手的过程是什么?为什么不是两次或四次?
- 核心要点
- 第一次:客户端发
SYN,表示想建立连接。 - 第二次:服务端回
SYN + ACK,表示收到并同意建立。 - 第三次:客户端回
ACK,表示确认,连接建立。 - 三次握手的目的:确认 双方收发能力 都正常,并同步初始序列号。
- 第一次:客户端发
- 易错点
- 不能只说“为了建立连接”,要说清楚 确认双向通信能力。
- 两次握手不够,因为服务端无法确认客户端是否收到了自己的响应。
- 四次握手没必要,因为第二次已经可以把
SYN和ACK合并返回。
- 深挖点
- 为什么要同步初始序列号:避免历史报文干扰新连接。
- K8s/运维场景里,若大量
SYN_RECV,可能是:- 半连接队列压力大
- SYN Flood
- 后端处理不过来
- 可结合排障命令理解:
ss -ant、netstat -ant。
Q4:TCP 四次挥手的过程是什么?为什么会有 TIME_WAIT?
- 核心要点
- 第一次:主动关闭方发送
FIN - 第二次:被动关闭方回
ACK - 第三次:被动关闭方处理完数据后发送
FIN - 第四次:主动关闭方回
ACK - 之所以四次,是因为 TCP 是 全双工,两个方向要分别关闭。
TIME_WAIT常出现在 主动关闭方。
- 第一次:主动关闭方发送
- 易错点
- 不能把三次握手和四次挥手混在一起说。
TIME_WAIT不是异常,它是 TCP 的正常设计。CLOSE_WAIT不是同一个概念,通常说明应用没及时关闭连接。
- 深挖点
TIME_WAIT的作用:- 保证最后一个 ACK 能让对方收到
- 让旧连接残留报文在网络中自然消失
- K8s/运维里如果大量
TIME_WAIT,常见原因:- 短连接过多
- 健康检查频繁
- 上游/下游连接复用不足
- 如果大量
CLOSE_WAIT,更像是 应用层没有正确 close。
Q5:TCP 的流量控制是怎么实现的?滑动窗口有什么作用?
- 核心要点
- 流量控制解决的是:发送方别发太快,接收方来不及处理。
- TCP 通过 滑动窗口 实现流量控制。
- 接收方在 ACK 中通告自己的 接收窗口 rwnd。
- 发送方实际能发多少,要受窗口限制。
- 易错点
- 不要把 流量控制 和 拥塞控制 混为一谈。
- 流量控制关注 接收端处理能力,拥塞控制关注 网络是否拥堵。
- 发送窗口不只是“已发送未确认的数据”,还涉及可继续发送的范围。
- 深挖点
- 发送方真正可发送窗口通常受
min(cwnd, rwnd)限制。 - 如果接收窗口变成 0,会出现 零窗口等待/探测。
- 在容器场景中,应用处理慢、缓冲区小,也会导致窗口缩小,表现为吞吐下降。
- 发送方真正可发送窗口通常受
Q6:TCP 的拥塞控制有哪些阶段?分别有什么作用?
- 核心要点
- 慢启动:开始时谨慎探测网络能力,拥塞窗口快速增长。
- 拥塞避免:达到阈值后改为线性增长,防止过快打满网络。
- 快重传:收到 3 个重复 ACK,直接重传丢失报文,不等超时。
- 快恢复:重传后不必回到最初状态,而是较快恢复传输。
- 易错点
- 不能说拥塞控制是为了保护接收方,那是流量控制的目标。
- 不能把
cwnd和rwnd混为一谈。 - “3 个重复 ACK”是快重传的重要触发条件,容易漏掉。
- 深挖点
- 拥塞控制本质是在 吞吐量与网络稳定性 之间找平衡。
- 在 K8s 集群里,如果出现网络抖动、丢包、延迟升高,TCP 吞吐会明显下降。
- 面试如果继续问,可以补充:超时重传通常意味着比重复 ACK 更严重的拥塞判断。
Q7:TCP Keepalive 和 HTTP Keep-Alive 有什么区别?
- 核心要点
- TCP Keepalive 是 传输层保活机制,用于检测连接是否还活着。
- HTTP Keep-Alive 是 应用层连接复用机制,用于一个 TCP 连接上复用多个 HTTP 请求。
- 一个是“探活”,一个是“复用”。
- 易错点
- 名字像,但不是一个东西。
- HTTP Keep-Alive 不等于 TCP Keepalive。
- HTTP 长连接也不代表连接永远不关闭,仍然受超时和连接池策略影响。
- 深挖点
- K8s 中常见长连接场景:
- API Server 与客户端
- Ingress / Service 与后端
- 监控采集、日志上报
- 如果长连接中间被防火墙/NAT 清掉,TCP Keepalive 能帮助发现失效连接。
- 运维排障时要区分:是 应用层连接复用问题,还是 传输层连接保活问题。
- K8s 中常见长连接场景:
Q8:UDP 如何实现“可靠传输”?
- 核心要点
- UDP 自身不可靠,但应用层可以补齐机制。
- 常见补齐手段:
- 序列号
- ACK 确认
- 超时重传
- 滑动窗口
- 去重、乱序重排
- 本质上是在应用层“模拟 TCP 的一部分能力”。
- 易错点
- 不能说“UDP 无法实现可靠传输”,准确说法是 UDP 协议本身不提供,但应用层可以实现。
- 不能忽略代价:一旦自己补齐可靠性,复杂度会明显上升。
- 深挖点
- 为什么有些系统不直接用 TCP,而是基于 UDP 自研可靠协议:
- 更可控的重传策略
- 更低延迟
- 更适配实时业务
- 可以顺带提到:现代很多协议会在 UDP 之上实现更复杂能力。
- 为什么有些系统不直接用 TCP,而是基于 UDP 自研可靠协议:
Q9:运维面试中,为什么大量 TIME_WAIT、CLOSE_WAIT 会被重点问?
- 核心要点
- 这是传输层知识和线上排障能力的结合点。
TIME_WAIT多:一般说明 主动关闭连接的一方很多,常见于短连接高并发。CLOSE_WAIT多:一般说明 对端已关闭,但本端应用没正确 close。- 对 K8s 运维来说,这经常关联到:
- Pod 服务短连接风暴
- Nginx/Ingress 连接复用不足
- 健康检查过于频繁
- 应用连接泄漏
- 易错点
- 不能简单把
TIME_WAIT全都当问题。 CLOSE_WAIT往往更值得警惕,因为它常指向 程序缺陷。- 不要只会背状态名,要能说出排查思路。
- 不能简单把
- 深挖点
- 排查方向:
- 看连接状态分布
- 看谁是主动关闭方
- 看是否启用连接池/长连接
- 看应用日志和 fd 使用情况
- 常用命令:
ss -antnetstat -antlsof -i
- K8s 中可继续看:
- Pod 内连接状态
- Node 侧 NAT/conntrack 压力
- Ingress / Service 转发路径
- 排查方向:
速记笔记
- TCP:面向连接、可靠、按序、字节流;有重传、流控、拥塞控制
- UDP:无连接、不保证可靠、报文导向;快、轻、适合低时延
- 三次握手:确认双方收发能力 + 同步初始序列号
- 四次挥手:TCP 全双工,两个方向分别关闭
- TIME_WAIT:主动关闭方常见,保证最终 ACK 可达、旧报文消散
- CLOSE_WAIT:多半是本端应用没正确关闭连接
- 流量控制:防止接收方被压垮,靠
rwnd - 拥塞控制:防止网络被打爆,核心是
cwnd - 发送窗口:通常受
min(cwnd, rwnd)约束 - 快重传:3 个重复 ACK 触发
- TCP Keepalive:保活探测
- HTTP Keep-Alive:连接复用
- K8s 高频关联:
- API Server / etcd:TCP
- DNS:UDP 为主,必要时 TCP
- 运维排障高频:连接状态、重传、丢包、长短连接、TIME_WAIT/CLOSE_WAIT