【问题标题】:How does a server distinguish multiple connections from a single client?服务器如何区分来自单个客户端的多个连接?
【发布时间】:2011-10-09 16:40:28
【问题描述】:

我正在对客户端服务器套接字示例进行一些 C 编程。 假设服务器侦听端口 80,客户端侦听端口 4321。元组用于区分多个连接。但是服务器如何区分来自同一个客户端的连接呢?我的意思是肯定会有来自客户端的多个应用程序访问同一端口上的同一服务器。

谁能解释一下?

谢谢

【问题讨论】:

  • 对于 HTTP,服务器 bind()s 到端口 80 和 listen()s,客户端 connect()s 到服务器,自动绑定到一个随机的免费临时端口。

标签: c sockets networking tcp


【解决方案1】:

两个客户端不能使用同一个端口。如果一个客户端使用端口 4321,另一个客户端必须使用不同的端口。

【讨论】:

  • 一个客户端可以使用多个端口,服务器如何区分它们?
  • OP 混淆了“客户端”一词作为计算机与进程的含义。您需要在 OP 理解您的答案之前解决此问题...
【解决方案2】:

通常的答案是你一开始就没有那样做。

客户端通常会使用 unbound 套接字连接到服务器,这意味着它没有指定接收回复的本地端口。服务器将使用bind 指定本地端口,然后它将在该端口上侦听来自客户端的连接。

当客户端使用未绑定的套接字连接时,TCP 堆栈将选择一个当前未使用的端口号,并将其分配给该连接。当它向服务器发送请求时,服务器将回复分配的端口号。在客户端,TCP 堆栈将查看数据包中的端口号,并将其路由到分配了该端口号的任何进程。

因此,客户端不会使用端口 4321——它将使用堆栈分配给它的任何端口。当同一台机器上的另一个进程连接到同一台服务器时,它也不会使用端口 4321——它会使用分配给它的 另一个 端口。网络堆栈负责确保每个堆栈都有一个唯一的端口号。

不管怎样,TCP 端口分为三个范围。从 0 到 1023 是 FTP、SMTP、HTTP、POP 等服务器的“众所周知”端口。这些是供服务器使用的,操作系统可能会采取一些特殊步骤来保护这些端口。举个例子,一个典型的操作系统需要某种管理员/根级别的权限才能被授予一个进程,然后它才能使用这些端口。

从 1024 到 49151 是注册的端口号。这些通常比众所周知的端口更宽松地控制。几乎任何人都可以设置监听它们,但 IANA 为特定端口维护一个特定用途的注册表。根据注册表,4321端口是远程whois协议的。

从 49152 到 65535 是动态端口——当客户端连接到服务器时,它通常会在此范围内获取本地端口号。当然,如果您愿意(例如,为了测试),您可以编写一个服务器并将其绑定到此范围内的端口号。当/如果你这样做了,堆栈将跟踪它,因此它不会尝试将该端口用于其他目的。

【讨论】:

    【解决方案3】:

    两个客户端不能使用同一个端口,所以没有实际意义。

    但是,如果您要定义自己的协议,为什么不在客户端和服务器之间来回传递 ClientID?客户端可以使用无效的client_id发出请求,服务器可以在ack中分配一个。

    【讨论】:

      【解决方案4】:

      连接由元组(协议、源 IP、源端口、目标 IP、目标端口)标识。这就是您可以区分连接的方式。

      【讨论】:

        【解决方案5】:

        TCP 侦听器端口根据套接字区分连接,这是 IP:port 的组合。

        对于从同一台机器多次连接到同一台服务器的客户端,它使用多个端口(通常是临时端口)连接到同一个已知(侦听器)端口。

        然后,服务器在连接套接字上进行迭代,这可能包括来自同一台机器甚至应用程序的多个连接。

        当您使用 connect() TCP 函数时,操作系统会自动完成客户端端口绑定,因此您实际上不需要管理这些东西。

        然后,服务器通过不同的 IP:ports 组合(可能仍在同一个应用程序中)向客户端发送数据,因此不会真正混淆。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-17
          • 2023-03-10
          • 2023-03-09
          • 1970-01-01
          • 2012-12-14
          • 2012-06-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多