当同一主机上的两个进程使用网络进行通信时 套接字,他们的套接字应该使用不同的端口吗?
我认为是的,因为套接字是通过IP地址和端口来标识的 数字。如果进程的套接字使用相同的端口,那么它 不可能区分它们的套接字,对吗?
但是一台主机可以有多个网络接口,因此可以有多个 IP 地址。同一主机上的多个网络接口是否可以共享一个端口,以便两个套接字共享同一个端口?
例如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 套接字使用绑定到同一端口的套接字进行记录,也不能在同一端口上有一个侦听 TCP 套接字。
对于 UDP,讨论到此结束。
对于 TCP 来说,事情要复杂得多。 首先,您从端口 A 上的侦听套接字开始。此时系统上只有一个套接字使用端口 A。 现在,正在连接的客户端已建立连接。侦听套接字被克隆到在accept 中返回的服务套接字中。该套接字未处于监听状态!但它仍在使用端口 A。 因为它不是侦听套接字,所以 TCP 不会使用它来匹配传入的连接请求,为此它仅使用侦听套接字。为了匹配传入数据,它使用连接对的概念。其中是您自己的 ip 地址和端口(在本例中为 A)以及源 ip 地址和端口。这4个参数唯一标识连接,这与上面的答案有很大不同,上面似乎声称套接字由5个参数唯一标识,实际上是由4个参数标识的TCP连接。 因此,连接后,系统上基本上有 2 个套接字,它们都使用端口 A。一个侦听套接字和一个服务套接字。 建立的连接越多,分配的服务套接字就越多,并且使用同一端口的套接字也就越多。当然,如果连接关闭,它们就会再次消失。
我希望这能澄清一些事情。结论是,TCP连接由4个参数标识,而监听TCP套接字仅由2个参数标识。TCP连接彼此完全隔离,当然与监听套接字也完全隔离,这个仅用于建立连接和处理第一个 TCP SYN 消息。
对于冗长的答案和复杂性感到抱歉。一旦你理解了它就非常简单了。
SSH 客户端是否创建一个新的套接字,并将 port 作为套接字的端口?
不,不是,客户端连接到众所周知的服务器端口,但使用临时端口。除非客户端也将套接字绑定到众所周知的端口,但这不是正常情况。
端口是属于 SSH 客户端的套接字,还是属于进程的套接字(例如 Firefox),还是两者(即 SSH 客户端的套接字和 Firefox 进程的套接字都使用相同的端口)?
临时端口属于客户端,众所周知的 ssh 端口属于服务器进程。
服务器和客户端之间的TCP连接是通过套接字对来标识的。该对的一端位于客户端计算机上,另一端位于服务器计算机上。
此时我还没有解决哪些其他问题?