客户端与服务器

前面讨论的,主要是一台计算机内部软件与硬件如何配合。现实中的网络服务往往不依赖单台机器独立完成,而是由多台计算机通过网络连接起来协同工作。其中最常见的一种协作方式,就是 客户端-服务器模型。

客户端与服务器分别做什么

在客户端-服务器模型中,参与通信的机器会承担不同角色。

客户端是请求发起方,也是服务使用方。我们日常打开浏览器访问网站、用手机 App 登录账号、向聊天软件发送消息时,这些程序都在扮演客户端的角色。

服务器是服务提供方,也是请求响应方。服务器通常会在网络中持续监听,等待客户端发来请求。收到请求后,它会根据需求读取文件、查询数据、执行程序,再把结果返回给客户端。

换句话说,客户端负责“我要什么”,服务器负责“我能给你什么”。

一次网页请求是如何完成的

以浏览器访问资料库中的网页为例,整个过程可以分成三步。

本机客户端(浏览器)
   │
   │ 1. 发送 HTTP 请求
   │    例如:请求获取 course.html
   ▼
远程服务器(Web 服务)
   │
   │ 2. 服务端处理请求
   │    读取文件、查询数据库或调用其他服务
   ▼
本机客户端(浏览器)
   ◀── 3. 服务器返回响应数据
       浏览器接收内容,并在本地页面中展示

本机浏览器请求资料,远端服务程序读取文件并返回内容

理解请求与响应的几个关键事实

服务器提供的是内容副本,不是搬走文件

浏览器请求网页时,并不会把服务器上的文件“拿走”。服务器只是把对应内容复制一份,通过网络发送给浏览器。源文件依然留在服务器上,可以继续响应其他用户的访问。

这也是为什么一个网站可以同时服务成千上万人。每次请求都会生成一次响应,而不是不断消耗服务器上的原始文件。

关闭浏览器,并不会关闭服务器

当你关掉网页标签、退出浏览器或关闭手机 App 时,影响的只是本地客户端。服务器仍然会在远程环境中运行,继续接收其他请求。

这就像你关掉电视,并不会关掉电视台。

屏幕上还能看到内容,不代表服务器此刻一定正常

浏览器通常会保存一些历史内容,例如图片、脚本、页面片段等,这就是 浏览器缓存。缓存的目的,是为了减少重复下载,提高加载速度。

因此,即使服务器暂时宕机,浏览器也可能直接展示已经缓存在本地的旧页面。这时看到的“页面正常”,不一定意味着服务器当前仍然健康。

要判断网络服务是否真正可用,更可靠的方法是发起一次新的实时请求,观察服务器能否及时返回响应。

服务器之间也会互相请求

“服务器”不是指某种特殊硬件,而是某个程序在某次协作中承担的 角色。

一台性能普通的计算机,在某个场景下是服务器;在另一个场景下,它也可能变成客户端。

例如,用户在浏览器中访问商城网站时,关系是这样的:

用户浏览器(客户端)
      │
      │ 浏览商品页面
      ▼
商城 Web 服务(服务器)

这时,商城 Web 服务是服务器,浏览器是客户端。

但如果商城 Web 服务需要查询商品库存、读取用户信息,就会向后端数据库发起请求:

商城 Web 服务
      │
      │ 发起数据库查询
      ▼
数据库服务(服务器)

此时,对于数据库来说,商城 Web 服务又变成了客户端。

这就是 服务之间的链式调用:一个服务可以响应上层客户端的请求,同时也可以作为客户端,向更底层的服务请求数据。

同一台机器上,也可以同时运行多个服务。比如一台服务器既能提供 Web 页面,也能访问数据库,还能与其他内部系统通信。它对外是服务提供者,对内又可能不断请求其他服务。

后续学习网络协议、IP 地址、端口、HTTP 请求等内容时,会进一步解释这些请求具体是如何在网络中发出的。