Linux内核是否根据IP地址分配空闲的TCP端口?

Linux内核是否根据IP地址分配空闲的TCP端口?

这是一个假设性问题,只是为了帮助我更多地了解 TCP 端口如何工作。

假设我的机器上有多个以太网卡,并且它们连接到不同的子网。现在,如果我想通过 TCP 连接到远程计算机,而不绑定本地地址/端口,内核将为我确定 IP 地址和端口。

我的理解是,内核会根据接口的主IP选择IP地址,其中接口是根据路由表选择的。

对于 TCP 端口部分,内核将为我找到一个未使用的(临时)端口。问题是,内核是否通过 IP 地址保留使用的 TCP 端口?意思是,如果我已经使用了端口a.b.c.d:12345(假设是接口 A 的 IP),现在数据包应该从接口 B 发出,我可以使用e.f.g.h:12345(假设是接口 B 的 IP)吗?

我可以想到任何一种方式的论据。由于已建立的 TCP 连接是由本地/远程 IP/端口 4 元组标识的,因此答案似乎是yes- 我可以再次使用端口12345。然而,在准备 TCP 层时,内核不知道路由信息(因此是接口,因此是源 IP),因此内核不可能在 TCP 层分配依赖于 IP 的空闲 TCP 端口。一直到IP层。

核函数inet_csk_get_port扫描hinfo->bhash表,仅使用端口号作为哈希键。这是否意味着临时端口是全球唯一的,如果这是真的,对于在 .我在这里错过了一些重要的事实吗?希望有人能帮我澄清这一点。谢谢!

相关内容