为什么端⼝号最⼤为65535?
⼀.误区
因为TCP端⼝号是16位⽆符号整数, 最⼤65535, 所以⼀台服务器最多⽀持65536个TCP socket连接
这句话是错误的,实际上可监听的最⼤端⼝号是65536。就像⼀台服务器安装了⼀个nginx,他的默认端⼝是80,但可以改为65535,但⽀持的TCP连接可以是7万个。telnet ip 端口号
⼆.原理
系统通过⼀个四元组来唯⼀标识⼀条TCP连接,这个四元组的结构是{local ip, local port, remote ip, remote port}。
对于IPv4, 系统理论上最多可以管理2^(32+16+32+16), 2的96次⽅个连接。如果不仅仅考虑TCP, 则是⼀个五元组, 加上协议号(TCP, UDP或者其它)。
某个客户端向同⼀个TCP端点(ip:port)发起主动连接, 那么每⼀条连接都必须使⽤不同的本地TCP端点, 如果客户端只有⼀个IP则是使⽤不同的本地端⼝, 该端⼝的范围在unix系统上的⼀个例⼦是32768到61000, 可以通过如下命令查看:
[root@linkops ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768  61000
也就是说, ⼀个客户端连接同⼀个服务器的同⼀个ip:port(⽐如进⾏压⼒测试), 最多可以发起30000个左右的连接
TCP客户端(TCP的主动发起者)可以在同⼀ip:port上向不同的服务器发起主动连接, 只需在bind之前对socket设置SO_REUSEADDR选项
系统⽀持的最⼤打开⽂件描述符数(包括socket连接):
[root@linkops ~]# cat /proc/sys/fs/file-max
580382
单个进程所能打开的最⼤⽂件描述符数:
[root@linkops ~]# ulimit -n
1024
三.端⼝号超过65535
下图显⽰的终端端⼝为78650 ,因为TCP PORT⼤⼩为16bit,所以不能超过65535
不过Windows会有⼀个问题,telnetwww.sina 65616⼤家可以测试⼀下,这实际上是访问 www.sina 的80端⼝,为什么呢?
注:65616-65536=80
以下是引⽤⽚段:
main()
{
unsigned short int tcp_port=65616;
printf("%u",tcp_port);
}
有些软件,⽐⽅说Windows的 Telnet ,可能⽤了32 bit的数据类型记录port ,这样port表⾯上看到是可以超过65535,但是tcp header明确定义了tcpport为
16bit,那即便某些应⽤程序使⽤了32bit的数据类型,最终结果也是被强制转换。
简单的来说就是:
1.在应⽤程序⾥边可以使⽤4字节或更多字节来储存端⼝号
2.当调⽤了系统的tcp/ip通讯之后,系统底层强制将⼤于65536的端⼝转换回正常范围
3.并且在转换过程中,不会返回任何错误信息,⼀切都悄然进⾏了,所以应⽤层的程序不会有任何特别反应,这⼀切都在系统底层悄然完成了
4.转换的⽅式为:端⼝号 - 65536 = ?,问号处既是转换结果
5.如果转换后的端⼝还超过65535呢?那就继续转换,直到⼩于等于65535为⽌,所以telnet www.baidu 131152也是可以完美执⾏的,(65536 + 65536 + 80 = 131152)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。