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 地址以增加更多的连接组合。

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

相关推荐
灰子学技术4 小时前
Envoy HTTP 过滤器处理技术文档
网络·网络协议·http
时空自由民.9 小时前
HTTP协议和HTTPS协议结合天气获取案例介绍
网络协议·http·https
时空自由民.15 小时前
HTTP协议帧格式
网络·网络协议·http
Rust研习社1 天前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
灰子学技术1 天前
Envoy HTTP 流量层面的 Metric 指标分析
网络·网络协议·http
TimeAground1 天前
HTTP 协议全解:从报文到 HTTP/3,Android 开发者需要知道的一切
http
lifewange1 天前
如何设计一个 RESTful API
后端·http·restful
夜瞬2 天前
HTTP基础教程:请求方法、状态码、JSON、鉴权、超时、重试与流式返回
网络协议·http·json