所以我认为我的问题很清楚。如果两个应用程序使用不同的传输层协议(例如 TCP 和 UDP 或其他协议),它们是否可以打开相同的端口号?
如果是这种情况,操作系统如何进行多路复用?
操作系统网络堆栈中可以有多少个传输协议?如果不同协议的数量是无限的,这是否意味着计算机基本上可以拥有无限的开放端口进行通信?
所以我认为我的问题很清楚。如果两个应用程序使用不同的传输层协议(例如 TCP 和 UDP 或其他协议),它们是否可以打开相同的端口号?
如果是这种情况,操作系统如何进行多路复用?
操作系统网络堆栈中可以有多少个传输协议?如果不同协议的数量是无限的,这是否意味着计算机基本上可以拥有无限的开放端口进行通信?
可以这样想:TCP是一条街道,UDP是另一条街道,端口号就是街道上的房屋(端口)的地址,就像它们是第4层地址一样。每条街道都有相同的房屋地址编号。一个应用程序可以搬进 TCP St. 80 号的房子,但是当另一个应用程序想要搬进同一个房子时,它发现房子已经有人住了,所以它不能搬进去。
另一方面,一个应用程序可以移动到 9876 TCP St.,另一个应用程序可以移动到 9876 UDP Ln。同时。操作系统不需要多路复用它,因为去往这些房屋的流量在不同的街道上行驶。
操作系统可以拥有的传输协议数量会有实际限制,但这会因操作系统而异。理论上,没有限制。某些传输层协议不使用端口等地址。
端口是 UDP 和 TCP 的单独参数,所以是的,它们是不同的。因为每个传输协议都有自己的堆栈,所以它们独立运行。
回答您的第二个问题,除非您试图保持在 OSI 或 TCP/IP 模型中,否则您不需要传输协议——或者您可以自己编写。您可以使用任何您喜欢的机制来复用连接。端口只是这样一种机制。
是的,不同的应用程序可以绑定到不同传输协议上的相同端口。它们还可以在相同协议但不同 IP 地址上打开相同端口。
当数据包工作时,它会在处理链的上游查看各种信息。
假设一个包含包含 UDP 数据报的 IP 数据包的帧进入以太网卡。
首先,主机将查看目标 MAC 地址,以查看它是否与自己的地址或适当的广播或多播地址匹配。第一级检查通常在硬件中实现。
然后它需要确定它正在处理什么类型的以太网帧(由于历史原因,有几种)。
然后它需要确定将帧传递到哪个网络层协议。对于“以太网 II”帧(最常见的类型),这由“ethertype”字段确定。
假设我们的帧代表一个 IP 数据包,那么它需要确定它是否以属于本地机器的 IP 地址为目的地。
假设它的目的地是本地机器,那么它将需要查看协议号并将其传递给 UDP 实现。
最后,它需要将 IP 地址和端口与它的套接字表进行比较,以确定将数据报传递到哪个套接字。
IP 下可能的传输协议的数量受协议字段大小的限制。类似地,“以太网 II”帧的可能网络层协议的数量受可用以太网类型值范围的限制。
此外,使用新的传输协议并不是绕过端口数限制的好方法。许多防火墙和 NAT 无法正确理解 TCP/UDP/ICMP 以外的协议。