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


16

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

简而言之,我了解到谷歌搜索是套接字处理每个客户端请求。

因此,假设有一个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,如果答案很详细或不是专门针对特定部分。谢谢


有什么答案对您有帮助吗?如果是这样,您应该接受答案,这样问题就不会永远弹出来寻找答案。或者,您可以提供并接受自己的答案。
罗恩·莫平

Answers:


6

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

仍然存在限制,在现代服务器上可以轻松实现成千上万种,数百万种变得困难。

难道不是像一个学生向老师提问时,其他人却不能同时问,因为那个学生现在正忙着或正在占用老师,所以其他人应该等待,我们比委托人B应该等待当客户端A正在通信时。

与人相比,计算机在分散注意力方面要好得多。显然,如果服务器仅具有一个处理器核心,则一次只能做一件事,但是如果它可以足够快地在各种事情之间切换,那么客户端将不会注意到这一点。

当然,当今许多服务器确实具有多个处理器核心。


创建一个新的连接,而不是套接字。我认为您正在扩展OP关于套接字是什么的困惑。

似乎问题在于RFC在套接字定义方面与实际做法有所不同。

我只是去查阅了三个主要操作系统的“接受”文档,他们都在谈论接受创建一个新的套接字。

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/zh-cn/library/windows/desktop/ms737526%28v=vs.85%29.aspx


对于1.的答案,我知道套接字的唯一性。我要问的是是否有2个唯一的套接字,服务器知道它们是不同的。然后服务器是否通过同时处理请求给每个套接字一个时间片来运行?就像我连接到Google并正在处理我的请求一样,这并不意味着其他百万用户的请求正在等待处理?
萨加里(Sagaryal)'17

另外2.我的意思是,当您要连接到网络(例如LAN)时,这些端口就像实际的物理端口。我可能会误解这里的字眼。可以说我再次连接到Google。就像数百万其他人正在连接到单个Google服务器一样。我在家和类似的百万人口都通过无线连接到Google。服务器如何处理这些连接。就像我的计算机要使用互联网一样,我需要连接到路由器上的端口或无线连接。他们在物理上是否有数百万个这样的端口?现在我认为它不是关于服务器,而是无线连接?
萨加里(Sagaryal)

通常,套接字与本地IP,本地端口,远程IP和远程端口的组合相关联。 ”根据RFC的定义,套接字是本地IP地址和TCP端口,与远程地址无关。 。阿连接是在本地和远程套接字的组合,所以本地IP地址,本地TCP端口,远程IP地址和远程TCP端口。您对此问题感到困惑。
罗恩·莫平

2
服务器OS通知侦听套接字的持有者有新的连接进入。服务器应用程序接受该连接,并创建了一个新的套接字来处理它。创建了一个新的连接,而不是套接字。我认为您正在扩展OP关于套接字是什么的困惑。
罗恩·莫平

服务器操作系统将通过源IP,源端口,目标IP和目标端口的组合将数据包与套接字进行匹配,然后将它们传递到适当的套接字。 ”再次,您将套接字连接混淆了。
罗恩·莫平
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.