网页请求和响应过程详解(从在浏览器上输入地址到获取到页面,都发生了什么)
网页请求和响应过程详解
0. 总结描述
1. 引言
在Web开发中,理解浏览器和服务器之间的请求和响应过程是至关重要的。这不仅有助于我们优化网站性能,还能帮助我们排查各种网络问题。本文将详细介绍从浏览器发送请求到服务器返回响应的全过程,涵盖各个技术细节。
2. 浏览器端处理URL
当用户在浏览器地址栏中输入一个URL并按下回车键时,浏览器首先会检查本地缓存,以确定是否已有该URL对应的缓存文件。
URL是什么
URL(Uniform Resource Locator,统一资源定位器)
URL的组成: 协议://{域名|主机名|IP}:端口/路径/文件名?参数#锚点
-
协议 Scheme/Protocol: http://、https://、ssh://、ftp://、file://、smtp:// 等
- Scheme 狭义的协议,特指在URL开始部分,指定用于访问资源的协议,一般小写
- Protocol 广义的协议,是一组规则和标准,定义如何通过网络传输和接收数据。它规定了网络设备之间交换的消息的格式、时序、顺序和错误检查,一般大写 - HTTP, FTP, TCP (Transmission Control Protocol), UDP (User Datagram Protocol), IP (Internet Protocol).
-
域名 Domain Name: 分不同的组来负责各子系统的名字。系统中的每一层叫做一个域,每个域用一个点分开。域名等级从右到左,依次排序。
- 根域名 最右侧,全部为root,一般省略
- 顶级域名(一级域名 Top-level Domain|TLD) 顶级域名由三种基本类型组成:
- 以机构性质命名的顶级域名(gTLD) 一般由三个字符组成,如 .com(商业机构)、.org(非盈利组织机构)、.int(国际组织)、.net(网络服务提供商)、.edu(教育机构)、.gov(美国政府机构)、.mil(美国军事机构) 等。近年来,随着互联网的发展,也出现了很多新的通用顶级域名(gTLD),有些可能超过三个字符,例如 .info、.museum 等。
- 以国家地区代码命名的顶级域名(nTLD/ccTLD) 一般由两个字符组成,如 .cn(中国)、.us(美国)、.uk(英国)、.jp(日本) 等。
- 基础结构域名 只有一个,arpa,用于反向域名解析。
- 二级域名(second-level domain|SLD)、三级域名... 从右到左依次排序,用.分割
-
主机名: 局域网中的主机名
-
IP: 服务器IP,可不通过DNS直接访问
-
端口 Port: 不进行主动声明时,默认取协议约定的默认端口,比如http-80,https-443,ssh-22,smtp-25
- WIKI 端口列表
-
路径 Path、文件名 File Name、参数 Parameters: 请求的资源的定位和条件
-
锚点 Anchor: 对页面的定位,不会发送给服务器
URL长度限制:
- 尽管不同顶级域名、国家和地区可能会有不同的政策和规定,但在域名长度的限制方面,基本遵循统一的国际标准:每个标签最多 63 个字符,总长度最多 253 个字符。
本地缓存检查
浏览器缓存机制通过HTTP头部字段来控制:
- Cache-Control: 指示请求和响应的缓存机制。
- Expires: 指定资源过期的日期和时间。
- ETag: 资源的唯一标识符,用于缓存验证。
如果缓存存在且未过期,浏览器直接使用缓存文件渲染页面。
构建HTTP请求
如果没有找到有效的本地缓存,浏览器开始构建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
3. DNS(Domain Name System)域名系统
DNS是一个域名和IP地址相互映射的分布式数据库。
当URL使用域名时,浏览器需要将域名转换为服务器的IP地址,这就是DNS的工作。
DNS解析过程
DNS解析包括递归查询和迭代查询:
DNS先在客户端进行对缓存的递归查询,当未命中时,使用本地域名服务器(LDNS)来解析,
-
递归查询:
DNS缓存存在于多个层次:- 客户端缓存: 浏览器缓存。
- 操作系统缓存: 操作系统级别(本地hosts文件缓存)。
- DNS解析器缓存: 本地DNS解析器缓存。
- 互联网服务提供商(Internet Service Provider|ISP)DNS缓存: 电信、移动、联通等...
TTL(Time To Live) 缓存生命周期。
-
迭代查询: 客户端逐步查询各级DNS服务器直到找到最终结果。
DNS缓存机制
首先本地DNS服务器向根域名服务器(Root Server)发起请求,查询顶级域名IP,再向顶级域名服务器请求,查询二级域名IP,依次类推...
4. 建立连接
得到服务器的IP地址后,浏览器与服务器之间需要通过TCP协议建立连接。
三次握手过程
TCP连接通过三次握手建立:
- SYN: 客户端发送一个SYN包请求连接。
- SYN-ACK: 服务器收到后返回SYN-ACK包确认连接请求。
- ACK: 客户端发送ACK包确认,连接建立。
四次挥手断开连接
数据传输完毕后,通过四次挥手断开连接:
- FIN: 客户端发送FIN包请求断开。
- ACK: 服务器确认,返回ACK包。
- FIN: 服务器发送FIN包请求断开。
- ACK: 客户端确认,返回ACK包,连接断开。
5. 服务器处理请求前
在向Web服务器发送请求之前,通常会经过以下一些可能的网络设备或服务:
-
防火墙:
防火墙位于网络的边界,用于监控和控制进出网络的数据流量。它可以根据预设的规则(如IP地址、端口、协议等)过滤和阻止特定类型的流量。
防火墙可以防止未经授权的访问和恶意攻击,确保网络安全。 -
负载均衡器:
如果使用了负载均衡器,客户端的请求可能会先到达负载均衡器。负载均衡器根据预设的算法(如轮询、最小连接数等)将请求分发到多个后端服务器。
负载均衡器帮助提高系统的性能和可用性,确保各个服务器均衡地处理请求负载。 -
反向代理服务器:
- 反向代理服务器位于客户端和真实服务器之间,它接收客户端的请求并将请求转发给后端的真实服务器。
- 反向代理服务器可以提供负载均衡、缓存、SSL终端等功能,有效地管理和优化请求的处理。
- 入口网关:
入口网关类似于反向代理服务器,它充当进入网络的主要入口点,处理来自外部网络的请求并将请求转发到内部服务器。
这些设备和服务通常位于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. CDN缓存(内容分发网络)
介绍
- 位置: 分布在全球各地的CDN服务器节点。
- 功能: 缓存静态内容(如图像、CSS、JavaScript)和动态内容(如HTML页面)。通过将内容缓存到离用户最近的节点,提高内容交付速度,减轻源服务器负载。
- 缓存策略: 由CDN配置和HTTP头(如 Cache-Control, Expires)控制。
CDN缓存触发时机
- 触发步骤: 在DNS解析完毕并获取IP地址后,浏览器发送HTTP请求到目标服务器时,如果该服务器使用CDN,CDN节点会接收请求并判断缓存。
- 判断逻辑:
如果请求的内容在CDN缓存中,CDN直接返回缓存内容。
如果请求的内容不在CDN缓存中,CDN向源服务器请求内容并缓存返回的内容。
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. 返回响应
服务器处理请求后生成HTTP响应并返回给浏览器。
HTTP响应的组成部分
- 状态行: 包含状态码(如200 OK)
- 头部: 包含Content-Type、Content-Length等信息
- 主体: 包含实际数据
浏览器接收并处理响应
浏览器逐层解封收到的数据,并解析HTML、CSS、JavaScript等资源,最终渲染页面。
10. 总结
理解网页请求和响应过程对于Web开发和优化至关重要。通过本文的详细介绍,希望能够帮助读者深入掌握这一过程,从而提高网站性能和用户体验。在实际应用中,可以根据具体情况进行优化,如合理使用缓存机制、选择合适的服务器中间件、配置CDN等。
扩展
cache-control: private
CDN,负载均衡器,反向代理的异同