我在浏览 ipchicken 网站时注意到了(http://www.ipchicken.com/) 当我从我的台式机、手机或大学 wifi 访问时,它会给我一个“远程端口”。端口号有一系列(似乎从未超过 65,000 左右)。但是如果我编写一个程序来监听每个端口会怎么样?路由器会用完端口吗?它会阻止新人连接吗?当路由器用完内部端口号时会发生什么?
答案1
TCP 或 UDP 协议中的端口以 16 位整数存储,因此只有 65535 个端口可用。
如果您使用计算机上的每个端口,那么任何需要套接字(连接)的应用程序都将无法获得它。 listen() 或 connect() 等函数将导致错误,直到有空闲端口可用。
如果使用路由器(带 NAT)中的每个端口,则每个新连接都将被缓冲或丢弃。如果路由器只是路由器,而不是带 NAT 的网关,则不会存在端口问题,因为未分析传输层(ISO/OSI 模型中的第 4 层)。
答案2
答案3
TCP/IP的工作原理如下:
当您在客户端和服务器之间创建连接时,它会根据端口和 IP 地址连接到一个端口。
您的 IP 地址是服务器提供的 IP 地址,端口是发起连接的一方提供的任何内容。例如,FTP 服务器将连接到端口 21,除非服务器特别提到使用其他端口。
可以通过两种方式建立连接。
首先,服务器在公共端口上侦听任何连接,以启动即将建立的链接。然后会发生以下两种情况之一:
- 服务器使用不同的端口创建一个新的套接字并回复:请连接到此端口。
- 服务器询问您可以连接到哪个端口,然后连接到该端口。
此处的区别在于,第一种方式下,所有连接都是从客户端出站的,因此路由器上不需要转发任何端口。而第二种方式则使用需要配置的传入端口。
技术上的差异基本上在于带宽与客户端开放端口的问题。
现在,当从外部连接到您的公共 IP 时,在任何给定端口上,您的路由器将接受该端口,并使用内部规则(路由)将通信转发到本地网络上的客户端 IP。如果您正在托管服务器,则连接将关闭并在新端口上恢复,从而释放公共端口。
只要端口保持打开状态,就无法建立新的连接,因此源将根据超时设置不断尝试,直到最终放弃并发生超时。
因此,基本上您要做的就是为路由器上的所有端口创建规则,以将数据转发到您的程序,并让您的程序打开连接,并将其转发到新 IP。这基本上意味着您自己创建一个路由器。因此,您的速度会变慢,如果操作不当,连接可能无法正常终止等。
基本上,您正在创建一个程序,您的路由器上的防火墙/端口转发规则很可能也可以执行该程序。