# 1. TCP 三次握手的完整过程与每一步的语义,为什么两次不行、四次没必要,半连接队列与 SYN Flood 的关系如何? A 三次握手是双向确认"能发能收"所需的最小报文数,四次握手是冗余的 ✓ 正确答案 B 第三次握手(ACK)由服务端发送,用于确认客户端的 SYN C 第一次握手完成后,客户端即可确认服务端能正常接收数据 D 半连接队列存放的是已完成三次握手的连接
# 2. TCP 四次挥手过程与状态机,为什么挥手需要四次,CLOSE_WAIT 大量堆积说明什么问题? A 四次挥手中的被动方收到 FIN 后进入 TIME_WAIT 状态 B CLOSE_WAIT 大量堆积通常说明服务端应用层未及时调用 close() 关闭连接 ✓ 正确答案 C CLOSE_WAIT 是主动关闭方在发送 FIN 后所处的状态 D 挥手之所以需要四次,是因为 TCP 需要两次握手来确认双方序列号
# 3. TCP 与 UDP 的核心区别及典型选型场景(可靠性、有序性、拥塞控制、报文边界)? A TCP 数据报保留报文边界,应用无需处理粘包 B 在线实时音视频通话通常优先选择 UDP 以降低延迟 ✓ 正确答案 C UDP 提供拥塞控制与可靠重传,适合可靠传输 D DNS 查询必须使用 TCP 以保证可靠
# 4. TIME_WAIT 存在的原因(2MSL)与大量 TIME_WAIT 的治理手段? A 2MSL 的作用之一是确保网络中的旧报文段消失,避免污染新连接 ✓ 正确答案 B TIME_WAIT 只出现在被动关闭方,持续一个 MSL 的时间 C 大量 TIME_WAIT 时首先应禁用 TCP 协议本身 D tcp_tw_recycle 在 NAT 环境下被推荐广泛使用
# 5. SYN Flood 防御,半连接队列溢出时 SYN cookies 如何工作,开启与关闭 syncookies 时的行为差异如何? A SYN cookies 在正常连接建立时也始终开启,并支持所有 TCP 选项 B 开启 syncookies 后服务端不再校验客户端回传的 ACK C SYN cookies 通过把握手状态编码进序列号,使服务端无需维护半连接队列状态 ✓ 正确答案 D SYN cookies 能够完全消除所有类型的 DDoS 攻击
# 6. TCP 滑动窗口与流量控制,接收窗口(rwnd)如何限制发送速率,窗口缩放(window scaling)解决了什么问题? A 窗口缩放(window scaling)用于解决 TCP 头部窗口字段位数限制导致的窗口上限不足问题 ✓ 正确答案 B 接收窗口 rwnd 由网络拥塞程度决定,用于控制全局网络负载 C 当 rwnd 为 0 时发送方会立即终止连接 D 滑动窗口只负责乱序重排,不涉及发送速率控制
# 7. TCP 慢启动与拥塞避免,cwnd 与 ssthresh 如何演进,慢启动门限与快速重传/快速恢复的关系如何? A 慢启动阶段 cwnd 每轮 RTT 线性增长,拥塞避免阶段指数增长 B ssthresh 是慢启动与拥塞避免切换的门限,丢包时被降为当前 cwnd 的一半 ✓ 正确答案 C 触发快速重传后 cwnd 直接重置为初始值并重新进入慢启动 D 超时重传与快速重传两种情况下 cwnd 的处理方式完全相同
# 8. TCP 粘包/拆包的产生原因与应用层解决方案(定长/分隔符/长度前缀)? A 长度前缀法是在报文前添加定长字段标识报文长度,是主流通用方案 ✓ 正确答案 B 拆包是指接收方一次读到的数据包含多个完整的应用报文 C TCP 为每个 send 调用自动增加报文边界,因而不存在粘包问题 D 分隔符法适合二进制数据且无需处理转义
# 9. TCP keepalive 与应用层心跳的差异,为什么仅靠 TCP keepalive 不够? A 应用层心跳无法携带业务数据,只能维持连接 B TCP keepalive 能检测对端应用进程是否卡死并返回业务状态 C TCP keepalive 默认在连接空闲 2 小时后才启动探测,间隔较长 ✓ 正确答案 D TCP keepalive 在 NAT 环境下一定能及时回收失效连接
# 10. TCP 拥塞控制从 Reno 到 BBR 的演进,各自适合什么网络环境? A Reno 算法基于 RTT 延时探测,在高丢包网络中表现最佳 B BBR 以丢包为唯一拥塞信号,通过减半窗口避免拥塞 C BBR 通过测量带宽与最小 RTT 来建模网络瓶颈,适合高丢包、bufferbloat 场景 ✓ 正确答案 D CUBIC 适合低带宽简单网络,Reno 适合现代高速网络
# 11. TCP 粘包/拆包与 UDP 报文边界问题的本质区别? A TCP 内核保留 send 边界,因此不会出现粘包 B 粘包/拆包是 UDP 协议特有的问题 C UDP 数据报天然可靠有序,无需应用层处理 D UDP 一次 send 保证对应一次 recv,但因 IP 分片可能整包丢失 ✓ 正确答案
# 12. TCP 序列号(ISN)为什么需要随机化,不随机时如何被伪造 RST 或注入攻击? A ISN 随机化是为了让连接在断开后能更快复用端口 B ISN 随机化能消除所有类型的网络攻击 C 若 ISN 可预测,攻击者可能伪造正确序列号的 RST 报文来重置连接 ✓ 正确答案 D ISN 随机化会影响 TCP 的流量控制功能
# 13. TCP 半关闭(shutdown(SHUT_WR))的语义,与 close 的区别,HTTP/1.1 连接复用如何依赖它? A shutdown(SHUT_WR) 会同时关闭 socket 的发送与接收方向 B HTTP/1.1 连接复用依赖 Content-Length 或 chunked 明确响应边界 ✓ 正确答案 C close 在有引用计数时也会立即发送 FIN D 半关闭意味着连接完全断开,无法再接收数据
# 14. TIME_WAIT 的作用与端口耗尽问题? A TIME_WAIT 连接占用的端口可立即被新连接复用,不会导致端口耗尽 B 端口耗尽常见于高并发短连接场景,四元组在 TIME_WAIT 期间无法被复用 ✓ 正确答案 C 端口耗尽是服务端接收方向的问题,与客户端无关 D TIME_WAIT 的作用只是延后连接关闭,与可靠性无关
# 15. TCP 的保活与探测,keepalive 与连接断开检测如何实现? A 应用层心跳无法判断对端是否健康响应 B TCP keepalive 能检测对端应用进程是否卡死 C TCP keepalive 默认在空闲 2 小时后才开始探测,间隔较长 ✓ 正确答案 D 启用 keepalive 后无需应用层心跳
# 16. TCP 与 UDP 的选型,可靠性与延迟如何权衡? A UDP 自带可靠重传机制,适合高可靠性应用 B TCP 因重传与拥塞控制会带来额外延迟,但能保证可靠有序 ✓ 正确答案 C 音视频实时通话通常选 TCP 以保证低延迟 D QUIC 基于 TCP 实现,无法降低连接延迟
# 17. TCP 快速重传与快速恢复,为什么三个重复 ACK 触发重传,快速恢复如何避免回到慢启动? A 收到一个重复 ACK 就立即触发重传 B 三个重复 ACK 被用作丢包信号,触发快速重传并进入快速恢复(cwnd 减半) ✓ 正确答案 C 快速恢复时 cwnd 重置为初始值并回到慢启动 D 超时重传与快速重传的 cwnd 处理方式完全相同
# 18. Nagle 算法与延迟 ACK 的相互作用,为什么小包场景下会出现延迟抖动,如何用 TCP_NODELAY 缓解? A Nagle 算法会立即发送每个小数据包,不合并小包 B Nagle 与延迟 ACK 相互等待可能造成小包场景下的延迟抖动 ✓ 正确答案 C 设置 TCP_NODELAY 会开启 Nagle 算法 D 延迟 ACK 会立即发送 ACK,不等待合并
# 19. 用 netstat/ss 诊断连接状态,SYN_SENT 堆积、SYN_RECV 溢出、CLOSE_WAIT 与 TIME_WAIT 分别指向什么问题? A TIME_WAIT 堆积必然导致服务不可用 B SYN_SENT 堆积表示服务端收到了大量 SYN 但握手未完成 C SYN_RECV 堆积只可能是网络慢,与攻击无关 D CLOSE_WAIT 大量堆积通常表示服务端收到了 FIN 但应用层未调用 close() ✓ 正确答案
# 20. HTTP/3 的 QUIC 如何解决队头阻塞,0-RTT 的安全性代价? A QUIC 基于 TCP 实现,仍受 TCP 层队头阻塞影响 B QUIC 将每个流独立管理,一个流丢包不影响其他流,从而消除 TCP 层队头阻塞 ✓ 正确答案 C 0-RTT 数据绝对安全,不存在重放风险 D QUIC 无法实现连接迁移