Menu Close

什么是网络端口?

你的电脑可以同时打开网站、接收邮件、下载文件,还能参加视频会议。这些活动可能共用一条网络连接。那么,数据究竟是怎样准确到达对应应用的呢?

什么是网络端口?

网络端口就是其中一部分答案。IP 地址帮助数据到达目的地,而端口帮助操作系统把数据交给对应的通信端点。

本文围绕三个问题展开:端口标识的是什么,连接怎样使用端口,以及如何观察一个真实端口的工作过程。

第一章。什么是网络端口?

网络端口(Network Port)是 TCP、UDP 等传输协议使用的一种数字标识。它是一个软件概念,不是 USB 插口或以太网插口那样的物理接口。

应用程序通过操作系统中一种叫作套接字(Socket)的对象进行通信。对于互联网套接字,传输协议、IP 地址和端口号等信息,可以帮助操作系统把网络流量交给对应的端点。

你可以把 IP 地址理解为帮助确定目标大楼的地址。端口则帮助区分这栋大楼内部的通信端点。这个比喻有助于理解,但端口并不是永久分配给某一个特定应用的。

网页服务器可以通过 TCP 的 443 号端口接受 HTTPS 连接,而 SSH 服务可以通过 TCP 的 22 号端口接受远程管理连接。这两个服务可以运行在同一台电脑上,共用它的 IP 地址。

TCP 和 UDP 的端口号都是 16 位数值,范围从 0 到 65535。因此,每种协议都有 65,536 个可能的端口号取值。

0 号端口是保留端口,不作为普通服务端口使用。当程序请求操作系统绑定 0 号端口时,通常表示:请替我选择一个可用的本地端口。

默认端口的分配是一种约定。要知道某个端口实际由什么服务使用,你需要检查相关软件及其配置。

第二章。IP 地址、端口和域名。

IP 地址用于在特定的寻址环境中标识网络接口或端点。一个设备可以有多个地址。多个设备也可以通过路由器共用一个公网地址。

IP 地址用于寻址和路由。它不会直接指示路由器去寻找某个国家或城市。地理位置的估算来自独立的地理定位服务,而且这些估算也可能出错。

例如,192.0.2.10:443 表示 IP 地址为 192.0.2.10、端口号为 443 的端点。地址和端口之间用冒号隔开。这个地址是专门保留给文档示例使用的,因此它只是一个例子,并不是我们要连接的服务器。

IPv6 地址本身就包含冒号。当 IPv6 地址采用这种格式与端口一起显示时,需要用方括号把地址括起来,以便区分地址和端口这两个部分,例如 [2001:db8::10]:443。

域名提供了一个方便人们阅读的名称,让我们不必直接使用数字地址。DNS 可以把这个名称解析成 IPv4 或 IPv6 地址。网址中的协议方案通常决定默认端口:HTTP 默认使用 80 号端口,HTTPS 默认使用 443 号端口。

如果明确指定了端口,就会覆盖默认值。例如,一个本地 HTTP 地址如果以 :8000 结尾,就是告诉客户端使用 8000 号端口。

DNS 解析完成后,主机名仍然很重要。一台托管服务器可以通过同一个 IP 地址和端口提供多个网站,并根据请求中的主机名选择对应的网站。

第三章。TCP 和 UDP 各有独立的端口。

只知道端口号,而不知道它使用的传输协议,信息是不完整的。TCP 的 443 号端口和 UDP 的 443 号端口,虽然数字相同,但它们是不同的端点。

TCP(传输控制协议)会建立连接,并提供可靠、有序的字节流传输。当数据丢失时,只要连接仍然能够继续工作,TCP 就会处理重传。SSH 和许多网页连接都使用 TCP。

UDP(用户数据报协议)发送的是一个个独立的消息,称为数据报。UDP 本身不会建立 TCP 那样的连接,也不保证数据一定送达或按顺序到达。应用程序可以在它的上层加入自己需要的机制。

