当同一主机上的两个进程使用网络进行通信时 套接字,它们的套接字是否必须使用不同的端口?
我想是的,因为套接字是由IP地址和端口标识的 数。如果进程的套接字使用相同的端口,那么它 是不是可以区分他们的插座,对吗?
但主机可以有多个网络接口,因此有多个IP地址。同一主机上的多个网络接口是否可以共享一个端口,以便两个套接字共享同一个端口?
例如,SSH本地端口转发由选项
指定-L [bind_address:]port:host:hostport
然后在本地主机上的进程(例如Firefox)
SSH客户端正在运行)附加到port
。
SSH客户端是否创建了一个以port
作为套接字端口的新套接字?
port
是属于SSH客户端的套接字还是属于套接字
过程(例如Firefox)或两者(即两者的套接字)
SSH客户端和Firefox进程的套接字使用相同的端口
port
)?
评论中的链接线程并未解决我的问题(至少直接)。
答案 0 :(得分:1)
您必须区分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. 现在,连接由正在连接的客户端建立。侦听套接字克隆在以accept接收的服务套接字中。该套接字未处于侦听状态!!!但它仍在使用端口A. 因为它不是监听套接字,所以TCP不会使用它来匹配传入的连接请求,为此它只使用监听套接字。为匹配传入数据,它使用连接对的概念。哪个是您自己的IP地址和端口,在本例中为A,以及源IP地址和端口。这4个参数唯一地标识了与上面的答案非常不同的连接,似乎声称套接字由5个参数唯一标识,它实际上是由4个参数标识的TCP连接。 因此,在连接之后,您的系统上基本上有两个插槽,它们都使用端口A.一个侦听套接字和一个服务套接字。 建立的连接越多,将分配的服务套接字越多,使用相同端口的套接字就越多。当然,如果连接关闭,那么它们会再次消失。
我希望这会澄清一些事情。结论是TCP连接由4个参数标识,而侦听TCP套接字仅由2个标识.TCP连接完全与彼此隔离,当然也来自侦听套接字,这一个仅用于建立连接和处理第一个TCP SYN消息。
对于冗长的答案和复杂性感到抱歉。一旦你明白它就很简单。
SSH客户端是否创建了一个新的套接字,并将端口作为套接字的端口?
不,它没有,客户端连接到一个众所周知的服务器端口,但使用短暂的端口。除非客户端将套接字绑定到一个众所周知的端口,否则这不是正常情况。
短暂的端口属于客户端,众所周知的ssh端口属于服务器进程。端口是属于SSH客户端的套接字,还是属于进程的套接字(例如Firefox),还是两者都有(即SSH客户端的套接字和Firefox进程的套接字都使用相同的端口)?
服务器和客户端之间的TCP连接由套接字对标识。该对的一端位于客户端计算机上,另一端位于服务器计算机上。
此时我还没有提出哪些其他问题?