Sockets 服务器是否已为每个客户端进程打开套接字?

Sockets 服务器是否已为每个客户端进程打开套接字?,sockets,networking,tcp,Sockets,Networking,Tcp,我对插座感到困惑。据我所知,套接字是ip地址和端口号的组合。它只是允许写入或读取流(在TCP的情况下)的编程抽象。现在我不能绝对肯定的是,服务器在为客户机服务时是否有一个或多个套接字?让我们在端口80处说http 来自不同客户端的所有数据是否都发送到一个套接字(服务器:80),并且一些UBER服务器进程根据传入地址区分它们,还是更多的套接字基于TCP层创建的客户端地址和端口号的组合?。有人能用一步一步的算法(针对同时服务的多个客户端)详细描述这一点吗?不仅仅是服务器将套接字绑定到端口,服务器侦听

我对插座感到困惑。据我所知,套接字是ip地址和端口号的组合。它只是允许写入或读取流(在TCP的情况下)的编程抽象。现在我不能绝对肯定的是,服务器在为客户机服务时是否有一个或多个套接字?让我们在端口80处说
http


来自不同客户端的所有数据是否都发送到一个套接字(服务器:80),并且一些UBER服务器进程根据传入地址区分它们,还是更多的套接字基于TCP层创建的客户端地址和端口号的组合?。有人能用一步一步的算法(针对同时服务的多个客户端)详细描述这一点吗?不仅仅是服务器将套接字绑定到端口,服务器侦听套接字,服务器提供数据。

通常,在服务器端,在创建套接字并将其绑定到特定的端口/地址组合之后,将调用名为
Listen
(或类似)的函数。这使绑定的套接字成为侦听套接字-它只是等待连接尝试开始

在此之后,将在侦听套接字上调用一个名为
Accept
的函数。此调用将从侦听套接字接收挂起的连接请求,创建一个新套接字,然后返回该请求

在连接期间,客户端和服务器之间的所有进一步通信都将通过这个新套接字(在服务器端)进行

如果服务器需要同时处理多个客户端连接,则可以使用不同的技术来实现可伸缩性。一种简单的技术(不能扩展到数千个连接的客户机)是生成一个新的线程/进程(取决于操作系统的价格)来传递此连接,然后原始线程/进程返回调用
Accept


其他技术可能涉及将套接字放置在某种形式的池中,或者能够让套接字在每个套接字需要注意时生成由固定数量的线程处理的事件。

您将TCP连接与套接字混淆了。套接字不是网络级别的概念。是一个操作系统概念。TCP连接作为(源ip、源端口、目标ip、目标端口)的唯一组合存在于网络上。套接字是打开端口或打开连接的句柄(此语句稍微简化)。当我开始工作时,我还认为这是一个令人困惑的操作系统设计错误(但事实就是这样,我们被困在其中)。设计错误在于,每个不同套接字允许的操作非常不同。这些用例应该是两个具有不同名称和不同API的独立概念

正如您所看到的,套接字和连接之间没有1:1的关系

有人能用一步一步的算法详细描述一下吗

服务器打开一个套接字,让操作系统知道它想要侦听或连接。然后,每个接受的连接将产生一个新的、独立的套接字。不过,每个新连接都位于相同的服务器ip和服务器端口上。只是客户端ip和/或客户端端口不同。服务器读取和写入每个连接套接字。开放端口套接字仅用于接受新连接

服务器在概念上是这样的:

var openPortSocket = Open(80); //HTTP port
while(true) {
 var connectionSocket = openPortSocket.Accept();
 ServeConnectionOnNewThread(connectionSocket);
}
这是一个逻辑模型。实际的API调用是不同的。例如,大多数服务器使用异步IO。但这与你的问题无关


客户端必须为每个连接使用不同的客户端端口。这正是你的浏览器所做的。

我可以说的主要是Linux,尽管我相信大多数操作系统/内核的操作都是类似的。简而言之,内核完成了大部分工作

内核与某种网络接口通信,基本上就是将信号从有线传输到内核,反之亦然。套接字和地址只是给定连接的描述符。内核跟踪哪些内部进程与哪些套接字/地址对相关,并相应地引导数据。通常,这是作为FIFO实现的——先进先出。这对于传入和传出数据都是如此

如果服务器连接到多个客户端,通常应用程序负责向每个连接的客户端发送单独的数据包,这意味着应用程序必须跟踪活动客户端的数量。一些内核和/或NIC可以为您完成这些任务。如果这是一个本地网络,并且您希望向连接到该网络的每个客户端发送数据包,那么您可以发送广播数据包,广播数据包只需发送一次,但每个连接都会收到

如果您想了解更多信息,此链接非常详细:


你对什么操作系统感兴趣?我的意思是一般的。我不知道这是基于系统的不同。但是如果我必须专攻Linux(Android)和Win,我想知道这一点。你能提供一些你在学习socket和所有这些东西时使用的资源吗?@shotex不幸的是,几乎所有的socket内容,包括官方文档,都会教你可怕的模式和彻头彻尾的bug!我不知道一个初学者如何在没有大量阅读和独立思考的情况下学习套接字。