`

彻底解决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:

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

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

 

 

分享到:
评论

相关推荐

    TCP客户端与服务器连接

    在计算机网络中,TCP...总的来说,TCP客户端与服务器的连接涉及网络通信的基本机制,包括TCP报文段的结构、序列号和确认号的使用、连接的建立与关闭流程等。理解和掌握这些知识点对于网络编程和系统设计至关重要。

    彻底解决SQL SERVER 2005无法远程连接的问题

    本文将详细阐述如何从多个层面彻底解决这一问题。 首先,我们需要检查SQL Native Client配置中的别名设置。在SQL Server Configuration Manager中,如果远程连接异地数据库,正确配置别名是至关重要的。若未设置或...

    tcp协议 看了就明白tcp是怎么一回事了

    - **第四次挥手**:客户端收到服务器的FIN后,发送一个ACK作为确认,连接彻底关闭。 通过上述过程,TCP不仅实现了可靠的数据传输,还确保了连接的正确建立与终止,是互联网中最基础且重要的协议之一。

    C# TCP sever & client

    然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序。...

    c# TcpDemo sever & client

    然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序。...

    cports端口使用和对应进程查看工具

    在IT领域,管理和监控端口使用是网络维护和系统安全的重要环节。"cports"是一款专为此目的设计的工具,它允许用户查看并管理运行在系统上的...了解并熟练使用这类工具,将大大提升你在IT领域的专业素养和问题解决能力。

    445端口作用及关闭

    1. **禁用NetBT驱动**:这种方法将彻底禁用系统中的SMB机制,包括客户端和服务端支持。首先需要停止工作站和服务服务,然后再停止NetBT驱动。这种方法较为激进,可能会导致部分功能不可用。 2. **修改注册表启动类型...

    TCP服务器网络编程

    TCP服务器则是提供服务的一方,通过监听特定端口等待客户端的连接请求,一旦连接建立,就能进行数据的双向交换。 在VC++环境中,我们可以使用Winsock库来实现TCP服务器编程。Winsock是Windows操作系统对Berkeley套...

    tcp_http抓包分析_编程思路.pdf

    这个条件用于筛选来自或发送到IP地址***.***.**.***、端口为6619的TCP数据包。使用这样的过滤条件可以帮助分析特定的网络通信会话。 3. **TCP三次握手分析**:分析TCP连接建立的过程,即三次握手。TCP三次握手是...

    tcp三次握手与四次握手及SOCKE函数对应

    在计算机网络领域,TCP(传输控制协议)是互联网上应用最为广泛的一种协议,它提供了一种可靠的、面向连接的数据通信服务。TCP通过“三次握手”和“四次握手”的过程来确保连接的建立和终止是可靠和有序的。同时,...

    计算机网络实践_TCP 的连接与释放_实验七.doc

    通过本次实验,我们能够深入了解TCP连接管理的过程,包括连接建立时SYN、ACK标志的交互,以及连接释放时FIN标志的使用。这有助于我们更好地理解TCP协议如何保证网络通信的可靠性,并为后续的网络编程和故障排查提供...

    在TIME-WAIT状态下的TCP连接 收到SYN后会发生什么557-569

    在这个状态下,TCP连接并没有立即关闭,而是等待一段时间(通常为2MSL,即两倍的最长报文段寿命)再彻底结束。 当一个TCP连接处于TIME_WAIT状态时,它不再接收或发送数据,但仍然保持连接的四元组(源IP、源端口、...

    C语言编程-socket基础.docx

    - 客户端使用`Socket`发起对服务器特定端口的连接请求。客户端的端口通常是临时动态分配的,通常也在1024以上。 - 连接成功后,客户端和服务器之间打开会话。 - 会话结束后,客户端关闭Socket。 在Windows环境下...

    HP-Socket_TCP_&_UDP_通信框架开发指南

    HP-Socket 是一款专为高性能 TCP/UDP 通信设计的通用框架,它彻底封装了所有底层通信细节,为用户提供了一套简单易用且与底层通信无关的 API 接口。这使得应用程序能够专注于业务逻辑而无需关心通信层面的具体实现。...

    TCP详解

    客户端收到FIN后发送ACK,进入TIME_WAIT状态,服务器收到ACK后进入CLOSED状态,连接彻底断开。 三次握手的目的是确保双方都能接收和理解对方的连接请求,防止已失效的连接请求报文造成误连接。而四次挥手的原因...

    网络第五章-传输层协议介绍.pdf

    常见使用UDP协议的应用端口包括: - TFTP(69):简单文件传输协议,用于不需要复杂文件管理的轻量级文件传输。 - RPC(111):远程过程调用,允许一台计算机上的程序调用另一台计算机上的程序。 - NTP(123):...

    mysql-安装到最后一步时,start-service-为失败状态.pdf

    建议在安装后不要立即运行配置向导,而是重启电脑后从开始菜单运行它,这通常能解决问题。 为了解决这些问题,建议按照以下步骤操作: 1. 先停止已存在的MySQL服务。 2. 删除注册表中的MySQL服务条目。 3. 卸载并...

    IIS安装、卸载、使用问题

    ### IIS安装、卸载及常见问题解决 #### 一、IIS安装流程详解 **1. 下载IIS安装包** - 首先,确保从官方网站或可信源下载最新的IIS安装包。 - 建议将安装包放置在容易访问的位置,例如直接放在某个磁盘的根目录下...

Global site tag (gtag.js) - Google Analytics