从网络的角度来看,用户输入网址到网页显示,期间发生了什么?

步骤(总体来看)

  1. 浏览器根据输入网页的URL进行解析,解析出对应的请求方式、URL、端口等,生成HTTP请求报文。
  2. 浏览器查询缓存,检查缓存是否已经存在该URL的资源,如果缓存命中中直接读取并显示,比如相同的GET请求就会进行缓存。
  3. 缓存未命中,浏览器通过DNS协议获取域名对应的IP地址。
  4. 浏览器根据IP地址和端口号,向目标服务器发起一个TCP连接请求(TCP三次握手)。如果是HTTPS请求,则会在TCP三次握手后加一个SSL四次握手,发布SSL证书,确保连接的安全性。
  5. 若连接成功,则浏览器向服务器发送一个HTTP请求报文,请求获取网页的内容。
  6. 浏览器发送的HTTP请求报文经传输层被封装进TCP数据包,添加TCP头部信息,包括源端口、目标端口、序号等信息。
  7. 每个TCP数据包会经过网络层被封装成IP数据包,添加IP头部,包括源IP地址和目标IP地址,再进行路由的分组和转发。
  8. 网络接口层将IP数据包封装成数据帧,在数据链路层添加头部和尾部,包括源MAC地址和目标MAC地址(MAC地址是网络层的ARP协议根据IP地址查询出来的),数据帧在物理层通过物理介质(光纤、网线等)以比特流的形式进行传输。
  9. 服务器接收到比特流后,根据物理层、数据链路层、网络层、传输层和应用层的顺序将数据进行反向解析,得到最终只含有应用数据的信息,根据端口信息交由具体的程序进行处理。
  10. 服务器将请求处理结果,构建成一个HTTP响应报文,包含状态码(例如200,OK)、响应头和响应体(网页的HTML内容等),返回给浏览器。
  11. 浏览器接收服务器返回结果的流程同服务器接收结果的流程。
  12. 浏览器解析HTTP响应报文并进行渲染和解析,得到用户可以看到的页面。

步骤(从涉及到的协议来看)

        HTTP(或HTTPS)-> DNS -> TCP -> IP -> ARP

        HTTP用于发送含有请求内容和服务器信息的请求报文,DNS用于将域名解析成IP地址,TCP用于建立连接,IP用于路由的分组和转发,ARP用于查询MAC地址,为物理层的比特流的传输找到物理地址。

每一层的封装格式:

细节部分

