在使用 PHP 开发服务器时,我偶然发现我的环回 IP 后面有一个奇怪的递增端口号,我对此并不熟悉,而且在网上也找不到有关它的信息。
$ php -S 127.0.0.1:3000
记录如下请求:
[Tue Aug 17 16:18:19 2021] 127.0.0.1:65533 [200]: GET /
[Tue Aug 17 16:18:19 2021] 127.0.0.1:65533 Closing
[Tue Aug 17 16:18:19 2021] 127.0.0.1:49152 Accepted
[Tue Aug 17 16:18:19 2021] 127.0.0.1:65534 [200]: GET /
[Tue Aug 17 16:18:19 2021] 127.0.0.1:65534 Closing
[Tue Aug 17 16:18:19 2021] 127.0.0.1:65535 Accepted
[Tue Aug 17 16:18:19 2021] 127.0.0.1:49152 [200]: GET /
[Tue Aug 17 16:18:19 2021] 127.0.0.1:49152 Closing
[Tue Aug 17 16:18:19 2021] 127.0.0.1:49153 Accepted
起初我以为这个递增的端口代表一个隐藏日志文件中的行号,我试图找到它但没有成功——你可以说我笨;)
然后,尝试通过向该计数器发送垃圾邮件来溢出后,hey
我注意到它在 65535 上溢出,这告诉我它是某种 16 位整数。
你能向我解释一下这个端口号代表什么吗/为什么 php 首先显示这个数字? - 我有 JavaScript 前端背景,所以我不太熟悉这个 TCP 魔法是如何工作的,也从未在 Express/Fastify 应用程序日志中见过它。
答案1
你能向我解释一下这个端口号代表什么吗
如果您对 TCP/IP 比较熟悉,您就会知道计算机是通过 IP 地址来指代的。现在,当数据包进入时,计算机如何知道应该将数据包转发到哪个程序?这就是端口的作用所在。
端口范围从 1 到 65535,分为三类:
- 众所周知的 0-1023 ( 、、、
80 -> HTTP
等等...)443 -> HTTPS
53 -> DNS
- 注册号 1024-49151 (
1194 -> OpenVPN
,2195 -> Apple push notifications
, 等等...) - 动态/私有 49152–65535
如果您正在运行服务(例如 Web 服务器),您将监听众所周知的端口 80 和/或 443。这样,所有用户都可以通过标准化的方式访问您的服务。
如果您是用户,并且您导航到google.com
,您的操作系统将从动态/私有范围中选择一个端口,用作与 Google 的网络服务器通信时的源端口。此端口不需要众所周知或已注册,因为客户端是发起连接的一方,并会告诉网络服务器他们应该在哪个端口上进行通信。当 Google 发送响应时,他们会将 TCP/IP 数据包发送到客户端使用的端口,因此客户端的操作系统会知道将该数据包转发到正确的浏览器选项卡。
为什么 php 首先向我显示这个数字?
在许多情况下,查看客户端端口号可能会有所帮助并提供信息。
假设有另一个服务查询您的 Web 服务器,并且该服务器在端口 5000 上运行。您可以在日志中搜索客户端端口 5000 以查看来自该服务的请求日志。
或者如果有人正在扫描您的网站,他们通常会使用一个启动多个线程的工具,每个线程都有一个唯一的端口。当您查看日志时,您会看到来自同一 IP 但来自多个端口的大量流量,这显然表明您正在使用某种工具进行扫描。