不允许两个套接字使用同一个端口吗?

Are two sockets not allowed to use the same port?

  1. 当同一主机上的两个进程使用网络进行通信时 套接字,它们的套接字必须使用不同的端口吗?

    我认为是的,因为套接字是由IP地址和端口标识的 数字。如果进程的套接字使用相同的端口,那么它 无法区分它们的插座,对吗?

    但是一个主机可以有多个网络接口,所以有多个 IP 地址。同一台主机上的多个网络接口是否可以共享一个端口,使两个套接字共享同一个端口?

  2. 例如SSH本地端口转发由选项指定:

    -L [bind_address:]port:host:hostport
    

    然后是本地主机上的进程(例如 Firefox)(其中 SSH 客户端 运行) 附加到 port

    • SSH 客户端是否创建一个新的套接字并将 port 作为套接字的端口?

    • port是属于SSH客户端的socket,还是属于socket 进程的(例如 Firefox),或两者(即 SSH 客户端和 Firefox 进程的 socket 使用同一个端口 port)?

评论链接的话题没有解决我的问题(至少没有直接解决)。

你必须区分TCP和UDP。 TCP 是面向连接的,UDP 不是。

当你想接收任何东西时,你通常将套接字绑定到 IN_ADDRANY 和特定端口。对于 TCP,您将进行监听,而对于 UDP,您将进行接收。

将使用最具体的东西进行匹配。因为您也可以绑定到特定的 IP 地址。在这种情况下,将检查传入消息的目标 IP 地址和端口。如果有人正在监听该 ip 地址和该端口(recfrom 或 listen),那么将使用该套接字。如果没有找到特定的,则使用 IN_ADDRANY 来查找匹配项。 如果你总是绑定到 IN_ADDRANY 你不能有 2 个 UDP 套接字做一个 recfrom 套接字绑定到同一个端口,你也不能在同一个端口上有一个侦听 TCP 套接字。

对于 UDP,讨论到此结束。

对于 TCP,事情要复杂得多。 您从端口 A 上的侦听套接字开始。此时系统上只有一个套接字使用端口 A。 现在连接由正在连接的客户端建立。侦听套接字被克隆到接受中返回的服务套接字中。那个套接字没有处于监听状态!!!但它仍在使用端口A。 因为它不是监听套接字,TCP 不会使用它来匹配传入的连接请求,为此它仅使用监听套接字。为了匹配传入数据,它使用连接对的概念。这是您自己的 ip 地址和端口,在本例中为 A,以及源 ip 地址和端口。这4个参数唯一标识连接,这与上面的答案似乎声称套接字由5个参数唯一标识,它实际上是由4个参数标识的TCP连接。 因此,在建立连接后,您的系统上基本上有 2 个套接字,它们都使用端口 A。一个侦听套接字和一个服务套接字。 建立的连接越多,分配的服务套接字就越多,使用同一端口的套接字也就越多。当然,如果连接关闭,它们就会再次消失。

我希望这能澄清一些事情。结论是 TCP 连接由 4 个参数标识,而侦听 TCP 套接字仅由 2 个参数标识。TCP 连接彼此完全隔离,当然也与侦听套接字隔离,这个仅用于建立连接和处理第一个 TCP SYN 消息。

对于冗长的回答和复杂性,我们深表歉意。看懂了其实很简单

Does the SSH client create a new socket with port as the socket's port?

不,不是,客户端连接到众所周知的服务器端口,但使用临时端口。除非客户端也将套接字绑定到众所周知的端口,但这不是正常情况。

Does port belong to the socket of the SSH client, or to the socket of the process (e.g. Firefox), or both (i.e. both the socket of the SSH client and the socket of Firefox process use the same port port)?

临时端口属于客户端,众所周知的 ssh 端口属于服务器进程。

服务器和客户端之间的TCP连接由套接字对标识。这一对的一端在客户端计算机上,另一端在服务器计算机上。

还有哪些其他问题我此时没有解决?