这是一个假设性问题,只是为了帮助我更多地了解 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
表,仅使用端口号作为哈希键。这是否意味着临时端口是全球唯一的,如果这是真的,对于在 .我在这里错过了一些重要的事实吗?希望有人能帮我澄清这一点。谢谢!