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

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

我对如何HTTP可以。我知道客户端(Web 浏览器)发出请求,服务器响应请求。但我不明白的是 Web 服务器如何知道客户端何时发出请求?

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

答案1

这其中涉及很多层面。重要的是,其中许多层面是可以互换的。

例如,在物理层面上,您可以拥有同轴电缆网络、以太网或 Wi-Fi。HTTP 可以在所有这些网络上运行,但它们各自对发送的有效负载的处理方式略有不同。

HTTP 在另一个称为 TCP 的协议之上工作,而 TCP 又或多或少在另一个称为 IP 的协议之上运行(目前主要有两种变体 - IPv4 和 IPv6)。

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

边注

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

回归正题:

以手动电话为例,想象一下你的电话实际上并没有响。要知道是否有人试图打电话,你必须定期查看屏幕并检查。为了让 HTTP 服务器更容易管理这一点(因为已经有相当多的层进行定期检查),你实际上可以堵塞在检查尝试中。

因此,您无需检查,发现那里没有任何东西,然后再检查,基本上一直盯着屏幕。但是,您基本上有一个完全独立的系统来处理这个问题(在您的例子中,是听力中心,它检查空气振动以获取有用信息,即铃声),因此它实际上不需要您的注意力(CPU 时间)。

通过允许您同时监控多个连接(IOCP)的技术,这一点得到了进一步的改进。这越来越接近电话铃声系统 - 您的房间里有一万部电话,但您只关心那些此刻正在响铃的电话,其他电话不会引起您的注意。

答案2

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

有数千个端口(维基百科列表),例如端口 80 是 HTTP 的默认端口。

诀窍在于,一个程序(例如 Web 服务器)可以注册自己以监听特定端口。然后操作系统会将任何来自该端口的请求传递给该程序。

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

答案3

Web 服务器通过以下流程收到通知

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

假设 Web 服务器监听端口 80,当客户端的请求到达端口 80 时,它将使用 accept() 系统调用接受连接。此调用通常会阻塞,直到客户端连接到服务器。

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

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

希望这可以帮助!

答案4

我猜测网络服务器通过端口注册了回调函数。

这样,每当在该特定端口上接收到任何内容时,系统都会调用之前注册的回调函数。在该回调函数中,它可能会设置一个事件或类似的东西,然后 Web 服务器将有一个专用线程等待该事件。此线程将运行并将此请求排队到 Web 服务器正在处理的主请求列表中。

我在这里给出的只是对正在发生的事情的一个非常肤浅和宏观的看法。至于更准确的答案,让我们等专家来吧。

相关内容