服务器如何获得有关HTTP请求的通知?


8

我对HTTP的工作原理有基本的了解。我了解客户端(网络浏览器)发出了请求,而服务器响应了该请求。但是,我不明白的是,Web服务器如何知道客户端何时发出请求?

如果有人给我打电话,我的电话会响,并且会收到通知。同样,网络服务器如何获得有关请求的通知?


2
超级用户推出5年后,这又不是重复吗?
彼得·莫滕森

Answers:


28

这有很多层次。重要的是,其中许多是可互换的。

例如,您可以在物理级别关闭同轴电缆网络,以太网或Wi-Fi。HTTP在所有这些协议之上工作,但是每个协议对所发送的有效负载的处理方式略有不同。

HTTP在称为TCP的另一个协议之上运行,而后者又或多或少地在称为IP的另一个协议之上运行(当今主要有两个变体-IPv4和IPv6)。

因此,HTTP服务器在操作系统中注册了IP地址(例如184.38.45.1,或通常是“任意”),以及TCP端口(80HTTP的默认端口,但通常是1to 65535)。现在,HTTP服务器告诉操作系统在数据(或其他消息)到来时对其执行ping操作。操作系统知道发生这种情况的时间,因为网络接口卡驱动程序会告诉您。NIC本身告诉NIC驱动程序,它实际上具有自己的软件来解释网络电缆上的电信号(或空中的无线信号等,您就可以了)。

旁注

如果您想了解有关NIC如何启动与驱动程序/ OS的通信的更多信息,则可能需要查找有关硬件中断的一些基本信息-基本上,当前正在执行的CPU均已停止,并且程序流切换到中断处理程序例程-一个非常简单的代码段,负责通知系统,然后立即将控制权返回给CPU正在执行的原始操作。实际上,它可能会回答有关操作系统和计算机本身内部工作的许多问题,例如操作系统如何“窃取”正在运行的应用程序中的CPU,并在同时运行的不同应用程序之间改变CPU资源,即使他们不合作。

重新营业:

用您的手动电话比喻,想象您的电话实际上没有响铃。要知道您是否正在尝试拨打电话,您必须定期查看屏幕并进行检查。为了使它更容易管理HTTP服务器(因为已经有很多层进行定期检查),您实际上可以阻止检查尝试。

因此,您基本上不需要一直检查屏幕,而不是查看那里什么都没有然后再次检查。但是,您基本上有一个单独的系统来处理此问题(在您的情况下,听力中心会检查空气振动以获取有用的信息,例如振铃声),因此实际上并不需要您的关注(CPU时间)。

通过允许您一次监视多个连接(IOCP)的技术,此功能得到了进一步改进。这越来越接近电话铃响系统-您有一间装有一万个电话的房间,但是您只关心当前正在响铃的那些,而其他铃铛则不会引起您的注意。


注意,“ ping”在网络中具有完全不同的完全不相关的含义。另外,为什么没有人提到“硬件中断”?
Lie Ryan

1
@LieRyan好吧,是的,这是NIC告诉NIC驱动程序的部分。感觉就像是涉及到的大量抽象中的一个小斑点,实际上,在玩过老派体系结构,嵌入式设备或驱动程序开发人员的人们之外,可悲的是,这是相当晦涩的知识。但是,我想我会快速提及一下。
a安2014年

1
端口仅仅是数字吗?或者它们是NIC卡上的物理引脚?我很难想象可能会有65536个端口
Dhiwakar Ravikumar 2014年

2
@DhiwakarRavikumar:是的,端口只是数字。它们由程序或操作系统组成,与硬件中的任何内容都不对应。
sleske 2014年

1
@DhiwakarRavikumar端口只是数字,但是硬件中断实际上曾经是CPU上的硬件引脚(因此,您有一个不同的引脚“除以零!”,另一个有“闹钟响”)。因此,在大多数情况下,您只有三个或七个不同的中断。它可以媲美旧的电话站-它们以前实际上具有必须连接的物理针才能拨打电话,但如今它们已像TCP端口一样在软件中进行了切换。
罗安2014年

9

计算机使用称为“端口”的概念,类似于电话总机的“扩展”:客户端不仅在“呼叫”服务器IP地址,而且还将请求发送到该服务器上的特定端口。

有成千上万的端口(维基百科列表),例如HTTP默认使用端口80。

诀窍是程序(例如Web服务器)可以注册自己以侦听特定端口。然后,操作系统会将进入该端口的所有请求传递给该程序。

拥有多个端口的要点是,通过使用不会相互干扰的不同端口,您可以在同一台服务器上同时运行多个服务。


准确的65,535个端口
ub3rst4r 2014年

3

Web服务器已通过以下过程通知

Accept ()
Liseten()
bind()
socket()

假设网络服务器侦听端口80,当客户端发出的请求来自端口80时,它将接受与accept()系统调用的连接。该调用通常会阻塞,直到客户端与服务器连接为止。

然后使用listen()系统调用侦听连接,并使用bind()系统调用将套接字绑定到地址。

Atlast使用socket()系统调用创建一个套接字。

希望这可以帮助!


0

您的/ var / log / apache2目录包含以下目录:

access.log
error.log
other_vhosts_access.log

它与您要从客户端获取的内容有关,以及如何通知,短信,电子邮件等。

我的建议:

您可以创建一个日志服务器并发送您的每个日志,例如邮件服务器,dns服务器,Web服务器等,然后您可以对其进行解析,即使同一台服务器使用db也可以运行查询。


感谢您的答复,但我认为您误解了我的问题。我的意思是,接到电话时,我的电话会响。所以我知道我接到电话是因为我的电话响了。同样,当客户端发出请求时,如何通知Web服务器?
raj好奇

0

我猜想Web服务器使用该端口注册回调函数。

因此,只要在该特定端口上收到任何内容,系统就会调用之前注册的回调函数。在该回调内部,它可以设置一个事件或类似的事件,然后Web服务器将有一个专用线程等待该事件。该线程将运行,并将此请求排队到Web服务器已经在处理的请求的主列表中。

我在这里给出的是对正在发生的事情的非常肤浅和宏观的看法。要获得更准确的答案,请等到专家们来。

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.