现代网页流量让这种区别变得尤其重要。HTTP/1.1 和 HTTP/2 的 HTTPS 通信,通常通过 TCP 传输,并由 TLS 加密提供保护。

HTTP/3 使用运行在 UDP 之上的 QUIC,通常使用 443 号端口。QUIC 在 UDP 之上提供安全连接和可靠的数据流。

因此,使用 UDP 并不意味着应用一定不可靠。同样,使用 HTTPS 也不一定意味着使用 TCP。

这也会影响防火墙规则。允许 TCP 的 443 号端口,并不等于同时允许 UDP 的 443 号端口。规则必须涵盖应用实际使用的传输协议。

第四章。一条连接的两端都使用端口。

假设你的浏览器正在通过 TCP 连接一个网站。服务器通过 443 号端口接受 HTTPS 连接。你的操作系统则会选择一个临时的本地端口,例如 53024 号端口。

对于发出的流量,源端口是客户端的临时端口,目标端口是服务器的 443 号端口。对于返回的流量,这两个角色正好反过来。

客户端使用的这种临时端口,英文叫作 ephemeral port。客户端不需要在本地使用与服务器相同的端口号。

一条 TCP 连接由本地和远程两端的 IP 地址及端口来标识。如果再加上传输协议,用来描述一条网络数据流,就一共有五项信息。这种组合通常称为五元组:源 IP 地址、源端口、目标 IP 地址、目标端口和传输协议。

这解释了为什么一台网页服务器可以通过 443 号端口,同时处理大量连接。因为这些连接具有不同的客户端地址和端口组合。

这也解释了为什么数一数浏览器标签页,并不能知道实际使用了多少端口或连接。浏览器可以让多个请求共用一条连接,而一个网页也可能联系多个服务。

第五章。端口号范围与常见服务。

互联网号码分配机构(IANA)负责维护服务名称和端口号注册表。它把端口号划分为三个范围。

系统端口,也叫知名端口,范围从 0 到 1023。其中包括 SSH 使用的 22 号端口,以及 HTTPS 使用的 443 号端口。0 号端口是保留端口。

用户端口,也叫注册端口,范围从 1024 到 49151。例如,MySQL 使用 TCP 的 3306 号端口,PostgreSQL 使用 TCP 的 5432 号端口。

动态端口或私有端口,范围从 49152 到 65535。注册表不会从这个范围内为具体服务分配端口。

这些分类描述的是注册范围,并不是严格区分服务器和客户端的规则。服务器可以监听较大的端口号,而操作系统在选择客户端临时端口时,也可以使用不同的范围。

你不需要记住每一种服务的端口。先从几个熟悉的例子开始就可以。

SSH 使用 TCP 的 22 号端口,SFTP 则运行在 SSH 之上。FTP 的控制连接通常使用 TCP 的 21 号端口,文件数据则通过另外的连接传输。FTP 和 SFTP 是两种不同的协议。

邮件服务器之间交换邮件,通常使用 TCP 的 25 号端口。提交邮件通常使用 587 号端口并配合 STARTTLS,或者使用 465 号端口并配合隐式 TLS。加密的 IMAP 邮箱访问通常使用 993 号端口。

传统 DNS 同时使用 UDP 和 TCP 的 53 号端口。HTTP 通常使用 TCP 的 80 号端口。HTTPS 通常使用 TCP 的 443 号端口;如果是通过 QUIC 传输的 HTTP/3,则使用 UDP 的 443 号端口。

这些端口号是有用的线索,但不能证明连接中传输的具体内容。服务可以被配置到其他端口,而不同的应用也可以使用一个常见的端口号。

第六章。打开 HTTPS 网站时,会发生什么?

假设我们要新建一条到 HTTPS 网站的连接,而且没有可以复用的现有连接。

首先,浏览器获取主机名对应的地址,这一步可能会使用缓存中的 DNS 信息。然后,浏览器连接选定的端点,通常使用 443 号目标端口,以及自动选择的本地端口。

