python socket connect另一个端口_彻底解决TCP客户端端口不够用的问题

【问题】

在进行大并发性能呼叫时,经常遇到一个问题:客户端端口用尽。

【问题原因】

经过分析,主要原因在于连接断开后会有一个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进行发送消息。

首先写了如下代码进行验证:

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连接成功:

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

可见该方案可行。

【其他问题】

剩下的问题就是如何在一个机器上虚拟出多个IP?

尝试使用127.0.0.2这类回环地址,发现绑定OK,调用connect错误,貌似这类回环地址只允许listen。

于是需要专门的方式来在一个网卡上绑定多个IP:

linux:直接通过命令或配置文件的方式在一个网卡上绑定多个IP,eth0:0/eth0:1...

分享到:

2012-11-03 23:51

浏览 5019

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值