端口重用引发的惨案

标签: Linux开发 | 发表时间:2011-09-09 13:28 | 作者:李子 ndv
出处:http://rdc.taobao.com/blog/cs

最近做个性能测试,需要在一台机器上启动很多客户端,连接到同一台服务器,我在一台机器上启动了六万个连接,于是,端口被占用完了。按照我的理解,因为我作用端口是作为客户端,应该不会影响到其它进程,于是我放心大胆地去做测试,结果就引发了悲剧。有服务器程序要用到5191端口,却显示端口被占用了,lsof看了下,居然只有我的进程占用了,完全颠覆我的惯性思想。服务端与客户端都有打开SO_REUSEADDR。

我们先来看看SO_REUSEADDR的说明:

SO_REUSEADDR可以用在以下四种情况下。
(摘自《Unix网络编程》卷一,即UNPv1)
1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启
动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但
每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可
以测试这种情况。
3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个soc
ket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的
多播,不用于TCP。

分析了一下,第二种情况比较相似,但第二种情况是针对同一服务器的多个实例(多个进程),很显然跟我的情况不一样。我是在客户端与服务端间争用端口。 所以,我的情况根本就不适合以上任何一种情况,所以设置SO_REUSEADDR为1是无用的。

再接下来分析:
一个TCP连接需要由四元组来形成,即(src_ip,src_port,dst_ip,dst_port)。
假设有客户端建立了连接(src_ip1,src_port1,dst_ip1,dst_port1),那么,如果我们还有listen在(src_ip1,src_port1),那么当(dst_ip1,dst_port1)发送消息过来,系统应该把消息给谁?所以就说明了客户端占用了某一端口时,该端口就不能被其它进程listen了。

那么,对于有些童鞋,可能还有这样的疑问,是否一台机器就只能建立65535个连接了(端口16位限制)?非也,一个连接由四元组(src_ip,src_port,dst_ip,dst_port)形式,那么当(src_ip,src_port)一定时,变化的(dst_ip,dst_port)就可以建立更多连接了。

可能有些童鞋还有疑问,作为一个服务器监控一个端口,比如80端口,它为什么可以建立上百万个连接?首先要明白一点,当accept出来后的新socket,它所占用的本地端口依然是80端口,很多新手都以为是一个新的随机端口。由四元组就很容易分析到了,同一个(src_ip,src_port),它所对应的(dst_ip,dst_port)可以无穷变化,这样就可以建立很多个客户端的请求了。

以后遇到奇怪的问题,可以简单的采用四元组原理分析一下了。

相关 [端口] 推荐:

伊朗封锁所有VPN端口

- tomz - Solidot
伊朗是互联网封锁最广泛和最严密的国家之一,社交网站如Facebook、Youtube、Orkut、MySpace和Twitter皆遭到屏蔽,迫使伊朗网民使用VPN等工具绕过审查. 然而现在,伊朗的互联网封锁深入到了新的地步:从2011年9月30日起,所有VPN端口都被封锁,伊朗正朝着建立“清真局域网”大步前进.

端口重用引发的惨案

- ndv - 淘宝核心系统团队博客
最近做个性能测试,需要在一台机器上启动很多客户端,连接到同一台服务器,我在一台机器上启动了六万个连接,于是,端口被占用完了. 按照我的理解,因为我作用端口是作为客户端,应该不会影响到其它进程,于是我放心大胆地去做测试,结果就引发了悲剧. 有服务器程序要用到5191端口,却显示端口被占用了,lsof看了下,居然只有我的进程占用了,完全颠覆我的惯性思想.

伊朗封锁所有VPN端口

- Aim - internet.solidot.org
伊朗是互联网封锁最广泛和最严密的国家之一,社交网站如Facebook、Youtube、Orkut、MySpace和Twitter皆遭到屏蔽,迫使伊朗网民使用VPN等工具绕过审查. 然而现在,伊朗的互联网封锁深入到了新的地步:从2011年9月30日起,所有VPN端口都被封锁,伊朗正朝着建立“清真局域网”大步前进.

怎么查询端口被占用

- - BlogJava-首页技术区
以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法. 1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等.         这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入"cmd"后点击确定按钮,进入DOS窗口,接下来分别运行以下命令:.

端口查看,关闭进程,Kill

- - ITeye博客
1、Windows平台. 在windows命令行窗口下执行:. 1.查看所有的端口占用情况.   协议    本地地址                     外部地址               状态                   PID. 2.查看指定端口的占用情况.   协议    本地地址                     外部地址               状态                   PID.

计算机网络端口的定义

- - CSDN博客互联网推荐文章
本文所述端口都是逻辑意义上的端口,是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等. 我们这里将要介绍的就是逻辑意义上的端口. (1)知名端口(Well-Known Ports)  . 知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务.

Windows 下如何关闭特定端口

- - 爱凝依依
然后ctrl+alt+delete 打开任务管理器,找到tor.exe右键end process.

几个端口转发的例子

- - 开源小站
很多情况下,我们往往需要通过对某个端口进行转发(端口映射)实现某些特殊功能,比如堡垒机和负载均衡什么的. 在这里我就稍微总结了几种最常用的端口转发方式供大家参考. Linux防火墙模式——反向NAT. 这种模式大多是要求用户很快速的实现将外网的某个端口eth0 1.1.1.1:80的流量引流到内网的一台主机10.0.0.1:8080中,本机内网IP eth1 10.0.0.2这种模式性能是毋庸置疑的,但相对来说稳定性和可控性不佳,往往用于临时过渡.

Shadowsocks屏蔽端口iptables规则

- - 深度VPS
Shadowsocks经常被人滥发垃圾邮件之类的而被暂停服务. 我们仅需保留SSH,SQL,DNS,HTTP和HTTPS这些主要端口,其它的用iptables做下限制,这样就高枕无忧了. 请把你的SSH22端口改了.

JSP端口转发神器:KPortTran

- - Hacking is endless! Focus on network security!
back.jsp?lip=本地ip&lp=本地端口&rip=远程ip&rp=远程端口&lp2=本地端口2//本地监听转发到第二个端口&m=运行模式//合法的值有:listen tran slave三种. 该模式下,会在本地监听两个端口,相互转发数据. 需要参数:lip、lp、rip、rp. 该模式为正向转发下,会在本地的lip上监听lp端口,当有连接建立时,再连接rip的rp端口.