编程(48)----------网页打开的过程

news/2024/10/18 0:26:46/

一个网页的打开大致分为以下几步:

1.DNS查询

在进行网络访问过程中, 实际上所访问的是IP地址. 但输入的却仅仅是域名. 因为IP地址过于复杂不利于记忆. 因此, 需要将IP转换成更具有辨识度的域名. 通过输入域名, 以DNS进行转换为IP, 再发起请求. 

DNS在得到域名后会进行查询, 如果在本机中存在DNS缓存, 则会直接使用缓存显示于页面. 但是若没有, 就会进行DNS解析, 向上一级的DNS服务器发起请求, 直到本地获取到对应的IP并缓存至本地.

2.建立连接

当获取到正确的域名后, 就会对该域名发起建立连接的请求, TCP建立连接最常见的便是三次握手. 

                                                                                

这里有一个经典的问题, 为什么是三次而非两次或者四次. 这里以连麦举例.

假设甲乙二人连麦, 甲问:你听得见吗? 此为第一次握手

已回:我听得见, 你听的见吗? 此为第二次握手

甲回:我听得见. 此为第三次握手. 至此双方确认对方能听见, 连接建立

TCP的建立其实也是如此的过程, 之所以是三次, 是因为第二次将得到的回应和询问对方是否能收到回应给一起发送了过去. 因此是三次而非四次.

3.发送请求

连接建立以后, 作为客户端这一方就会发起请求. 这里以百度为例. 客户端会发起一个打开百度搜索的请求. 这个请求常见的以GET和POST居多. 但就自身而言, 更倾向于使用POST. POST与GET相比更为安全, 因为不会将传递参数显示在URL上. 但二者本质区别是GET是从服务器上获取数据, 而POST是向服务器内传递数据.

4. 返回响应

收到客户端发来的请求后, 服务器会根据请求返回数据. 这里返回的数据大都是前端的数据, 最后加载展示到前端页面上. 这样一次请求就结束了.

5.断开连接

断开连接, 可以形象的称为四次挥手. 这里也可以画图说明问题:

              

 这里大致的过程是客户端发起一个FIN断开连接的请求, 然后服务器回应, 确认断开. 稍后再以同样的方式, 以服务器再发一次, 这样双方就断开了连接. 

但是这里也存在一个问题, 为什么不能向三次握手那样将第二个ACK和第三个FIN一起发送从而变为三次挥手呢? 原因在于FIN的发送不是由内核控制的 ,而是由应用程序执行到相关的close方法才会触发. 但是ACK是由内核控制, 一旦收到FIN就会发送ACK. 但是对服务器而言, 要发送FIN也得执行到服务器相关的close方法才行. 因此, 服务器的ACK和FIN不一定同时执行. 所以二者不能像三次挥手那样融合在一起. 

当连接断开以后, 整个过程也就差不多结束了.

------------------------------最后编辑于2023.9.17 下午6点左右


http://www.ppmy.cn/news/1115807.html

相关文章

【Vue】vue2使用vue-pdf预览pdf文件,预览多页,在线预览方式二,vue页面内预览,无需额外pdfjs包,保姆级教程

系列文章目录 【Vue】vue2预览显示quill富文本内容,vue-quill-editor回显页面,v-html回显富文本内容 【Vue】vue2项目使用swiper轮播图2023年8月21日实战保姆级教程 【Vue】vue2使用pdfjs预览pdf文件,在线预览方式一,pdfjs文件包…

二叉树oj题

目录 层序遍历(一) 题目 思路 代码 层序遍历(二) 题目 思路 代码 根据二叉树创建字符串 题目 思路 代码 二叉树的最近公共祖先 题目 思路 代码 暴力版 队列版 栈版 bs树和双向链表 题目 思路 代码 前序中序序列构建二叉树 题目 思路 代码 中序后序…

深度学习入门:理解神经网络和实践

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 在本文中,我…

C语言入门Day_22 初识指针

目录 前言: 1.内存地址 2.指针的定义 3.指针的使用 4.易错点 5.思维导图 前言: 之前我们学过变量可以用来存储数据,就像一个盒子里面可以放不同的球一样。 这是一个方便大家理解专业概念的比喻。 在计算机世界里面,数据实…

Python vs C#:首先学习哪种编程语言最好?

进入编码可能很困难。 最艰难的部分? 决定先学什么语言。 当谈到 Python 与 C# 时,可能很难知道在您的决定中要考虑哪些因素。 我们为您提供了有关这些全明星编程语言的所有信息。 什么是 C#? 自 2000 年作为 Microsoft Visual Studio 的一部分开发 C# 以来,它一直是开发人…

【WFA】【Enhanced open】CT_OWE_DHgroup_STA_NoAssociation-AllGroupsRejected_10338_1

测试报告如下: Fail的关键log: 当连接到ap失败时,驱动程序将尝试连接到ap。如果ap仅支持Group 20,并且sta支持Group 19、20。sta将首先尝试Group 19,ap将通过状态代码77拒绝它。然后驱动程序将尝试连接Group 19的ap,仍然达到最大重试次数。那么sta将尝试第Group 20 。 …

Android 数据库封装(SQLite)

Android 数据库操作(SQLite) Android 数据库操作(SQLite)动态预览使用初始化生成表实体类插入数据批量插入删除数据删除全部修改数据查找(列表)查找(单条)条件查找(列表&…

三步实现Mybatis(Mybatis-Plus)多数据源配置

前言 要实现多数据源可以采用dynamic-datasource或者mybatis-mate,本文就以dynamic-datasource为例 dynamic-datasource简介 springboot 快速集成多数据源的启动器 使用文档(opens new window) 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主…