在研究某事时,我经常尝试根据我获取的信息得出自己的结论。我试图回答我自己的问题,但只是想澄清一下。
需要端口,以便来自不同来源的不同应用程序的流量可以同时到达同一主机。例如,一个端口(端口 80)上的 http 流量和另一个(端口 23)上的 telnet 流量。当一台主机有多个特定类型流量的来源时,就会为该流量创建一个新端口,该端口仅链接到该主机。
对?错误的?
在研究某事时,我经常尝试根据我获取的信息得出自己的结论。我试图回答我自己的问题,但只是想澄清一下。
需要端口,以便来自不同来源的不同应用程序的流量可以同时到达同一主机。例如,一个端口(端口 80)上的 http 流量和另一个(端口 23)上的 telnet 流量。当一台主机有多个特定类型流量的来源时,就会为该流量创建一个新端口,该端口仅链接到该主机。
对?错误的?
最简单的解释是端口标识接收到的流量应该发送到主机上的哪个进程。一台计算机可以有多个同时连接,所有连接都接收该计算机上不同进程(邮件、Web、数据库等)的数据。计算机如何判断哪些数据去了哪里?
当计算机接收数据时,端口信息允许它把数据交给正确的进程。比如80端口的数据应该去http进程。端口 25 的数据应该进入邮件进程,依此类推。
换句话说,IP 地址标识计算机主机,端口号指定在该主机上运行的特定进程。这就像街道地址标识了一座建筑物,而房间号则标识了一个特定的公寓或办公室。
这里的关键字是socket。
套接字是网络上运行的两个程序之间双向通信链路的一个端点。套接字绑定到端口号,以便 TCP 层可以识别数据要发送到的应用程序。
在大多数操作系统上,SOCKETS由一个数字标识,类似于文件描述符,该数字将单个条目索引到包含有关连接的信息的表中。此信息通常采用以下格式:
SOURCEIP:SOURCEPORT DESTINATIONIP:DESTINATIONPORT PROTOCOL STATE
在大多数操作系统上,通常可以通过 NETSTAT 命令(或其等效命令)访问该表。在任何情况下,此类表上都不能有两个具有相同值的条目(换句话说:两个条目同时具有完全相同的 sourceip、sourceport、destinationip、destinationport 和协议)。您可以有两个具有相同目标端口、源端口等的条目,任何值,但不能在两个或多个条目上使用完全相同的值。并且每个条目都由单个套接字编号索引(标识)。(此规则有例外)
当您发出 SOCKET() 函数调用时,将返回此套接字编号。(在 linux/freebsd/windows 上)。稍后,您的程序将决定如何处理从操作系统请求的套接字。它可以发出 CONNECT() 调用并将此套接字连接到远程机器或 BIND() 和 LISTEN() 调用以使用它来等待入站连接。
这意味着两个进程可以共享一个端口,如果它们碰巧共享与该端口关联的 SOCKET。这甚至是进行网络编程的常用方法。当您的侦听套接字收到连接请求并调用 ACCEPT() 接受它时,您可以派生或生成另一个进程。ACCEPT() 将返回一个套接字编号,该编号将标识为该传入连接创建的新 SOCKET,然后您将把 socketnum 传递给衍生/分叉的进程。
例如在 Windows 上:
引入了 WSADuplicateSocket 函数以启用跨进程的套接字共享。源进程调用 WSADuplicateSocket 来获取目标进程标识符的特殊 WSAPROTOCOL_INFO 结构。它使用一些进程间通信 (IPC) 机制将此结构的内容传递给目标进程。然后目标进程在调用 WSPSocket 时使用 WSAPROTOCOL_INFO 结构。此函数返回的套接字描述符将是底层套接字的附加套接字描述符,从而成为共享。套接字可以在给定进程中的线程之间共享,而无需使用 WSADuplicateSocket 函数,因为套接字描述符在进程的所有线程中都是有效的。
换句话说,端口用于帮助识别计算机上的SOCKETS,它们是网络上两台主机之间的单一连接。这对于 TCP 和 UDP 协议都是如此。它们通常不会识别进程,如果两个进程在同一个端口上运行,大多数操作系统不会打扰。这里的关键字是SOCKET,而不是 process。套接字是必须唯一的东西,因为它们标识了两个主机之间的唯一连接。
所以,回答你的问题。为什么需要端口?
因为如果没有端口,我在文本开头提到的表格将仅限于:
SOURCEIP DESTINATIONIP PROTOCOL STATE
换句话说,您的计算机可以访问的每个主机只能有一个 SOCKET,这根本不是很有用。