网页请求和响应过程详解
网页请求和响应过程详解
0. 总结描述
- 将url输入到浏览器。(浏览器缓存命中则返回响应)
- DNS将url中的域名解析为IP。(DNS先检查缓存,没有则向域名服务器查询,如果使用CDN,获取CDN分配的缓存服务器IP)
- 浏览器通过TCP三次握手,与对应服务器建立连接。
- 浏览器向服务器发送请求,服务器通过防火墙、WAF、负载均衡、反向代理等机制,判断是否阻止、过滤或转发请求。
- 请求发往真实服务器,由真实服务器中的web服务器中间件(nginx,apache)接收并处理。
- 服务器判断缓存,无缓存时对请求进行处理,此处又分为静态和动态处理。其中动态处理,指的就是对代码等的解析。获得“响应”。
- 获得的响应逐级递归返回,并逐级判断是否进行缓存。
- 浏览器渲染响应。
其中,请求和响应的过程都会通过对应网络模型中对应的"协议",对数据进行封装和解封。
整理时发现了这样一个详尽描述的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连接通过三次握手建立:
- SYN: 客户端发送一个SYN包请求连接。
- SYN-ACK: 服务器收到后返回SYN-ACK包确认连接请求。
- ACK: 客户端发送ACK包确认,连接建立。
四次挥手断开连接
数据传输完毕后,通过四次挥手断开连接:
- FIN: 客户端发送FIN包请求断开。
- ACK: 服务器确认,返回ACK包。
- FIN: 服务器发送FIN包请求断开。
- 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服务器发送请求之前,通常会经过以下一些可能的网络设备或服务:
-
防火墙:
防火墙位于网络的边界,用于监控和控制进出网络的数据流量。它可以根据预设的规则(如IP地址、端口、协议等)过滤和阻止特定类型的流量。
防火墙可以防止未经授权的访问和恶意攻击,确保网络安全。 -
负载均衡器:
如果使用了负载均衡器,客户端的请求可能会先到达负载均衡器。负载均衡器根据预设的算法(如轮询、最小连接数等)将请求分发到多个后端服务器。
负载均衡器帮助提高系统的性能和可用性,确保各个服务器均衡地处理请求负载。 -
反向代理服务器:
- 反向代理服务器位于客户端和真实服务器之间,它接收客户端的请求并将请求转发给后端的真实服务器。
- 反向代理服务器可以提供负载均衡、缓存、SSL终端等功能,有效地管理和优化请求的处理。
-
入口网关:
入口网关类似于反向代理服务器,它充当进入网络的主要入口点,处理来自外部网络的请求并将请求转发到内部服务器。 -
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等协议
封装与解封过程
-
应用层: 生成HTTP请求和响应。
- 在浏览器端生成HTTP请求,并在服务器端生成HTTP响应。
- 请求封装: 浏览器生成HTTP请求,包含HTTP头、请求方法、URL等信息。
- 响应封装: 服务器中间件生成HTTP响应,包含HTTP头、状态码、响应数据等信息。
-
传输层: 封装在TCP段内。
- 在建立TCP连接(如三次握手)时,浏览器和服务器分别将HTTP请求和响应封装在TCP段内。
- 请求封装: HTTP请求封装在TCP段内,包含源端口、目标端口、序列号、确认号等。
- 响应封装: HTTP响应封装在TCP段内,同样包含传输层控制信息。
-
网络层: 封装在IP包内。
- 浏览器和服务器将TCP段封装在IP包内进行传输。
- 请求封装: TCP段封装在IP包内,包含源IP地址、目标IP地址等。
- 响应封装: TCP段封装在IP包内,包含相应的网络层信息。
-
数据链路层: 封装在数据帧内。
- 最终,IP包被封装在数据帧内,通过物理网络进行传输。
- 请求封装: IP包封装在数据帧内,包含源MAC地址、目标MAC地址等。
- 响应封装: IP包封装在数据帧内,包含相应的链路层信息。
对应步骤的封装和解封
- 建立连接: TCP层的封装在此阶段进行。
- DNS解析: 使用UDP或TCP进行DNS查询,这里涉及到网络层和传输层的封装。
- 浏览器端处理和返回响应: 数据链路层到应用层的封装和解封在这些阶段分别进行。
9. 总结
理解网页请求和响应过程对于Web开发和优化至关重要。通过本文的详细介绍,希望能够帮助读者深入掌握这一过程,从而提高网站性能和用户体验。在实际应用中,可以根据具体情况进行优化,如合理使用缓存机制、选择合适的服务器中间件、配置CDN等。