1. 浏览器根据输入的网址解析请求

  • 用户在浏览器中输入一个网址(例如:https://www.example.com/index.html)。
  • 浏览器将 URL 分解为几个部分:协议(https)、域名(www.example.com)、路径(/index.html)、端口(默认HTTP为80,HTTPS为443)等。
  • 生成对应的 HTTP 请求报文,准备向目标服务器发起请求。

2. 浏览器查询缓存

  • 浏览器首先会检查本地缓存(如浏览器缓存、CDN缓存等)是否已存有该资源。
  • 如果缓存命中,浏览器直接使用缓存的数据,避免重复请求,提高页面加载速度。缓存的条件通常基于 HTTP 头部中的 Cache-Control 或 ETag 等字段。

3. 缓存未命中,DNS 查询域名

  • 如果缓存中没有需要的资源,浏览器会进行 DNS 查询。
  • 浏览器使用 DNS 协议 查询 www.example.com 域名对应的 IP 地址。
  • DNS 查询可以是本地缓存查询、操作系统缓存查询,若本地没有结果,则会通过配置的 DNS 服务器发送查询请求。

4. 浏览器与服务器建立 TCP 连接

  • 获取到 IP 地址后,浏览器通过该地址和目标服务器建立 TCP 连接。
  • TCP三次握手:浏览器和服务器之间通过 三次握手 过程建立连接:
    1. 客户端 发送 SYN(同步)报文。
    2. 服务器 收到 SYN 报文后,返回 SYN-ACK(同步-确认)报文。
    3. 客户端 再次发送 ACK(确认)报文,连接建立成功。
  • 如果是 HTTPS 请求,在TCP连接建立之后,浏览器会通过 SSL/TLS 握手 来确保数据传输的安全性。这个过程涉及证书交换、加密算法协商和生成共享密钥等步骤。

5. 浏览器发送 HTTP 请求报文

  • TCP连接建立成功后,浏览器发送 HTTP 请求报文,请求目标网页的内容。
  • 这个报文通常包含请求方法(GET、POST等)、请求头(如 User-Agent、Accept、Host 等)和请求体(如果是POST请求的话)等。

6. HTTP 请求通过传输层封装为 TCP 数据包

  • HTTP请求会被传输层(TCP协议)封装成一个 TCP 数据包。
  • 传输层会添加头部信息,包括源端口、目标端口、序列号、确认号等,用于保证数据的可靠传输。

7. TCP 数据包通过网络层封装为 IP 数据包

  • 接下来,TCP 数据包会被 网络层 封装成 IP 数据包。
  • 网络层会在数据包中添加 IP 头部,其中包含源 IP 地址和目标 IP 地址。IP 数据包将根据目标 IP 地址进行 路由,通过多个路由器转发,直到到达目标服务器。

8. 数据包通过数据链路层发送到物理层

  • 在网络接口层(数据链路层),IP 数据包被进一步封装为 数据帧,添加源和目标 MAC 地址(通过 ARP 协议 获取)。
  • 数据帧最终在物理层通过物理介质(例如光纤、网线等)以比特流形式进行传输。

9. 服务器接收到数据后进行反向解析

  • 目标服务器接收到来自客户端的比特流后,从物理层、数据链路层、网络层、传输层、应用层逐层解析。
  • 最终,服务器提取出 HTTP 请求报文,并将请求中的 目标端口 信息交给对应的 Web 服务程序(如 Apache、Nginx、Tomcat 等)进行处理。

10. 服务器构建 HTTP 响应报文

  • 服务器根据请求处理结果(如读取网页内容、执行数据库查询等),构建一个 HTTP 响应报文。
  • 响应报文通常包含 响应状态码(如 200 OK、404 Not Found 等)、响应头(如 Content-Type、Content-Length 等)以及响应体(网页内容、图片等)。

11. 服务器将 HTTP 响应发送回客户端

  • 构建好的 HTTP 响应报文 被服务器通过传输层封装为 TCP 数据包,并通过网络层、数据链路层、物理层逐步传输回客户端。

12. 浏览器接收响应并显示页面

  • 客户端浏览器接收到 HTTP 响应报文后,开始解析并呈现网页内容。
  • 如果响应中包含 HTML、CSS、JavaScript 文件,浏览器会继续发送请求来获取这些资源。
  • 最终,浏览器会将所有资源渲染为用户可以看到的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2511.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL创建表

1.要求 2.步骤 1.创建数据库: create database mydb6_product;2.使用数据库: use mydb6_product;3.创建employees表: create table employees(id int primary key,name varchar(50) not null, age int not null,gender varchar(10) not null default unknown&…

计算机网络的五层协议

计算机网络的五层协议 ‌计算机网络的五层协议模型包括物理层、数据链路层、网络层、传输层和应用层,每一层都有其特定的功能和相关的协议。‌‌1 ‌物理层‌:负责传输原始的比特流,通过线路(有线或无线)将数据转换为…

C语言初阶习题【30】字符串左旋

1. 题目描述——字符串左旋 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 2. 思路 先思考了下如何把最前面的字符串移到后面。 思路比较简单,就是把第一个字符保存下来&#xf…

ESP8266固件烧录

一、烧录原理 1、引脚布局 2、引脚定义 3、尺寸封装 4、环境要求 5、接线方式 ESP8266系列模块集成了高速GPI0和外围接口,这可能会导致严重的开关噪声。如果某些应用需要高功率和EMI特性,建议在数字I/0线上串联10到100欧姆。这可以在切换电源时抑制过冲…

word-break控制的几种容器换行行为详解

word-break 属性在控制换行行为时需要根据语言判断,对于中文 一个字符就是一个单词,字符换行不影响阅读理解,而对于英文来说,多个连续的字符才会是一个单词,例如中文的 早 英文为 morning。 morning7个字符才算一个单词…

年后找工作需要注意的事项

大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | A…

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置: 代码通过 FlinkKafkaProducer 创建 Kafka 生产者,用于向 Kafka 主题发送消息。Flink 执行环境的配置: 配置了 Flink 的检查点机制,确保消息的可靠性,支…

Windows 10 ARM工控主板连接I2S音频芯片

在Windows工控主板应用中,音频功能是一项基本的需求,USB声卡在x86/x64 Windows系统上就可直接免驱使用,但这些USB声卡通常不提供ARM上的Windows系统驱动。本文将介绍如何利用安装在ARM上的Windows工控主板——ESM8400的I2S接口、连接WM8960音…

机器学习实战33-LSTM+随机森林模型在股票价格走势预测与买卖点分类中的应用

大家好,我是微学AI,今天给大家介绍一下机器学习实战33-LSTM随机森林模型在股票价格走势预测与买卖点分类中的应用。对于LSTM随机森林模型的融合应用,我们选择股票价格走势预测与买卖点分类作为应用场景。股票市场数据丰富且对投资者具有实际价…

在VS2022中用C++连接MySQL数据库读取数据库乱码问题

1.正确安装mysql 安装之后的配置文件 2.在VS2022中进行相关配置 (1)右键项目,打开属性 注意是右键项目,不是.cpp文件 (2)配置属性-> VC目录 -> 包含目录 ->添加头文件路径(如图&am…

vue3+ts+element-plus 输入框el-input设置背景颜色

普通情况&#xff1a; 组件内容&#xff1a; <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置&#xff1a; ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…

Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统基础系列(四)

文章目录 概要1 Realsense相机驱动安装Method1: 使用Intel服务器预编译包Method2: 使用ROS服务器预编译包Method3: 使用SDK源代码方法对比总结 2 Realsense-ROS通讯配置与使用2.1 Realsense-ROS包安装2.2 ROS节点启动 小结Reference 概要 本文首先阐述了Realsense相机驱动安装…

初识 Git——《Pro Git》

Why Git&#xff1f; 1. 本地版本控制系统 Why&#xff1a; 许多人习惯用复制整个项目目录的方式来保存不同的版本&#xff0c;或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单&#xff0c;但是特别容易犯错。 有时候会混淆所在的工作目录&#xff0c;一不小心…

Freeswitch使用media_bug能力实现回铃音检测

利用freeswitch的media bug能力来在智能外呼时通过websocket对接智能中心的声音检测接口&#xff0c;来实现回铃音检测&#xff0c;来判断用户当前是否已响应&#xff0c;拒接&#xff0c;关机等。 1.回铃音处理流程 2.模块源码目录结构 首先新建一个freeswitch的源码的src/a…

我的年度总结

这一年的人生起伏&#xff1a;从曙光到低谷再到新的曙光 其实本来没打算做年度总结的&#xff0c;无聊打开了帅帅的视频&#xff0c;结合自己最近经历的&#xff0c;打算简单聊下。因为原本打算做的内容会是一篇比较丧、低能量者的呻吟。 实习生与创业公司的零到一 第一段工…

Hive SQL必刷练习题:留存率问题

首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总用户数 * 100% 解决思…

ASP.NET Core - 缓存之分布式缓存

ASP.NET Core - 缓存之分布式缓存 1. 分布式缓存的使用2. 分布式缓存的接入2.1 基于内存的分布式缓存2.2 基于 Redis 的分布式缓存 分布式缓存是由多个应用服务器共享的缓存&#xff0c;通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的…

机器学习中的凸函数和梯度下降法

一、凸函数 在机器学习中&#xff0c;凸函数 和 凸优化 是优化问题中的重要概念&#xff0c;许多机器学习算法的目标是优化一个凸函数。这些概念的核心思想围绕着优化问题的简化和求解效率。下面从简单直观的角度来解释。 1. 什么是凸函数&#xff1f; 数学定义 一个函数 f…

flutter R库对图片资源进行自动管理

项目中对资源的使用是开发过程中再常见不过的一环。 一般我们在将资源导入到项目中后,会通过资源名称来访问。 但在很多情况下由于我们疏忽输入错了资源名称,从而导致资源无法访问。 所以,急需解决两个问题: 资源编译期可检查可方便预览资源安装相关插件 在vscode中安装两…

闲谭SpringBoot--ShardingSphere分布式事务探究

文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表&#xff0c;且分库表处于一个库3.3 涉及分库表&#xff0c;且分库表处于多个库3.4 涉及分库表&#xff0c;且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…