服务部署重新调整,原来业务业务是长连接,然后通过升级到通过vip负载 ,变成短连接,就担心出现大量time_wait 造成端口号沾满。然后和别人讨论起来。被别人拒绝 让确定业务具体属性,说不需要调整。
最后发现自己基本理论忘记了。
多个客户端连接服务器占用多余服务的端口号吗?
再次回顾
第一道初级题目是:
有一台机器,它有一个 IP,上面运行了一个 TCP 服务程序,程序只侦听一个端口,问:从理论上讲(只考虑 TCP/IP 这一层面,不考虑IPv6)这个服务程序可以支持多少并发 TCP 连接?答 65536 上下的直接刷掉。
具体来说,这个问题等价于:有一个 TCP 服务程序的地址是 1.2.3.4:8765,问它从理论上能接受多少个并发连接?
第二道进阶题目是:
一台被测机器 A,功能同上,同一交换机上还接有一台机器 B,如果允许 B 的程序直接收发以太网 frame, 问:让 A 承担 10 万个并发 TCP 连接需要用多少 B 的资源?100万个呢?
从讨论的结果看,很多人做出了第一道题,而第二道题几乎无人问津。
这里先不公布答案(第一题答案见文末),让我们继续思考一个本质的问题一个 TCP 连接要占用多少系统资源。
在现在的 Linux 操作系统上,如果用 socket()/connect() 或 accept() 来创建 TCP 连接,那么每个连接至少要占用一个文件描述符(file descriptor)。为什么说“至少”?因为文件描述符可以复制,比如 dup();也可以被继承,比如 fork();这样可能出现系统里边同一个 TCP 连接有多个文件描述符与之对应。
据此,很多人给出的第一题答案是:并发连接数受限于系统能同时打开的文件数目的最大值。这个答案在实践中是正确的,却不符合原题意。
版权声明:本文为CSDN博主「陈硕」的原创文章, 遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/solstice/article/details/6579232
在真实的 Linux 系统中,可以通过调整内核参数来支持上百万并发连接。https://github.com/ideawu/c1000k 服务器是没有那么端口号。增加一个连接,服务器并多占用一个端口。服务器端口暴露给客户端只有一个9821固定的
为什么一个端口能建立多个TCP连接,同一个端口也就是说 server ip和server port 是不变的。那么只要[client ip 和 client port]不相同就可以了。能保证接唯一标识[server ip, server port, client ip, client port]的唯一性。
第一道题的答案:(没看懂呢)
在只考虑 IPv4 的情况下,并发数的理论上限是 2*48。考虑某些 IP 段被保留了,这个上界可适当缩小,但数量级不变。实际的限制是操作系统全局文件描述符的数量,以及内存大小。
一个 TCP 连接有两个 end points,每个 end point 是 {ip, port},
题目说其中一个 end point 已经固定,那么留下一个 end point 的自由度,即 2 * 48。
客户端 IP 的上限是 232 个 ,每个客户端IP发起连接的上限是 216,乘到一起得理论上限。
即便客户端使用 NAT,也不影响这个理论上限。(为什么?)
一台被测机器 A,功能同上,同一交换机上还接有一台机器 B,如果允许 B 的程序直接收发以太网 frame,问:让 A 承担 10 万个并发 TCP 连接需要用多少 B 的资源?100万个呢?
从讨论的结果看,很多人做出了第一道题,而第二道题几乎无人问津。
主要看发起方机器普端口上限是什么
客户端ip和端口的变化 ,如果压力测试,为什么从多个客户端,同时测试。