HTTP协议 III 服务类型

基于HTTP协议,技术上进行了多种技术实现

Web服务器

web服务器是基于Http协议的最基础实现:用户通过浏览器代理 发送HTTP请求,服务端解析请求提供对应服务。

一个基础的web服务器具备以下流程 :

(1) 建立连接——接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。

1
2
3
服务器使用 socket 创建监听端口(如 TCP 80/443),并通过 accept 接收客户端连接请求。
客户端发起 TCP 三次握手,连接成功后,服务器进入请求处理阶段。
连接建立后,可以根据客户端 IP 或报文字段判断是否拒绝继续服务(例如黑名单、Header 校验)。

(2)接收请求——从网络中读取一条HTTP请求报文。

1
2
3
从 Socket 中读取 HTTP 请求报文,HTTP 是基于文本协议,使用 CRLF(\\r\\n)标志字段和请求结束。
请求报文包括请求行、头部字段、空行和可选的消息体。
Web 服务器需按 HTTP 语法解析这些字段,并生成一个结构化的请求对象供业务逻辑处理。

(3)处理请求——对请求报文进行解释,并采取行动。

1
现代 Web 框架会基于请求路径、方法、参数等信息进行路由匹配,将请求分发给对应的控制器函数进行业务逻辑处理。

(4)访问资源——访问报文中指定的资源。

1
2
资源访问可以是静态资源(如 HTML、CSS、图片文件)或动态处理(如数据库操作、业务逻辑执行)。
根据请求方法(GET/POST)和 URI 路径,决定资源类型与访问方式。

(5)构建响应——创建带有正确首部的HTTP响应报文。

1
修改或者其他响应办法确定后,构造序列化对象(如Json),以及响应头信息。对客户端进行响应。

(6)发送响应——将响应回送给客户端。

1
底层 将 状态码 响应头 消息体 编码为字节数组 以CRLF作为结尾,由Socket发送给客户端

(7)记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。

1
2
服务器会将每次请求的处理过程记录到访问日志中,包括客户端 IP、请求路径、方法、状态码、响应时间等。
日志有助于问题追踪、性能分析与安全监控。

代理

Web代理(proxy)服务器是网络的中间实体。代理位于客户端和服务器之间,扮演“中间人”的角色,在各端点之间来回传送HTTP报文

代理 : 客户端向代理服务器发送请求,代理服务器转发给后端的引用服务器

反向代理:客户端不感知代理存在,请求发向代理,由其代表后端服务器处理请求(如 Nginx、API 网关)

为什么需要代理

  • 消息过滤,代理可以作为中间过程为最终客户进行内容筛选。通过检查请求/响应内容对用户的访问进行控制
  • 访问策略,代理通过解析中间消息,可以对不同的用户实施不同的访问策略
  • 防火墙,通过检查传输的Http消息,来监控网络中是否存在恶意信息
  • web缓存,代理缓存维护了常用文档的本地副本,并将它们按需提供,以减少缓慢且昂贵的因特网通信。
  • 反向代理,代理可以假扮Web服务器。这些被称为替代物(surrogate)或反向代理(re-verse proxy)的代理接收发给Web服务器的真实请求,但与Web服务器不同的是,它们可以发起与其他服务器的通信,以便按需定位所请求的内容。

缓存

缓存服务器,用于分摊对web服务器的访问压力,其核心逻辑是收到请求后

(1) 接收——缓存从网络中读取抵达的请求报文。

1
缓存检测到一条网络连接上的活动,读取输入数据。高性能的缓存会同时从多条输入连接上读取数据,在整条报文抵达之前开始对事务进行处理

(2) 解析——缓存对报文进行解析,提取出URL和各种首部。

1
缓存将请求报文解析为片断,将首部的各个部分放入易于操作的数据结构中。

(3) 查询——缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)。

1
2
3
本地副本可能存储在内存、本地磁盘,甚至附近的另一台计算机中。
专业级的缓存会使用快速算法来确定本地缓存中是否有某个对象。
如果本地没有这个文档,它可以根据情形和配置,到原始服务器或父代理中去取,或者返回一条错误信息。

(4) 新鲜度检测——缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。

1
2
3
4
5
6
HTTP通过缓存将服务器文档的副本保留一段时间。
在这段时间里,都认为文档是“新鲜的”,缓存可以在不联系服务器的情况下,直接提供该文档。
但一旦已缓存副本停留的时间太长,超过了文档的新鲜度限值(freshness limit),
就认为对象“过时”了,在提供该文档之前,缓存要再次与服务器进行确认,
以查看文档是否发生了变化。客户端发送给缓存的所有请求首部自身都可以强制缓存进行再验证,
或者完全避免验证,这使得事情变得更加复杂了。

(5) 创建响应——缓存会用新的首部和已缓存的主体来构建一条响应报文。

1
2
3
我们希望缓存的响应看起来就像来自原始服务器的一样,缓存将已缓存的服务器响应首部作为响应首部的起点。
然后缓存对这些基础首部进行了修改和扩充。
缓存负责对这些首部进行改造,以便与客户端的要求相匹配。

(6) 发送——缓存通过网络将响应发回给客户端。

1
2
一旦响应首部准备好了,缓存就将响应回送给客户端。
和所有代理服务器一样,代理缓存要管理与客户端之间的连接。

(7) 日志——缓存可选地创建一个日志文件条目来描述这个事务。

1
2
3
大多数缓存都会保存日志文件以及与缓存的使用有关的一些统计数据。
每个缓存事务结束之后,缓存都会更新缓存命中和未命中数目的统计数据(以及其他相关的度量值),
并将条目插入一个用来显示请求类型、URL和所发生事件的日志文件。

网关

网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。应用程序可以(通过HTTP或其他已定义的接口)请求网关来处理某条请求,网关可以提供一条响应。

应用程序网关API就是通用网关接口(Common Gateway Interface,CGI)。CGI是一个标准接口集,Web服务器可以用它来装载程序以响应对特定URL的HTTP请求,并收集程序的输出数据,将其放在HTTP响应中回送。在过去的几年中,商业Web服务器提供了一些更复杂的接口,以便将Web服务器连接到应用程序上去。

隧道

Web隧道允许用户通过HTTP连接发送非HTTP流量,这样就可以在HTTP上捎带其他协议数据了。使用Web隧道最常见的原因就是要在HTTP连接中嵌入非HTTP流量,这样,这类流量就可以穿过只允许Web流量通过的防火墙了。

隧道连接请求

1
2
CONNECT home.netscape.com:443 HTTP/1.0
User-agent: Mozilla/4.0

隧道连接响应

1
2
HTTP/1.0200 Connection Established
Proxy-agent: Netscape-Proxy/1.1

隧道在发出连接请求后,不必等待响应,就会以隧道形式发送数据到对端。如果收到认证响应或其他非成功响应,请求端需要做好重新准备数据的准备。


HTTP协议 III 服务类型
http://gadoid.io/2025/05/12/HTTP协议-III-服务类型/
作者
Codfish
发布于
2025年5月12日
许可协议