浏览器发起http,到得到网页的整个过程

宏观流程

当服务端的服务器建立好后,http请求的网页资源位于服务端应用层某路径下的文件(比如index.html)。

在浏览器发起 HTTP 请求之前,需要经过 DNS 解析过程来获取服务器的 IP 地址。

1. DNS 解析

在浏览器发起 HTTP 请求之前,首先需要通过 DNS 解析 获得服务器的 IP 地址:

  • 用户在浏览器中输入网址(如 www.example.com)。

  • 浏览器向 DNS 服务器发送查询请求,解析域名为 IP 地址。

  • DNS 服务器返回相应的 IP 地址,浏览器获得目标服务器的地址。

注意:如果浏览器之前访问过该域名,可能会从本地缓存中获取 IP 地址,而不需要重新查询 DNS。

2. 三次握手(建立 TCP 连接)

  • DNS 解析完成后,浏览器已经获得了服务器的 IP 地址。

  • 然后,浏览器与服务器之间开始建立 TCP 连接 。这个过程通过 三次握手 完成:

    1. 客户端 → 服务器 :客户端发送 SYN(同步) 包,表示请求连接。

    2. 服务器 → 客户端 :服务器收到 SYN 包后,发送 SYN-ACK(同步-确认) 包,表示接受连接请求。

    3. 客户端 → 服务器 :客户端再发送 ACK(确认) 包,表示连接建立成功。

图片中accept成功就表示连接建立成功(accept不参与三次握手的过程)

三次握手四次挥手详见这篇博客

3. 发起 HTTP 请求

当 TCP 连接建立成功后,浏览器通过已建立的连接发起 HTTP 请求。HTTP 请求包括不同的部分,每一部分都有其重要的作用。

请求的主要组成部分:
  • 请求行

    • 请求方法 (如 GETPOSTPUTDELETE):定义了请求的操作类型。

    • 请求 URI (Uniform Resource Identifier):指定资源的位置。例如,GET /index.html HTTP/1.1 表示请求位于服务器根目录下的 index.html 文件。

    • HTTP 版本 :定义所使用的 HTTP 协议的版本,例如 HTTP/1.1HTTP/2

  • 请求头

    • Host:指定请求的服务器域名,特别是在同一 IP 地址上托管多个网站时(虚拟主机环境下)。

    • User-Agent:标识客户端的浏览器类型。

    • Accept :客户端能够处理的 MIME 类型,如 text/htmlapplication/json 等。

    • Cookie:浏览器携带的 cookies,通常用于会话管理和用户身份验证。

    • Authorization:包含认证信息,通常用于需要用户身份验证的请求。

  • 请求体 :对于 POSTPUT 请求,数据会在请求体中传送。请求体用于传输表单数据、文件上传内容或 JSON 数据等。

封装过程:
  • HTTP 请求会从应用层通过各个协议层封装,最终通过 链路层(如以太网)在网络上传输:

    • 应用层:构建 HTTP 请求。

    • 传输层:将 HTTP 请求数据封装为 TCP 数据段,增加传输控制信息。

    • 网络层:为数据包增加目标 IP 地址等路由信息。

    • 链路层:通过物理网络设备传输数据包。

4. 获取 HTTP 响应

服务器接收到 HTTP 请求后,会解析请求,处理相应的逻辑并生成响应。

HTTP 响应的结构:
  • 响应行:包括 HTTP 版本、状态码和状态描述。

    • 状态码 200 OK 表示请求成功。

    • 404 Not Found 表示请求的资源不存在。

    • 500 Internal Server Error 表示服务器遇到错误。

  • 响应头:包括响应的元数据,如:

    • Content-Type :指定响应体的内容类型,例如 text/html 表示 HTML 页面。

    • Content-Length:响应体的长度,告诉客户端返回数据的大小。

    • Cache-Control :指定缓存策略,例如 no-cache 表示禁止缓存。

  • 响应体:实际返回的数据内容,如 HTML 页面、JSON 数据、图片、视频等。

响应体解析:

浏览器会根据响应头的 Content-Type 来解析响应体。如果是 HTML 页面,浏览器将其解析并渲染为可视化网页。

5. 关闭连接

当 HTTP 请求-响应的交互完成后,TCP 连接可以被关闭。这个过程包括四次挥手:

  • 客户端 → 服务器 :客户端发送 FIN(结束)包,表示希望关闭连接。

  • 服务器 → 客户端 :服务器确认收到 FIN 包,发送 ACK(确认)包。

  • 服务器 → 客户端 :服务器发送 FIN 包,表示准备关闭连接。

  • 客户端 → 服务器 :客户端发送 ACK 包,确认关闭。

此时,连接被正式关闭,数据传输结束。

相关推荐
mounter6253 小时前
【硬核前沿】CXL 深度解析:重塑数据中心架构的“高速公路”,Linux 内核如何应对挑战?-- CXL 协议详解与 LSF/MM 最新动态
linux·服务器·网络·架构·kernel
ACP广源盛139246256735 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
嵌入式小企鹅6 小时前
蓝牙学习系列(八):BLE L2CAP 协议详解
网络·学习·蓝牙·ble·协议栈·l2cap
handsomestWei7 小时前
Docker引擎API接入配置
运维·http·docker·容器·api
广州灵眸科技有限公司7 小时前
为RK3588注入澎湃算力:RK1820 AI加速卡完整适配与评测指南
linux·网络·人工智能·物联网·算法
byoass8 小时前
csdn_upload_005
网络·安全·云计算
IT WorryFree8 小时前
飞塔防火墙与第三方设备进行IPSEC故障诊断期间,用户可能会观察到以下错误:
linux·服务器·网络
不是书本的小明10 小时前
K8S应用优化方向
网络·容器·kubernetes
~plus~11 小时前
.NET 8 C# 委托与事件实战教程
网络·c#·.net·.net 8·委托与事件·c#进阶
w61001046612 小时前
CKA-2026-Service
linux·服务器·网络·service·cka