一次网络连接残留的分析

💡 原文中文,约39800字,阅读约需95分钟。
📝

内容提要

本文分析了LVS TCP探活连接残留问题,发现RST包与第三次握手的ACK乱序到达,导致RST包被丢弃。通过Scapy重现多个场景,验证了不递增的带时间戳RST包会被丢弃,从而造成连接残留。最后总结了监控方法和内核相关知识。

🎯

关键要点

  • LVS TCP 探活连接残留问题分析,发现 RST 包与 ACK 乱序到达导致 RST 被丢弃。
  • 通过 Scapy 重现多个场景,验证不递增的带时间戳 RST 包会被丢弃,造成连接残留。
  • 正常三次握手后发送 RST 包,作为对比项,发现 RST 包的处理与时间戳有关。
  • 构造场景时,客户端使用 Scapy 构造网络包,服务端通过 Python 启动 WEB 服务。
  • 在测试中,RST 包的时间戳不递增会导致连接残留,且内核会丢弃这些 RST 包。
  • 监控方法包括使用 netstat 和 tcpdump 来确认包的接收情况和顺序。
  • 总结了内核相关知识,强调了 timestamp 的重要性,特别是在三次握手阶段。
  • 监控指标 PAWSEstab 可以用来观察因时间戳不递增而被拒绝的连接数量。

延伸问答

LVS TCP探活连接残留的原因是什么?

LVS TCP探活连接残留是由于RST包与第三次握手的ACK乱序到达,导致RST包被丢弃。

如何使用Scapy重现LVS TCP连接残留问题?

可以通过Scapy构造不同场景的网络包,验证RST包的时间戳和顺序对连接释放的影响。

RST包的时间戳如何影响TCP连接的释放?

如果RST包的时间戳不递增,内核会丢弃该RST包,从而导致连接残留。

如何监控因时间戳不递增而被拒绝的连接数量?

可以通过观察/proc/net/netstat中的PAWSEstab指标来监控因时间戳不递增而被拒绝的连接数量。

在TCP三次握手阶段,RST包的处理有什么特别之处?

在三次握手阶段,内核会对RST包进行PAWS校验,如果RST包的时间戳不递增,则会被丢弃。

如何使用netstat和tcpdump确认包的接收情况?

可以使用netstat查看端口状态,使用tcpdump抓取特定端口的包,以确认包的接收顺序和内容。

➡️

继续阅读