当前位置: 首页 > 知识库问答 >
问题:

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

东郭骁
2023-03-14

>

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

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

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

    例如,SSH本地端口转发由以下选项指定:

    -L [bind_address:]port:host:hostport
    

    然后本地主机(SSH客户端运行的地方)上的进程(如Firefox)连接到端口。

    >

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

    port是否属于SSH客户端的套接字,或者属于进程的套接字。Firefox),还是两者(即SSH客户端的套接字和Firefox进程的套接字都使用相同的端口port)?

    由评论链接的线程没有回答我的问题(至少是直接的)。


  • 共有1个答案

    寇和璧
    2023-03-14

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

    当您想要接收任何内容时,通常会将套接字绑定到IN_ADDRANY和特定端口。对于TCP,您将执行侦听,对于UDP,您将执行recfrom。

    最具体的东西将用于匹配。因为你也可以绑定到一个特定的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。一个监听插座和一个服务插座。建立的连接越多,分配的服务套接字越多,使用同一端口的套接字也越多。当然,如果连接被关闭,它们就会再次消失。

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

    对于冗长的回答和复杂性,我深表歉意。一旦你理解了它,它就变得非常简单。

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

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

    端口是属于SSH客户端的套接字,还是属于进程的套接字(如Firefox),还是两者都属于(即SSH客户端的套接字和Firefox进程的套接字使用相同的端口)?

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

    服务器客户端之间的传输控制协议由套接字对标识。配对的一端在客户端机器上,另一端在服务器机器上。

    在这一点上,我还有什么问题没有回答?

     类似资料:
    • 假设有一个多线程服务器将数据写入同一端口上的两个不同套接字,其中一个专用线程处理每个套接字。两个线程是否可以同时写入各自的套接字?(所谓“同时”,我指的是真正的同时性,而不仅仅是并发交错。)或者,套接字共享同一端口的事实是否意味着强制执行互斥? 一般来说,我不清楚如何在两个任意I/O流之间共享资源。我知道两个线程不能同时写入磁盘,因为磁盘本身是共享资源。然而,在套接字和端口的情况下,我没有类似的物

    • 我设置了一个测试平台,试图在同一客户端和后端服务器之间创建两个套接字。打开调试后,我可以看到对两个不同套接字(AAAA和AAAB)的xhr open GET请求,对应的套接字接收类型为“open”的消息,数据的sid响应套接字id(AAAA或AAAB)。我在下面的跟踪中突出显示了这些内容。但是,这两次都发生在socket.on之前(“connect...函数被调用,因此socket.io.engi

    • 问题内容: 这看起来很基础,是否允许您将链接放在链接内? 我试图使整个灰色条都可单击以到达某个地方,但是如果用户单击滚轮或移动箭头,则它们是其他链接。查看我当前的代码: 这是一个好习惯吗?我做错了吗?你会怎么做?谢谢您的帮助! 问题答案: 直接来自W3C for HTML4: 12.2.2嵌套链接是非法的由A元素定义的链接和锚点不得嵌套;A元素不得包含任何其他A元素。 由于DTD将LINK元素定义

    • 这可能是一个很基本的问题,但它使我感到困惑。 两个不同连接的套接字可以共享一个端口吗?我正在编写一个应用服务器,它应该能够处理100K以上的并发连接,我们知道一个系统上可用的端口数量大约是60K(16bit)。一个连接的套接字被分配给一个新的(专用的)端口,因此这意味着并发连接的数量受到端口数量的限制,除非多个套接字可以共享同一个端口。所以问题是。

    • 我正在做一个Android Studio项目,有几个活动。我目前正在尝试读取localhost上的Java Servlet的输出,但它似乎由于套接字权限而崩溃。 我做了一个新的项目,使用了完全相同的代码,工作很完美。所以我不明白为什么不愿意在我的项目上工作。 我希望它读取数据,但它在这一行崩溃: 这是错误输出: