如何与单个 Web 服务器建立多个客户端连接?

网络工程 通讯协议 网络 第4层
2021-07-28 14:17:19

实际上,我正在学习计算机网络,同时,我对 Web 服务器如何维护多个连接感到困惑

简单地说,我通过谷歌搜索了解到套接字处理每个客户端请求。

所以假设有一个网络服务器,假设有 2 个具有 IP 的客户端

Client A: 5.5.5.5
Client B: 10.10.10.10 

他们都尝试在端口 80上连接到服务器

现在,通过谷歌搜索我得到的是,服务器在端口 80侦听传入请求。然后假设客户端 A尝试连接到服务器(进行 TCP/IP 连接)。在这期间会在这两者之间创建一个套接字。然后它作为单独的线程执行以进行进一步的通信,使服务器再次侦听该特定端口上的其他客户端请求。客户端 B以相同的方式连接。

现在我的第一个问题是:

1. How does server communicate with these two clients simultaneously  
   after the connection has been established?

现在实际上不仅有 2 个客户端,而且有成千上万的用户可以连接到服务器。

那么我的下一个问题是:

2. Now, how do those thousands of clients get connected to a single server?

   If we assume every client is connected to the server through wire, it is not 
   practically possible to maintain that many sockets on a hardware for
   connection. How those thousands connections are made and handled?

最后,我的第三个问题是:

3. Above I said (actually heard) how **client A** connected to the the server
   and similarly the client B.

   But I didn't get the part stating "after a TCP/IP connection is made they
   continue separately in a separate socket and making server to listen for 
   other client requests." What does that mean? If one client is communicating
   to the server, how come other can communicate at the same time to same server.

   Isn't it like while a student is asking question to a teacher, other can't
   ask at the same time since that particular student is busy or occupying the
   teacher at the moment so others should wait, which we compare than client B 
   should wait when client A is communicating.

这些是我没有得到的基本问题。如果我都弄错了,请纠正我。如果答案很详细或没有特别关注特定部分,您可以建议我阅读一些书籍/pdf。谢谢

1个回答

现在,通过谷歌搜索我得到的是,服务器在端口 80 侦听传入请求。

实际上,更具体地说,有一种特殊类型的套接字称为“侦听”套接字。

通常,套接字与本地 IP、本地端口、远程 IP 和远程端口的组合相关联。

侦听套接字是不同的。它与任何特定的远程 IP 和端口无关。它与特定的本地端口相关联。它可能会或可能不会与特定的本地 IP 相关联。

通常,您的 Web 服务器将有一个本地端口为 80 的侦听套接字

然后假设客户端 A 尝试连接到服务器(进行 TCP/IP 连接)。在这期间会在这两者之间创建一个套接字。

一对套接字实际上一个在客户端,一个在服务器上。

客户端应用程序创建一个套接字并要求客户端操作系统将其连接到服务器。

客户端操作系统随机分配一个本地端口,选择一个本地 IP(通常基于数据包将在哪个接口上发送)并填写客户端应用程序请求的远程 IP 和端口。然后它开始连接到服务器的过程。

服务器操作系统通知监听套接字的持有者有一个新的连接进入。服务器应用程序接受连接并创建一个新的套接字来处理它。

多个线程甚至进程可能会监视同一个列表套接字。操作系统将确保只有其中一个可以接受给定的连接。

然后它作为单独的线程执行以进行进一步的通信

这取决于服务器应用程序的实现者。他们可以选择使用多个线程,或者他们可以选择使用像“select”或“poll”这样的 API,允许单个线程监视多个套接字的活动。


  1. 建立连接后,服务器如何同时与这两个客户端通信

服务器操作系统将通过源 IP、源端口、目标 IP 和目标端口的组合将数据包与套接字进行匹配,并将它们传送到适当的套接字。

  1. 现在,这数千个客户端如何连接到单个服务器?

    如果我们假设每个客户端都通过线路连接到服务器,那么实际上不可能在硬件上维护那么多套接字以进行连接。如何建立和处理这数千个连接?

“套接字”在此上下文中不是指物理套接字,而是指操作系统内的数据结构。

仍然有限制,在现代服务器上很容易实现数千,而数百万则变得困难。

是不是就像一个学生在向老师提问的时候,其他人不能同时提问,因为那个学生现在很忙或者占着老师的时间,所以其他人应该等待,我们比较比客户B应该等待当客户端 A 正在通信时。

计算机比人更擅长分散注意力。显然,如果服务器只有一个处理器核心,它一次只能做一件事,但如果它可以足够快地在事物之间切换,客户端就不会注意到这一点。

当然,现在许多服务器确实有多个处理器内核。


创建一个新连接,而不是套接字。我认为您正在扩大 OP 对套接字是什么的混淆。

似乎问题在于 rfc 在套接字的定义上与实际实践不同。

我刚刚去查找了三个主要操作系统的“accept”文档,它们都在谈论accept 创建一个新的套接字。

http://man7.org/linux/man-pages/man2/accept.2.html

https://www.freebsd.org/cgi/man.cgi?query=accept&sektion=2

https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526%28v=vs.85%29.aspx