[性能分析]端口限制
1、 什么是协议端口?
在Internet上,各主机间通过TCP/TP协议发送和接收数据报,各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择。可见,把数据报顺利的传送到目的主机是没有问题的。问题出在哪里呢?我们知道大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据报传送给众多同时运行的进程中的哪一个呢?显然这个问题有待解决,端口机制便由此被引入进来。
本地操作系统会给那些有需求的进程分配协议端口(protocal port,即我们常说的端口),每个协议端口由一个正整数标识,如:80,139,445,等等。当目的主机接收到数据报后,将根据报文首部的目的端口号,把数据发送到相应端口,而与此端口相对应的那个进程将会领取数据并等待下一组数据的到来。说到这里,端口的概念似乎仍然抽象,那么继续跟我来,别走开。
端口其实就是队,操作系统为各个进程分配了不同的队,数据报按照目的端口被推入相应的队中,等待被进程取用,在极特殊的情况下,这个队也是有可能溢出的,不过操作系统允许各进程指定和调整自己的队的大小。
不光接受数据报的进程需要开启它自己的端口,发送数据报的进程也需要开启端口,这样,数据报中将会标识有源端口,以便接受方能顺利的回传数据报到这个端口。
在Internet上,按照协议类型分类,端口被分为TCP端口和UDP端口两类,虽然他们都用正整数标识,但这并不会引起歧义,比如TCP的80端口和UDP的80端口,因为数据报在标明端口的同时,还将标明端口的类型。
从端口的分配来看,端口被分为固定端口和动态端口两大类(一些教程还将极少被用到的高端口划分为第三类:私有端口):
固定端口(0-1023):
使用集中式管理机制,即服从一个管理机构对端口的指派,这个机构负责发布这些指派。由于这些端口紧绑于一些服务,所以我们会经常扫描这些端口来判断对方是否开启了这些服务,如TCP的21(ftp),80(http),139(netbios),UDP的7(echo),69(tftp)等等一些大家熟知的端口;
动态端口(1024-65535):
这些端口并不被固定的捆绑于某一服务,操作系统将这些端口动态的分配给各个进程,同一进程两次分配有可能分配到不同的端口。
2、 端口限制对性能的影响
理论上,linux和windows可用的端口个数为65535个Linux和windows动态端口的数量都存在限制,linux系统(如red hat)的动态端口限制为1024-4999,windows 2003 SOCKET 端口数量默认5000,正常情况下,这些端口数量是够用的,但是如果服务器是用来提供web服务或者用来对其他服务器加压,这时候,服务器会产生大量的TCP连接,由于每个TCP客户端连接都要占用一个唯一的本地端口号,如果现有的TCP客户端连接已将所有的本地端口号占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败,并提示错误消息:"Can't assignrequested address".
3、 如何查看端口限制
首先可以通过cat /proc/sys/net/ipv4/ip_local_port_range来查看服务器端口的极限值
再通过
netstat -an | awk '/^tcp/ {++state[$6]} END {for (key in state) print key,"\t",state[key]}'
命令来查看端口的占用情况
如果端口极限值设置较小,而端口的已经被大量使用,尤其被大量TIME_WAIT占用
就可以确认端口已经被耗尽了。
4、 如何修改端口限制
#Vi /etc/sysctl.conf
修改net.ipv4.ip_local_port_range = 1024 65000
# /sbin/sysctl -p
试配置生效即可。