我应该声明我还没有询问具体的实施细节(但是),而只是概述了正在发生的事情。我理解套接字背后的基本概念,需要对整个过程进行澄清。我(可能是非常错误的)理解目前是这样的:
套接字一直在监听想要连接的客户端(在自己的线程中)。发生连接时,会引发一个事件,该事件会生成另一个线程以执行连接过程。在连接过程中,客户端被分配了自己的套接字,用于与服务器通信。然后,服务器等待来自客户端的数据,当数据到达时,会引发一个事件,该事件产生一个线程,将数据从流中读入缓冲区。
我的问题是:
我的理解有多远?
每个客户端套接字是否需要它自己的线程来监听数据?
如何将数据路由到正确的客户端套接字?这是由TCP / UDP /内核的内容照顾的吗?
在这种线程环境中,通常会共享哪种数据,争用点是什么?
非常感谢任何澄清和补充说明。
修改
关于通常共享什么数据和争用点的问题,我意识到这更像是一个实现细节,而不是关于接受连接和发送/接收数据的一般过程的问题。我查看了几个实现(SuperSocket和Kayak)并注意到会话缓存和可重用缓冲池之类的一些同步。随意忽略这个问题。我很感激您的反馈意见。
答案 0 :(得分:15)
每个连接一个线程糟糕的设计(不可扩展,过于复杂)但不幸的是太常见了。
套接字服务器的工作方式或多或少如下:
这种情况发生在一个线程中,您可以在一个线程中轻松处理数千个连接的套接字,并且通过引入线程使得这个更复杂的几个正当理由。
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)套接字绑定到特定的应用程序软件。
在这种线程环境中,通常会共享哪种数据,争用点是什么?
什么是线程环境?
数据共享?什么?
争?物理信道是竞争的第一点。 (例如,以太网取决于碰撞检测。)之后,计算机系统的每个部分都是由多个应用程序共享的稀缺资源,并且是争论的焦点。