首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

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

2012-11-17 
彻底解决TCP客户端端口不够用的问题【问题】在进行大并发性能呼叫时,经常遇到一个问题:客户端端口用尽。【问题

彻底解决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进行发送消息。
首先写了如下代码进行验证:

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:

windows:可以使用我公司开发的ipop:http://www.itopdog.cn/networking-software/ip-tool/ipop.html

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

?

?

热点排行