网页请求和响应过程详解

网页请求和响应过程详解

0. 总结描述

  1. 将url输入到浏览器。(浏览器缓存命中则返回响应)
  2. DNS将url中的域名解析为IP。(DNS先检查缓存,没有则向域名服务器查询,如果使用CDN,获取CDN分配的缓存服务器IP)
  3. 浏览器通过TCP三次握手,与对应服务器建立连接。
  4. 浏览器向服务器发送请求,服务器通过防火墙、WAF、负载均衡、反向代理等机制,判断是否阻止、过滤或转发请求。
  5. 请求发往真实服务器,由真实服务器中的web服务器中间件(nginx,apache)接收并处理。
  6. 服务器判断缓存,无缓存时对请求进行处理,此处又分为静态和动态处理。其中动态处理,指的就是对代码等的解析。获得“响应”。
  7. 获得的响应逐级递归返回,并逐级判断是否进行缓存。
  8. 浏览器渲染响应。

其中,请求和响应的过程都会通过对应网络模型中对应的"协议",对数据进行封装和解封。

整理时发现了这样一个详尽描述的git项目: what-happend-when

1. 引言

在Web开发中,理解浏览器和服务器之间的请求和响应过程是至关重要的。这不仅有助于我们优化网站性能,还能帮助我们排查各种网络问题。本文将详细介绍从浏览器发送请求到服务器返回响应的全过程,涵盖各个技术细节。

2. 浏览器端处理URL

当用户在浏览器地址栏中输入一个URL并按下回车键时,浏览器首先会检查本地缓存,以确定是否已有该URL对应的缓存文件。

url是什么

本地缓存检查

浏览器缓存机制通过HTTP头部字段来控制:

  • Cache-Control: 指示请求和响应的缓存机制。
  • Expires: 指定资源过期的日期和时间。
  • ETag: 资源的唯一标识符,用于缓存验证。

如果缓存存在且未过期,浏览器直接使用缓存文件渲染页面。

3. DNS(Domain Name System)域名系统

当浏览器未找到本地缓存,且URL使用域名时,需要将域名转换为服务器的IP地址,这就是DNS的工作。

DNS解析过程

DNS是一个域名和IP地址相互映射的分布式数据库

DNS也会有缓存,不过要注意的是,它的缓存是“域名和IP的映射”,而不是url对应资源的缓存。DNS缓存分别在客户端,操作系统和本地DNS服务器多个层级存储,递归查询。

  • 客户端缓存: 浏览器缓存。
  • 操作系统缓存: 操作系统级别(本地hosts文件缓存)。
  • DNS解析器缓存: 本地DNS解析器缓存。
  • 互联网服务提供商(Internet Service Provider|ISP)DNS缓存: 电信、移动、联通等...

同样,如果未找到缓存,有递归和迭代两种方式进行查找(一般采用递归)。

  • 迭代: 由本地DNS服务器,分别向 根域名服务器->顶级域名服务器->权威域名服务器 逐个请求,拿到真实IP。
  • 递归: 由本地DNS服务器,向 根域名服务器请求,根域名服务器向顶级域名服务器请求,...,拿到真实IP。

ps:《流浪地球2》中的重启互联网,指的就是重启根域名服务器。

CDN(Content Delivery Network 内容分发网络)解析IP

由于物理距离和过多请求等会影响网络传输的速度和稳定,通过在网络各处放置节点服务器(边缘节点,缓存服务器),构建了一层在互联网基础上的一层智能虚拟网络。简单来讲,CDN就是根据用户位置分配最近的资源。

当服务器想使用CDN时,选择一个可靠的CDN服务商进行注册,将DNS对应的域名配置为CNAME(Canonical Name|规范名|别名),指向CDN服务商,再由CDN根据距离带宽等分配合适的IP,指向最快的缓存服务器。(当缓存服务器中无缓存时,会向源站请求并获取)

DNS中,直接返回IPv4地址的为A记录,别名为CNAME,另外还有很多,不做展开。

4. 建立连接

得到服务器的IP地址后,浏览器与服务器之间需要通过TCP协议建立连接。

三次握手过程

TCP连接通过三次握手建立:

  1. SYN: 客户端发送一个SYN包请求连接。
  2. SYN-ACK: 服务器收到后返回SYN-ACK包确认连接请求。
  3. ACK: 客户端发送ACK包确认,连接建立。

四次挥手断开连接

数据传输完毕后,通过四次挥手断开连接:

  1. FIN: 客户端发送FIN包请求断开。
  2. ACK: 服务器确认,返回ACK包。
  3. FIN: 服务器发送FIN包请求断开。
  4. ACK: 客户端确认,返回ACK包,连接断开。

构建HTTP请求

一个完整的HTTP请求包含:

  • 请求行: 包括请求方法(如GET、POST)、请求的URL和HTTP协议版本。
  • 请求头部: 包含如User-Agent、Accept等信息。
  • 请求主体: 在POST请求中包含要发送的数据。

示例HTTP请求:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html

5. 服务器处理请求前