对于通过 TCP 传输的 HTTPS,客户端先建立 TCP 连接,再进行 TLS 握手。证书验证帮助确认服务器身份,握手过程则建立加密密钥。随后,浏览器通过这条受到保护的连接发送 HTTP 请求。

对于 HTTP/3,浏览器则会在 UDP 之上建立 QUIC 连接。TLS 1.3 被整合进连接建立过程。应用层交换的仍然是 HTTP 请求和响应。

你的电脑看到的服务器,可能属于内容分发网络,也可能是一台反向代理服务器。它可能还会在后台与另一台服务器通信。你看到的地址,不一定属于存储网站原始内容的那台机器。

最后,443 号端口本身不会产生加密。安全性取决于所用协议、证书验证,以及正确的实现方式。即使是欺诈网站,也可能拥有有效的 HTTPS。

第七章。在 Windows 上查看端口。

Windows 可以使用 netstat 查看本地端点与连接。打开 PowerShell,输入以下命令:

netstat -ano

其中,-a 显示所有连接和监听端点,-n 以数字形式显示地址与端口,-o 显示关联的进程标识符 PID。

输出中的 Local Address 是本地地址,表示电脑这一端的端点;Foreign Address 是外部地址,表示另一端的端点。对于 TCP 条目,State 列显示连接状态,最后的 PID 列标识对应进程。

LISTENING 表示服务正在本地端点上等待传入连接。ESTABLISHED 表示 TCP 连接已经建立。TIME_WAIT 是与关闭连接有关的一种正常临时状态,不一定意味着出现错误。

要确定哪个程序正在使用端口,可以记下一条监听记录的 PID,然后打开任务管理器的“详细信息”选项卡,在 PID 列中找到对应数字,即可查看进程名称,无需停止进程。

PowerShell 还提供了分别查看 TCP 连接和 UDP 端点的命令:

Get-NetTCPConnection

Get-NetUDPEndpoint

UDP 不使用 TCP 的 LISTENING 和 ESTABLISHED 状态模型,查看结果时应区分两种协议。

端口列表只是某一时刻的快照。并不是每个网站都会显示为 TCP 80 端口上的连接:浏览器可能使用 HTTPS、HTTP/3 或多个远程地址,一些连接也可能在查看之前就已关闭。

第八章。在 Linux 上查看端口。

在 Linux 上,ss 是查看套接字的常用工具,可以显示 TCP 监听套接字、已经建立的连接,以及 UDP 端点。

查看正在监听的 TCP 套接字和相关进程,可以运行:

ss -lntp

其中,-l 只显示监听套接字,-n 使用数字形式显示地址和端口,-t 选择 TCP,-p 请求显示关联的进程信息。

查看所有 TCP 套接字,可以运行 ss -tan;查看 UDP 监听端点,可以运行 ss -lun。

查看其他用户所拥有的进程信息,可能需要管理员权限。没有显示进程详情,并不一定意味着没有应用正在使用该端口。

除了端口号,还应注意绑定的本地地址。127.0.0.1 是 IPv4 回环地址,绑定到这里的服务可以在同一个网络环境内通过回环访问。

0.0.0.0 表示 IPv4 通配绑定,意味着监听服务可以接受发往系统本地 IPv4 接口的流量,但仍受防火墙和路由规则限制,并不自动意味着它可以从互联网访问。

对于 IPv6,::1 表示回环地址,:: 表示通配绑定。

在适用于 Linux 的 Windows 子系统(WSL)中,这些命令查看的是 Linux 网络环境。Windows 有自己的网络视图,因此两者显示的结果不一定相同。

第九章。试着在八千号端口上运行本地网页服务器。

通过一个小实验,可以直接观察监听端口如何出现和消失。实验使用 Ubuntu 或 WSL 中的 Ubuntu,并假设已经安装 Python 3 和 curl。

