ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

为什么端口号最大为65535?

2021-12-09 16:03:53  阅读:242  来源: 互联网

标签:为什么 ip TCP 65535 65536 port 端口号


一.误区

因为TCP端口号是16位无符号整数, 最大65535, 所以一台服务器最多支持65536个TCP socket连接

这句话是错误的,实际上可监听的最大端口号是65536。就像一台服务器安装了一个nginx,他的默认端口是80,但可以改为65535,但支持的TCP连接可以是7万个。

二.原理

系统通过一个四元组来唯一标识一条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.com.cn 65616大家可以测试一下,这实际上是访问 www.sina.com.cn 的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.com 131152也是可以完美执行的,(65536 + 65536 + 80 = 131152)

标签:为什么,ip,TCP,65535,65536,port,端口号
来源: https://www.cnblogs.com/rxysg/p/15667781.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有