HTTP:TIME_WAIT累积与端口耗尽

背景:当某个 TCP 端点关闭 TCP 连接时,会在内存中维护一个小的控制块,用来记录最 近所关闭连接的 IP 地址和端口号。这类信息只会维持一小段时间,通常是所估计的 最大分段使用期的两倍(称为 2MSL,通常为 2 分钟 8)左右,以确保在这段时间内 不会创建具有相同地址和端口号的新连接。实际上,这个算法可以防止在两分钟内 创建、关闭并重新创建两个具有相同 IP 地址和端口号的连接。

现在高速路由器的使用,使得重复分组几乎不可能在连接关闭的几分钟之后,出现 在服务器上。有些操作系统会将 2MSL 设置为一个较小的值,但超过此值时要特别小心。分组确实会被复制,如果来自之前连接的复制分组插入了具有相同连接值的 新 TCP 流,会破坏 TCP 数据。

2MSL 的连接关闭延迟通常不是什么问题,但在性能基准环境下就可能会成为一个 问题。进行性能基准测试时,通常只有一台或几台用来产生流量的计算机连接到某 系统中去,这样就限制了连接到服务器的客户端 IP 地址数。而且,服务器通常会在 HTTP 的默认 TCP 端口 80 上进行监听。用 TIME_WAIT 防止端口号重用时,这些 情况也限制了可用的连接值组合。

在只有一个客户端和一台 Web 服务器的异常情况下,构建一条 TCP 连接的 4 个值: <source-IP-address, source-port, destination-IP-address, destination-port>

其中的 3 个都是固定的------只有源端口号可以随意改变: <client-IP, source-port, server-IP, 80>

解决方案:客户端每次连接到服务器上去时,都会获得一个新的源端口,以实现连接的唯一性。 但由于可用源端口的数量有限(比如,60 000 个),而且在 2MSL 秒(比如,120 秒)内连接是无法重用的,连接率就被限制在了 60 000/120=500 次 / 秒。如果再不 断进行优化,并且服务器的连接率不高于 500 次 / 秒,就可确保不会遇到 TIME_ WAIT 端口耗尽问题。要修正这个问题,可以增加客户端负载生成机器的数量,或 者确保客户端和服务器在循环使用几个虚拟 IP 地址以增加更多的连接组合。

即使没有遇到端口耗尽问题,也要特别小心有大量连接处于打开状态的情况,或为 处于等待状态的连接分配了大量控制块的情况。在有大量打开连接或控制块的情况 下,有些操作系统的速度会严重减缓。

相关推荐
无名之逆8 小时前
Hyperlane:Rust 生态中的轻量级高性能 HTTP 服务器库,助力现代 Web 开发
服务器·开发语言·前端·后端·http·面试·rust
等风来不如迎风去10 小时前
【python】http post 在body中传递json数据 以发送
python·http·json
zhuyasen10 小时前
优化Go错误码管理:构建清晰、优雅的HTTP和gRPC错误码规范
http·rpc·golang
无名之逆10 小时前
轻量级、高性能的 Rust HTTP 服务器库 —— Hyperlane
服务器·开发语言·前端·后端·http·rust
没明白白11 小时前
了解一下HTTP的短连接和长连接
网络·网络协议·http
charlie11451419114 小时前
计算机网络笔记再战——理解几个经典的协议HTTP章3
网络·笔记·网络协议·学习·计算机网络·http
无名之逆14 小时前
告别死锁!Hyperlane:Rust 异步 Web 框架的终极解决方案
服务器·开发语言·前端·网络·http·rust
byxdaz16 小时前
QT编程之HTTP服务端与客户端技术
开发语言·qt·http
charlie1145141911 天前
计算机网络笔记再战——理解几个经典的协议HTTP章4
网络·笔记·网络协议·学习·计算机网络·http
忧虑的乌龟蛋1 天前
HTTP请求方法详解:GET、POST、PUT在微信小程序中的应用
网络·网络协议·tcp/ip·http·get·post·put