12

我应该声明,我不是在询问具体的实施细节(还),而只是对正在发生的事情的一般概述。我了解套接字背后的基本概念,并且需要对整个过程进行澄清。我的(可能是非常错误的)理解目前是这样的:

一个套接字不断地监听想要连接的客户端(在它自己的线程中)。当连接发生时,会引发一个事件,该事件会产生另一个线程来执行连接过程。在连接过程中,客户端被分配了自己的套接字,用于与服务器进行通信。然后,服务器等待来自客户端的数据,当数据到达时,会引发一个事件,该事件会产生一个线程以将数据从流中读取到缓冲区中。

我的问题是:

我的理解有多差?

每个客户端套接字是否需要它自己的线程来监听数据?

数据如何路由到正确的客户端套接字?这是由 TCP/UDP/内核的胆量处理的吗?

在这种线程化环境中,通常共享什么样的数据,争论点是什么?

任何澄清和额外的解释将不胜感激。

编辑:

关于通常共享哪些数据和争用点的问题,我意识到这更多的是实现细节,而不是关于接受连接和发送/接收数据的一般过程的问题。我查看了几个实现(SuperSocket 和 Kayak),并注意到会话缓存和可重用缓冲池之类的一些同步。随意忽略这个问题。我很感激你的所有反馈。

4

2 回答 2

16

每个连接一个线程是糟糕的设计(不可扩展,过于复杂),但不幸的是太常见了。

套接字服务器或多或少像这样工作:

  • 设置监听套接字以接受连接,并添加到套接字集
  • 检查套接字集的事件
  • 如果监听套接字有挂起的连接,则通过接受连接创建新的套接字,然后将其添加到套接字集中
  • 如果连接的socket有事件,则调用相关的IO函数
  • 再次检查套接字集的事件

这发生在一个线程中,您可以轻松地在单个线程中处理数千个连接的套接字,并且通过引入线程使这变得更复杂的正当理由很少。

while running
    select on socketset
    for each socket with events
        if socket is listener
            accept new connected socket
            add new socket to socketset
        else if socket is connection
            if event is readable
                read data
                process data
            else if event is writable
                write queued data
            else if event is closed connection
                remove socket from socketset
            end
        end
    done
done

IP 堆栈负责处理哪些数据包以何种顺序进入哪个“套接字”的所有细节。从应用程序的角度来看,一个套接字代表一个可靠的有序字节流(TCP)或一个不可靠的无序数据包序列(UDP)

编辑:响应更新的问题。

我不知道您提到的任何一个库,但是关于您提到的概念:

  • 会话缓存通常保留与客户端关联的数据,并且可以将这些数据重用于多个连接。当您的应用程序逻辑需要状态信息时,这是有道理的,但它比实际的网络端更高一层。在上面的示例中,“进程数据”部分将使用会话缓存。
  • 缓冲池也是对高流量服务器的一种简单且通常有效的优化。这个概念很容易实现,而不是分配/取消分配空间来存储您读/写的数据,而是从池中获取预分配的缓冲区,使用它,然后将其返回到池中。这避免了(有时相对昂贵的)后端分配/解除分配机制。这与网络没有直接关系,您也可以使用缓冲池来读取文件块并处理它们。
于 2011-03-11T00:25:23.963 回答
1

我的理解有多差?

很远。

每个客户端套接字是否需要它自己的线程来监听数据?

不。

数据如何路由到正确的客户端套接字?这是由 TCP/UDP/内核的胆量处理的吗?

TCP/IP 是多层协议。它没有“内核”。它是片段,每个片段都有一个与其他片段分开的 API。

IP 地址在原地处理。

端口 # 在另一个地方处理。

IP 地址与 MAC 地址匹配以识别特定主机。端口号将 TCP(或 UDP)套接字与特定的应用软件联系起来。

在这种线程化环境中,通常共享什么样的数据,争论点是什么?

什么线程环境?

数据共享?什么?

争执?物理信道是第一竞争点。(例如,以太网依赖于冲突检测。)然后,计算机系统的每个部分都是由多个应用程序共享的稀缺资源,并且是一个竞争点。

于 2011-03-11T00:25:45.050 回答