高并发 TCP 的 time_wait 问题。为什么服务器资源会被占满

2020-06-10 09:36:51 +08:00
 Moonkin

一个端口可以建立 2^16 个 TCP 链接吧,为什么讲解 time_wait 的博客大多都是说服务器端口被占满,难道一般情况下设计的服务器是为每一个 TCP 链接单独占用一个端口吗?

所有空闲端口*每个端口 2^16 个链接,差不多可以有 2^30 个链接,这样的话,不会发生 time_wait 过多的问题吧?

所以 time_wait 到底是占用了什么导致后续客户端访问被拒绝的?

3979 次点击
所在节点    问与答
27 条回复
liuminghao233
2020-06-10 16:58:37 +08:00
打错了 是 reuseaddr
Moonkin
2020-06-10 17:21:28 +08:00
@liuminghao233 #20 嗯,懂啦,谢谢大佬。查了查 so_reuseaddr 和 so_reuseport,感觉我这个问题还是得事先说清楚是不是 reuse
https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ
akira
2020-06-10 18:11:33 +08:00
@fxxkgw 对的,之前我们有遇到过这个情况,他们查了一个多月都没查到问题
catror
2020-06-10 18:20:58 +08:00
time_wait 是客户端的状态……占用的我是客户端的资源
julyclyde
2020-06-11 10:36:08 +08:00
“讲解 time_wait 的博客大多都是说服务器端口被占满”的主要原因是文盲
wanguorui123
2020-06-12 08:48:40 +08:00
修改 Linux 的参数,time_wait 都杀掉
gravitybox
2020-06-13 19:25:58 +08:00
“一个端口可以建立 2^16 个 TCP 链接吧”
答:一个端口可以建立不只 2^16 个 TCP 连接。标识一个 tcp 套接字是四元组,你现在只限定了源 ip 和源端口。
你这里的语境应该是:
1 、有一组固定的客户端 A 和服务端 B,即源 ip 和目的 ip 是固定的
2 、有服务端端口 6379,例如 B 上运行着 Redis 服务,绑定端口 6379

那么客户端 A 最多能和服务端 B 同时建立 65535-1024 个 tcp 连接。


“为什么讲解 time_wait 的博客大多都是说服务器端口被占满”
答:time_wait 是最先发 FIN 包的那一端才会有的状态,一般服务端不会主动断连,大多是客户端主动挥手,断开连接。


“难道一般情况下设计的服务器是为每一个 TCP 链接单独占用一个端口吗?”
答:服务端不会为每个 tcp 连接再分配端口。服务端为每个新的 tcp 连接会创建一个套接字,tcp 套接字是以四元组标识的,新的 tcp 连接,即对应不同的客户端 ip 或客户端端口。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/680225

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX