知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

彻底解决TCP客户端端口不够用的问题

发布时间:2014-09-05 15:40:58作者:知识屋


彻底解决TCP客户端端口不够用的问题
 
【问题】  www.zhishiwu.com  
在进行大并发性能呼叫时,经常遇到一个问题:客户端端口用尽。
 
【问题原因】
经过分析,主要原因在于连接断开后会有一个timewait时间,继续保留socket、占用该端口。
 
【解决方案】
方案1
起初总是在timewait上做文章,想尽可能减小timewait的影响:
1、修改/proc/sys/net/ipv4/tcp_fin_timeout
2、修改/proc/sys/net/ipv4/tcp_max_tw_buckets
等等
 
方案2:
问题可能会有所减轻,但总是不能根除。
一次偶然机会,从朋友那里听到什么东东能支持单台机器“上百万并发量”,于是考虑如何解决tcp客户端端口不够的问题。
因为默认65535端口,经过设置,最多端口数不到60000,如何能达到百万呢?
看了下UNP,里面讲SO_REUSEADDR应用的4种场景时有说到:
SO_REUSEADDR允许单个进程捆绑同一端口到多个套接字上,只要每次捆绑指定不同的贝蒂IP地址即可。
于是猜测:当某个IP的端口用尽时可以选择另一个IP进行发送消息。
首先写了如下代码进行验证:
Python代码  
from socket import *  
from time import *  
  
s1 = socket(AF_INET, SOCK_STREAM)  
## s1.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)  
s1.bind(('192.168.0.35', 5555))  
s1.connect(('127.0.0.1', 1337))  
print 'socket1 connect ok'  
  
s2 = socket(AF_INET, SOCK_STREAM)  
## s2.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)  
s2.bind(('192.168.1.105', 5555))  
s2.connect(('127.0.0.1', 1337))  
print 'socket2 connect ok'  
  
sleep(4)  
 
说明下环境:192.168.0.35和192.168.1.105是本机具备的IP地址,在1337端口上起了个TCP服务端。
结果:
s1和s2连接成功:
Cmd代码  
C:/Documents and Settings/Administrator>netstat -an|grep 1337  
  TCP    0.0.0.0:1337           0.0.0.0:0              LISTENING  
  TCP    192.168.0.35:1337      192.168.0.35:7780      ESTABLISHED  
  TCP    192.168.0.35:5555      127.0.0.1:1337         TIME_WAIT  
  TCP    192.168.0.35:7780      192.168.0.35:1337      ESTABLISHED  
  TCP    192.168.1.105:5555     127.0.0.1:1337         TIME_WAIT  
 可见该方案可行。
 
(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