首先,打开 Ubuntu 终端,创建并进入一个专门用于练习的文件夹,依次运行:

mkdir -p ~/port-practice

cd ~/port-practice

创建一个简单网页,把问候语写入 index.html 文件:

echo ‘Hello from port 8000’ > index.html

启动 Python 的 HTTP 服务器,使用 8000 端口,并绑定到 IPv4 回环地址:

python3 -m http.server 8000 –bind 127.0.0.1

–bind 前面是两个普通连字符。服务器启动后,保持这个终端打开。终端持续被占用,表示服务器正在前台运行,这是正常现象。

在同一个 Linux 环境中打开第二个终端,运行:

ss -lntp

找到本地地址为 127.0.0.1:8000 的条目。LISTEN 状态表示服务器正在等待 TCP 连接,而冒号前面的地址说明它绑定到了 IPv4 回环地址。

接着,在第二个终端中发出 HTTP 请求:

curl http://127.0.0.1:8000

终端应显示 Hello from port 8000。回到服务器终端,还可以看到对应的请求日志。这说明客户端联系了端口,服务器接收了 HTTP 请求,并返回了响应。

这个实验使用的是 8000 端口上的 HTTP,而不是通常的 80 端口。网址中明确指定的 :8000 告诉 curl 应该连接哪个端口。在同一个 Linux 环境中运行 curl,也避免了依赖从 Windows 浏览器访问 WSL 服务时的转发机制。

最后,在服务器终端按 Ctrl+C 停止服务,再回到第二个终端运行 ss -lntp。此时,127.0.0.1:8000 对应的监听条目应当消失。

客户端连接可能持续得很短,因此不一定能在套接字列表中及时捕捉到它。但只要服务器仍在运行,监听套接字就会持续存在。

Python 的简易 HTTP 服务器适合本地学习和测试,不适合直接用于正式的生产环境网站托管。

第十章。监听端口、防火墙和端口转发。

一个服务在本地监听,并不一定意味着它可以从互联网访问。能否访问,还取决于绑定地址、主机防火墙、网络防火墙、路由,以及路径上可能存在的地址转换。

防火墙根据规则允许或阻止流量。放行 TCP 的 8000 号端口,并不会启动服务器。必须真的有一个应用在那里监听。

家用路由器通常使用网络地址转换,也就是 NAT,让多个设备共用一个公网 IPv4 地址。它们会跟踪发出的流量,并且通常会转换源端口,让返回的数据能够到达正确的内部设备。

端口转发会为传入流量建立映射。例如,路由器可以把公网 TCP 的 8080 号端口,转发到内部某台电脑的 TCP 8000 号端口。外部端口号和内部端口号不必相同。

本地练习不需要端口转发。

排查问题时,要确认应用是否正在运行,使用的是 TCP 还是 UDP,绑定了哪个地址和端口,以及网络路径是否允许访问。

TCP 连接被拒绝,通常表示没有服务在监听,或者有某个环节主动拒绝了连接。连接超时则可能由流量过滤、路由问题,或者目标主机不可用引起。

把服务移到一个不常见的端口,并不能代替身份验证、软件更新、加密或访问控制。真正重要的是,暴露了什么服务,以及谁能够访问它。

结论。

端口帮助操作系统把网络流量交给正确的通信端点。要理解一条连接,需要同时考虑传输协议、两端的 IP 地址,以及两端的端口号。

TCP 和 UDP 各有独立的端口。HTTPS 通常使用 443 号端口,但 HTTP/3 运行在 QUIC 和 UDP 之上。客户端临时端口则根据操作系统的策略来选择。

通过 netstat 和 ss 查看端点、根据 PID 查找进程,以及启动和停止本地网页服务器,可以把抽象的端口概念与真实的网络行为联系起来。

掌握这些基础之后,网站托管、远程访问、防火墙,以及网络故障排查,就更容易理解了。

Posted in 家庭生活