【问题标题】:How multiple applications can use the same network port?多个应用程序如何使用同一个网络端口?
【发布时间】:2014-06-14 17:05:49
【问题描述】:

我想知道,多个应用程序如何使用同一个网络端口。 TCP 协议 1 端口中的 AFAIK 分配给 1 个套接字连接。那么,例如,多个互联网浏览器如何同时使用端口 80/8080? 我可以将多个套接字绑定到同一个端口吗?我如何在 C++ 中做到这一点?

【问题讨论】:

标签: c++ sockets networking tcp network-programming


【解决方案1】:

在有状态协议的 TCP 中,连接由元组 [source_ip, source_port, dest_ip, dest_port] 唯一定义(请参阅上面 Eugen Rieck 的评论)。所以理论上,每个客户端(或 NAT 后面的一组客户端)都可以通过任何 16 位端口号(通常减去 0-1023 的端口)连接到服务器。

当 Web 服务器在端口 80(例如)上侦听传入的 HTTP 连接时,每次客户端尝试向服务器发送 HTTP 请求时,客户端都会通过不同的客户端端口启动 TCP 连接。因此,多个应用程序如何使用同一个网络端口的答案是在另一端使用不同的端口

【讨论】:

    【解决方案2】:

    套接字连接由其本地 IP:Port 和远程 IP:Port 的组合唯一标识。多个应用可以绑定到同一个本地 IP:Port,只要它们各自连接到不同的远程 IP:Port。

    如果一个本地 IP:Port 已经绑定监听(bind()listen() 已被调用),其他套接字仍然可以bind() 到同一个本地 IP:Port 但前提是 SO_REUSEADDR (在某些平台上,SO_REUSEPORT)使用套接字选项。否则,bind() 将失败并显示“已在使用”错误。

    当多个客户端套接字 connect() 到同一个远程 IP:Port 时,通常不指定本地绑定,这允许 connect() 对随机可用的本地 IP:Port 执行隐式 bind() 以避免与其他连接。如果显式调用bind()并成功,然后调用connect()连接到已经连接到本地IP:Port的远程IP:Port,connect()会失败。

    【讨论】:

    • +1,socket对的唯一标识是关键。为同一 IP 和端口上的多个客户端提供服务的服务器需要查看客户端的 IP 和端口以了解它收到的任何信息,以便知道应该将其发送到哪个连接的套接字。
    • 您的答案正是我想要的。感谢您的解释。
    • @PaulGriffiths 这很有误导性。 TCP 需要这样做,而不是服务器。服务器所要做的就是通过请求来自的同一个套接字进行回复。
    • @EJP:这是毫无意义且令人费解的狡辩。您不妨说计算机根本不通过网络发送数据,因为这一切都是通过电线和无线电波完成的。那是在我们甚至没有意识到“服务器”可以指代整台计算机,而不仅仅是在其上运行的应用程序的事实之前,在这种情况下,您的评论将完全是错误的,而不仅仅是“误导” .
    【解决方案3】:

    一个 TCP 端口只能有一个套接字监听连接。当通过accept() 或朋友建立连接时,会生成一个新的套接字,代表此连接,而单个原始侦听套接字继续侦听。

    【讨论】:

    • 总结一下,关于@user3581454,服务器端的套接字一直在监听端口80上的连接,它允许同时处理连接。在客户端,每个套接字实例都需要分配不同的端口,如 user3581454 在他的示例中所示。我说的对吗?
    • tcp 数据包的定义元组是 (source-ip, source-port,destination-ip,destination-port)。由于目标部分对于连接的套接字是固定的,因此 (source-ip, source-port) 对于连接必须是唯一的。通常,客户端的操作系统会保证这一点。
    • 原则上,您可以在客户端的同一 IP/端口上拥有多个出站连接,只要它们都指向服务器端的不同 IP/端口组合。但这通常不会发生,因为您通常不关心客户端端口是什么,因为客户端正在尝试与其他人联系。
    • 从服务器的 POV 中,一旦建立连接,目标参数是固定的。所以源参数定义了连接。
    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 2016-10-09
    • 1970-01-01
    • 2016-07-08
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多