据我所知,截至 2018 年,65535 个可用端口中至少有一个所谓的“端口协议”;我知道 2 种这样的协议;TCP 和 UDP,其中 TCP 是主要使用的协议。
如果我没错的话,这些端口是操作系统的一部分,而不是计算机主板的端口,我问自己,例如,如果有人在 Windows 10 上安装 Ubuntu-WSL,或者甚至在 VirtualBox 上安装整个操作系统(如 VirtualBox-Ubuntu),WSL 或这个 Ubuntu 是否有额外的 65535 个可用端口?
注意:有些人简称这些协议为“protos”(如 Ansible YAML 语法)。
答案1
你的思路是对的 -港口从这个意义上讲,它不是指你插入某物的物理硬件——它是 TCP 和 UDP 网络协议的某个部分的名称。为了避免与硬件端口混淆,你可以使用术语TCP 端口或者UDP 端口(UDP 也有端口)。
大多数计算机网络都涉及共享单一通信介质。最初的以太网网络通过单根线路进行物理连接,无线网络仍采用类似的原理 - 特定信道上的所有无线设备必须共享同一空中资源。
但您可能还想让多个程序使用一种通信媒介。例如,您可能想同时运行 Web 浏览器(HTTP 端口 80)和电子邮件客户端(SMTP 端口 25)。
TCP 或 UDP 端口的概念允许系统上的多个程序使用相同的介质。
想要通信的程序要求 TCP 为其提供一个空闲的端口号
想要接收连接的程序告诉 TCP 它将使用哪个端口号
TCP 将通信分成多个段。它在段中包含端口号。
因此,您可以在同一个系统上使用多个程序来发送和接收数据,而端口号就是将数据与通过有线或通信介质发送的单个流分开的方式。
因此,您不需要为想要通过网络通信的每个程序配备单独的 NIC。
端口与进程相关联,因此它们是“每个系统”的资源。您不能让 2 个进程同时在同一个端口上监听或接收 - 但您可以让 2 个进程使用不同的端口来源与同一端口通信目的地端口——这是一个在给定的其他端口上监听的进程。
原始缩写协议是 和其他程序所特有的ufw
。
答案2
网络端口不是硬件,它们只是软件标签,用于让网络堆栈将网络流量引导到适当的应用程序。任何运行自己的网络堆栈(因此具有自己的 IP 地址)的操作系统都将拥有自己的网络端口,无论它是否在虚拟机中运行。
答案3
主板的端口是 I/O 物理电缆的物理插座。
TCP 或 UDP 端口号只是一个 ID 号,充当隐喻的可以向其发送众多数据包流之一的容器。系统上想要从网络接收 TCP 数据包的每个进程(应用程序)都必须向操作系统请求使用端口号,从那时起,如果操作系统收到发往该端口号的数据包,它会将该数据包数据传递给拥有该端口号的进程。
网络被设计为独立层的堆栈,每层都有不同的协议。每层的协议都会在每个数据包的前面放置自己的标头,并且每层的标头都有某种数字 ID 字段(通常是 16 位无符号整数),让接收端知道下一层协议是什么,这样数据包就可以传递给正确的代码来处理下一个协议。
传统的“以太网 II”样式以太网报头有一个“以太网类型”字段,表示下一个协议是什么。以太网类型 0x0800 表示此以太网帧包含 IP 数据报。
IP 报头有一个“协议”字段,表示需要哪种传输层协议来处理此 IP 数据报的内容。值为 6 表示 TCP,值为 17 表示 UDP。
TCP 和 UDP 恰好都使用相同的端口号模型。它们都具有 UInt16 源端口和 UInt16 目标端口。TCP 和 UDP 端口号非常灵活,可以映射到不同的协议。但是有一些严格的约定,因此往返于 TCP 端口 80 的流量很可能是 HTTP(或其他试图伪装成 HTTP 以尝试通过代理和防火墙的协议)。
我想你一定接触过一些将 IP 协议号与 TCP/UDP 端口号混为一谈的软件。尽管 IP 协议号在 IP 层的作用与 TCP/UDP 端口号在传输层的作用类似,但它们仍然是不同层上的独立概念,不应混为一谈。
答案4
端口(例如 1-65535)和协议(包括 tcp、udp、icmp 和其他一些不太知名的协议)在 Internet 标准中定义,并由操作系统作为网络堆栈实现。(实际上可以有多个堆栈,例如 ipv4 和 ipv6 有不同的堆栈)
在多个操作系统/虚拟化的情况下,每个操作系统都可以使用自己的堆栈 - 只要堆栈可以访问底层接口即可。+如果是虚拟化系统,则虚拟机需要虚拟或实际接口 - 通常是由主机软件桥接或路由的网卡或虚拟网卡。在桥接接口的情况下,操作系统上的 IP 堆栈将被忽略,因为桥接发生在较低级别,而在路由配置的情况下,数据包也由主机处理)