异步套接字服务器如何工作?

时间:2011-03-11 00:12:56

标签: multithreading sockets tcp asyncsocket

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

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

我的问题是:

我的理解有多远?

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

如何将数据路由到正确的客户端套接字?这是由TCP / UDP /内核的内容照顾的吗?

在这种线程环境中,通常会共享哪种数据,争用点是什么?

非常感谢任何澄清和补充说明。

修改

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

2 个答案:

答案 0 :(得分:15)

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

套接字服务器的工作方式或多或少如下:

  • 设置侦听套接字以接受连接,并添加到套接字
  • 检查套接字集的事件
  • 如果侦听套接字具有挂起连接,则通过接受连接创建新套接字,然后添加到套接字集
  • 如果连接的套接字有事件,则称为相关的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)

编辑:回应更新的问题。

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

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

答案 1 :(得分:2)

  

我的理解有多远?

相当远。

  

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

没有

  

如何将数据路由到正确的客户端套接字?这是由TCP / UDP /内核的内容照顾的吗?

TCP / IP是多层协议。它没有“内核”。它是各个部分,每个部分都有一个独立的API。

即时处理IP地址。

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

IP地址与MAC地址匹配,以识别特定主机。端口#将TCP(或UDP)套接字绑定到特定的应用程序软件。

  

在这种线程环境中,通常会共享哪种数据,争用点是什么?

什么是线程环境?

数据共享?什么?

争?物理信道是竞争的第一点。 (例如,以太网取决于碰撞检测。)之后,计算机系统的每个部分都是由多个应用程序共享的稀缺资源,并且是争论的焦点。