注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

临时端口号在不同的操作系统下的分配  

2014-10-14 15:10:58|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

临时端口号在不同的操作系统下的分配

 

无论是在WIN下还是在LINUX下或者说其它的操作系统上,在进行网络编程的时候儿,不可避免的会出现下面这种情况:

在客户端连接服务端的模式下,如果由于某种原因,客户端与服务端推动联系,然后就会在客户端主动发起重连,如果连接不上,会一直不断的重连,这时候儿就会出现一个问题,那就是如果你重连的时间很短,那么你使用的端口(客户端也可以绑定端口,但是大家一般在客户端编程下,是自动让操作系统来分配端口号)会不断的消耗,直到耗尽。最后无法绑定到任何一个临时端口。导致你的重连无法成功。

那么这就引出一个问题,在不同的系统上,临时端口是如何分配的呢?大约有多少个呢?先说WIN下临时端口:

Microsoft Windows XP Windows Server 2003 中,由 Windows 套接字分配给应用程序的临时 TCP UDP 端口号的最大值是由注册表设置 MaxUserPort 控制的,该参数的默认值为 5000。临时端口从端口号 1025 开始编号。因此,默认情况下,Windows XP Windows Server 2003 会为执行通配绑定的应用程序分配一个范围从 1025 5000 的号码。

要在运行 Windows XP Windows Server 2003 的计算机上更改临时端口的最大值,请执行以下操作:

1.单击开始,再单击运行,键入 regedit.exe,然后单击确定。

2.找到而后单击以下注册表子项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

3在编辑菜单上,指向新建,然后单击双字节值。

4.键入 MaxUserPort,然后按 ENTER

5.双击 MaxUserPort 值,然后以十进制或十六进制键入最大值。

键入的数值必须在 5000¨C65534(十进制)之间。如果此参数设置的值超出有效范围,则使用最接近的有效值(5000 65534)。

6.单击确定。

7.退出注册表编辑器。

警告 如果错误使用注册表编辑器,可能会导致严重问题以至于需要您重新安装操作系统。Microsoft 无法保证您能够解决由于错误使用注册表编辑器而引起的问题。您必须自行承担使用注册表编辑器所带来的风险。

必须重新启动计算机,方可使 MaxUserPort 注册表设置更改生效。

如果应用程序使用通配绑定同时打开大量连接,可能只需更改这个值,而且需确保应用程序不会用尽可用的临时端口。例如,一个使用文件传输协议 (FTP) 传输大量小文件的数据备份应用程序就可能用尽临时端口。

再说一下LINUX下的临时端口:

Linux下端口的划分使用是由IANAInternet Assigned Numbers Authority,因特网已分配数值权威机构)维护的,端口号被划分为3个段。(其实WIN也遵从这个规定)

10~1023,这些端口有IANA分配和控制,可能的话,相同端口号就分配给TCPUDPSCTP的同一给定服务。如80端口被赋予web服务

21024~49151,这些端口不受IANA控制,不过由IANA登记并提供他们的使用情况清单,已方便整个群体。相同端口号也分配给TCPUDP的同一给定服务。如6000~6003端口分配给这两种协议的X Window服务器。

349152~65535,动态端口。IANA不管这些端口,就是我们所说的临时端口。(49152这个魔数是65536的四分之三)。

那么LINUX下如何修改端口的范围呢:

这部分转自:http://www.111cn.net/sys/linux/65300.htm

比如在启动自定义服务的时候,希望使用8370端口,却发现端口已经被nginxnode占用了,无法启动。但是lvs又已经申请了,改端口的话比较麻烦。所以可以修改下 /proc/sys/net/ipv4/ip_local_port_range 参数,使tcp协议分配的端口从一个比较大的范围开始启用,这样,nodenginx就不会占用较小的端口了。

echo '32768 61000' > /proc/sys/net/ipv4/ip_local_port_range

补充:临时端口范围调整

你能使用netstat命令来显示有多少个连接进入这个状态:[若是生产环境下,最好先进行测试,然后考虑一个端口的合适范围]

shell>netstat -n | grep TIME_WAIT

……

shell>cat /proc/sys/net/ipv4/ip_local_port_range

32768   61000

如果需要修改 echo "start-number  end-number"start-numberend-number0-65536端口号范围内的数,,0-1024最好不要用,通常是熟知端口,如果是专门的代理服务器的话,很多熟知端口没有使用,当然可以考虑!

不要忘记将echo命令加到系统启动脚本中,以使机器每一次重启后都生效

回过头来再看端口是如何划分的:

TCP UDP 使用端口号来标识源和目标应用程序。对于典型的客户-服务器协议(例如那些用于 Web 和电子邮件访问的协议),通信是由客户端计算机发起的。服务器应用程序通常监听众所周知的 TCP UDP 端口,它们是由 Internet 号码分配机构 (IANA) 分配的。对于源端口,客户端应用程序通常查询操作系统中已不再由其他应用程序占用的动态分配的 TCP UDP 端口。当应用程序请求而后绑定到一个动态分配的端口时,这就是通常所说的通配绑定。

动态分配的端口也称为临时端口。术语“临时”(短暂)并不表示端口的生存期一定很短。例如,用于超文本传输协议的端口在数据传输完成之后会立即关闭。临时是指,与通常在整个服务器计算机运行期间都保持打开的服务器应用程序端口相比,客户端应用程序端口的生存期相对较短(至多只在应用程序运行期间保持打开)。

客户端计算机使用临时端口而不是众所周知的端口,以防与可能使用众所周知端口的本地服务发生冲突。例如,运行 Microsoft Windows XP 的计算机可能会使用 Internet Explorer,还可能运行 Internet 信息服务 (IIS)。当 Internet Explorer 访问网页时,它无法将 TCP 端口 80 用作源端口,因为该本地端口可能已被 IIS 占用。如果两个应用程序都设计成独占使用同一端口,则一次只有其中一个应用程序能够成功运行。

 

网络编程到处是坑,一定不要自己挖了自己跳啊。把握住细节。

  评论这张
 
阅读(511)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017