在向Web服务器发送请求之前,通常会经过以下一些可能的网络设备或服务:

  1. 防火墙
    防火墙位于网络的边界,用于监控和控制进出网络的数据流量。它可以根据预设的规则(如IP地址、端口、协议等)过滤和阻止特定类型的流量。
    防火墙可以防止未经授权的访问和恶意攻击,确保网络安全。

  2. 负载均衡器
    如果使用了负载均衡器,客户端的请求可能会先到达负载均衡器。负载均衡器根据预设的算法(如轮询、最小连接数等)将请求分发到多个后端服务器。
    负载均衡器帮助提高系统的性能和可用性,确保各个服务器均衡地处理请求负载。

  3. 反向代理服务器

  • 反向代理服务器位于客户端和真实服务器之间,它接收客户端的请求并将请求转发给后端的真实服务器。
  • 反向代理服务器可以提供负载均衡、缓存、SSL终端等功能,有效地管理和优化请求的处理。
  1. 入口网关
    入口网关类似于反向代理服务器,它充当进入网络的主要入口点,处理来自外部网络的请求并将请求转发到内部服务器。

  2. WAF(Web应用防火墙)
    Web 应用防火墙 (WAF) 可防御恶意攻击和非授权流量,包括机器人流量、注入攻击和应用层拒绝服务 (DoS) 攻击,保护 Web 应用安全。WAF 将帮助您创建和管理规则,更好地防御网络威胁,包括 IP 地址攻击、HTTP 标头攻击、HTTP 正文攻击、URI 字符串攻击、跨站点脚本 (XSS) 攻击、SQL 注入以及其他 OWASP 漏洞。在部署 Web 应用防火墙后,企业将能够有效保护 Web 应用,同时收集访问日志,满足合规和分析需求。

这些设备和服务通常位于Web服务器之前,它们在请求到达真实的Web服务器之前,扮演着安全过滤、负载分发或者代理转发的角色。它们的存在和功能,有助于提升整体网络安全性、性能和可伸缩性。

6. 服务器处理请求

6.1 Web服务器中间件接收请求

  • 服务器接收到请求后,由web中间件进行处理。
  • 它们工作在应用层(第7层),主要负责接收HTTP请求、处理静态文件、执行动态内容生成(如PHP脚本)、处理反向代理等功能。
  • 它们的主要作用是将客户端发来的HTTP请求转发给后端的应用程序(如PHP、Python等),并将处理结果返回给客户端。
  • 一般会监听80(http)和443(https)端口。

常见服务器中间件

  • Nginx: 高并发处理能力和低内存占用,常用作反向代理服务器和负载均衡器。
  • Apache: 模块化设计,支持大量模块,配置灵活。

负载均衡、反向代理

缓存机制

  • 静态资源缓存: 静态资源如HTML、CSS、JavaScript文件的缓存。
  • 动态内容缓存: 动态生成内容的缓存,通过反向代理或应用层缓存机制实现。

6.2 应用程序服务器(如PHP-fpm、Tomcat、Node.js、Gunicorn等)

  • 如果使用了应用程序服务器,请求会进一步转发到应用程序服务器上。
  • 应用程序服务器负责运行应用程序或服务,并提供相应的处理能力。

应用程序服务器,解析动态内容

7. 返回响应

服务器处理请求后生成HTTP响应并返回给浏览器。

HTTP响应的组成部分

  • 状态行: 包含状态码(如200 OK)
  • 头部: 包含Content-Type、Content-Length等信息
  • 主体: 包含实际数据

浏览器接收并处理响应

浏览器逐层解封收到的数据,并解析HTML、CSS、JavaScript等资源,最终渲染页面。

8. 数据封装与解封

数据传输中的封装和解封遵循网络层次模型。在整个流程中,每层都添加特定的头部信息来确保数据的完整性和安全性。

OSI模型与TCP/IP模型

  • 应用层: HTTP/HTTPS协议
  • 传输层: TCP协议
  • 网络层: IP协议
  • 数据链路层: 以太网或Wi-Fi等协议

封装与解封过程

  1. 应用层: 生成HTTP请求和响应。

    • 在浏览器端生成HTTP请求,并在服务器端生成HTTP响应。
    • 请求封装: 浏览器生成HTTP请求,包含HTTP头、请求方法、URL等信息。
    • 响应封装: 服务器中间件生成HTTP响应,包含HTTP头、状态码、响应数据等信息。
  2. 传输层: 封装在TCP段内。

    • 在建立TCP连接(如三次握手)时,浏览器和服务器分别将HTTP请求和响应封装在TCP段内。
    • 请求封装: HTTP请求封装在TCP段内,包含源端口、目标端口、序列号、确认号等。
    • 响应封装: HTTP响应封装在TCP段内,同样包含传输层控制信息。
  3. 网络层: 封装在IP包内。

    • 浏览器和服务器将TCP段封装在IP包内进行传输。
    • 请求封装: TCP段封装在IP包内,包含源IP地址、目标IP地址等。
    • 响应封装: TCP段封装在IP包内,包含相应的网络层信息。
  4. 数据链路层: 封装在数据帧内。

    • 最终,IP包被封装在数据帧内,通过物理网络进行传输。
    • 请求封装: IP包封装在数据帧内,包含源MAC地址、目标MAC地址等。
    • 响应封装: IP包封装在数据帧内,包含相应的链路层信息。

对应步骤的封装和解封

  • 建立连接: TCP层的封装在此阶段进行。
  • DNS解析: 使用UDP或TCP进行DNS查询,这里涉及到网络层和传输层的封装。
  • 浏览器端处理和返回响应: 数据链路层到应用层的封装和解封在这些阶段分别进行。

9. 总结

理解网页请求和响应过程对于Web开发和优化至关重要。通过本文的详细介绍,希望能够帮助读者深入掌握这一过程,从而提高网站性能和用户体验。在实际应用中,可以根据具体情况进行优化,如合理使用缓存机制、选择合适的服务器中间件、配置CDN等。

扩展

cache-control: private

CDN,负载均衡器,反向代理的异同

参考文章

DNS 域名解析

「DNS」和「CDN」

DNS域名解析,以及A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR说明

posted @ 2024-06-14 18:02  cy_b  阅读(285)  评论(0编辑  收藏  举报