实际上,我正在学习计算机网络,与此同时,我对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,如果答案很详细或不是专门针对特定部分。谢谢

评论

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

#1 楼


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


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

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

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

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


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


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

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

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

服务器OS通知侦听套接字的持有者有新的连接进入。服务器应用程序接受该连接并创建了一个新的套接字处理它。

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


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


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



建立连接后,服务器如何与这两个客户端进行通信?




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





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

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

操作系统。

仍然有限制,在现代服务器上可以轻松实现成千上万个,数百万个变得很困难。向老师提问,其他人不能同时发问,因为该学生目前正忙于工作或正在占用老师,所以其他人应该等待,我们将比委托人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并正在处理我的请求一样,这并不意味着其他百万用户的请求正在等待处理?

–鼻科
17 Mar 8 '17 at 7:54



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

–鼻科
17 Mar 8 '17 at 8:13



“通常,套接字与本地IP,本地端口,远程IP和远程端口的组合相关联。”根据RFC的定义,套接字是本地IP地址和TCP端口,与远程地址无关。连接是本地套接字和远程套接字的组合,因此是本地IP地址,本地TCP端口,远程IP地址和远程TCP端口。您对此问题感到困惑。

–罗恩·莫潘♦
17年8月8日在21:25

“服务器操作系统会通知侦听套接字的持有者有新的连接进入。服务器应用程序接受该连接,并创建一个新的套接字来处理它。”创建一个新的连接,而不是套接字。我认为您正在扩展OP关于套接字是什么的困惑。

–罗恩·莫潘♦
17 Mar 8 '17 at 21:27

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

–罗恩·莫潘♦
17 Mar 8 '17 at 21:29