端口如何暴露在网络中?

网络工程 传输协议
2022-02-08 21:36:29

当您注册某个服务器的端口时,无论它是应用程序、Web 还是其他东西 - 该端口究竟在哪里注册?

我了解端口的工作原理,因为一旦数据包到达 IP 地址(对于发送方和接收方),它们本质上就是应用程序的路标。

到目前为止,我还没有遇到这些路标所在的位置。我的假设是操作系统有一个最多 65535 个不同端口的查找表,并且当设置服务器时,软件会告诉操作系统 - “嘿,将我的数据包发送到路标 250”。我的理由是,由于有一个保留端口列表,操作系统必须以某种方式跟踪这些端口,并且在服务器注册时将任何非保留端口添加到此表中。

这个假设正确吗?在哪里处理传入数据包的目标端口和在服务器上接收数据包?

2个回答

是的,操作系统包含将协议地址:端口与程序使用的套接字相关联的数据结构。当程序发出bind()connect()或某些其他系统调用时,操作系统会生成可以简化为表条目的内容。

这发生在侦听端口(如 Web 服务器)以及传出连接使用的端口上。

您的操作系统可能允许您列出系统上当前正在使用的端口。在类 unix 系统(包括 macOS)上,命令是netstat,例如:

jsw@boomer ~ % netstat -n
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  172.19.87.187.60920    18.234.32.175.443      ESTABLISHED
tcp4       0      0  172.19.87.187.60919    54.211.89.16.443       ESTABLISHED
tcp4       0      0  172.19.87.187.60918    172.217.7.133.443      ESTABLISHED
tcp4       0      0  172.19.87.187.60917    172.217.7.133.443      ESTABLISHED

软件可以监听tcp 0.0.0.0:80以接收到达端口 80 的任何连接。或者,它可以监听特定的 IP 地址,例如,192.0.2.1:80它不会接收到系统上其他 IP 的连接。

Stack Exchange 的服务器故障或其他以系统为中心的部分可能是获取有关此主题的更深入信息的更好资源。

您正在谈论使用端口进行主机子寻址的 TCP 和 UDP 等传输层 (L4) 协议。

这些端口是它们各自的 L4 协议的属性,该协议通常是网络“堆栈”的一部分,又是操作系统的一部分。

不同的层和协议是模块化的,因此 TCP 端口的实际表位于 TCP 协议实现(“处理程序”)中。同样,UDP 端口由 UDP 协议处理程序管理。所有这些处理程序及其底层网络层 (L3) 协议(最突出的是 IPv4 和 IPv6)形成了一个“堆栈”。

当网络接口接收到以太网帧时,会检查其 Ethertype 以了解有效负载属于哪个 L3 协议 - IPv4、IPv6、IPX ......并将有效负载传递给适当的协议处理程序。该处理程序检查由 IP 的协议字段指示的传输层协议,并传递有效负载。然后该 L4 协议检查端口号并将其有效负载传递给拥有进程。

(我在简化,实际情况要复杂一些,当然,以太网和 TCP/IP 的替代方案可能会有所不同。)