前端应该了解的计算机网络知识(二)在地址栏输入网址之后,都发生了什么(超详细解释)?浅谈http和https

一直没有总结计算机网络相关的知识。今天依靠《图解HTTP》和一些前辈的博客以总结。

当在地址栏输入网址,按下回车

首先发生第一步(域名解析)

浏览器希望的到该域名的ip地址。DNS(域名系统)负责查找,查找的过程如下:
1.浏览器缓存中查找。

2.在系统缓存中查找,找系统的DNS缓存,即hosts文件中域名与ip的映射关系。

3.如在操作系统缓存中也没找到,则查找本地DNS服务器缓存

4.若本地DNS服务器中没有找到,直接请求Root Server域名服务器(根域名服务器)

5.Root Server接到请求后返回给本地DNS服务器一个gTLD server(顶级域名服务器||查询域的主域名服务器)地址,仿佛再说:“本地DNS服务器,你好,我这里只能告诉你一位大神帮你解惑,他就是顶级域名服务器,快去找他吧”

6.本地DNS服务器用Root Server返回的gTLD server地址找到gTLD server并发出解析请求。

7.gTLD 服务器接受了请求,并且进行处理(查找并且返回此域名对应的Name Server),说:“发现了,这个域名对应的Name服务器(域名服务器),你去找他要IP地址吧!”

8.本地DNS服务器向Name Server发出解析的请求,Name Server找到该域名的IP,连同一个TTL值返回给本地DNS服务器,

9.欣喜的本地DNS服务器,立马缓存该域名和IP的对应关系(去到别人家的路线图),缓存的时间由TTL的值控制,心想:“我终于要完成任务了,我的主人马上就能去到这个域名的家里做客了!我拿到了去那里的路线图”

10.把解析结果返回给用户,用户根据TTL的值进行缓存。

跟着网上流行的示意图手画一份以示记录
在这里插入图片描述

第二步客户端与服务器建立TCP连接(三次握手,四次挥手)

目的:为了准确无误的将数据送达至目标处,采用三次握手策略,也就是TCP协议把数据包送出去后,并不会置之不理,而是一定会向对方确认是否成功送达了。
SYN与ACK都是属于TCP的标志
第一次握手:客户端想服务器发送请求,带着标志去(SYN=1),等待服务器进行确认
第二次握手:服务器收到了请求,并且确认了,回复一个指令(SYN=1,ACK=1)
第三次握手:客户端收到了服务器的回复指令,带着ACK指令返回确认,愉快地进行了TCP连接
在这里插入图片描述

四次握手:

(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1

第三步 浏览器与服务器进行数据传输(HTTP用于客户端和服务器之间的通信)

这里大体来说就是浏览器向服务器发送http请求报文,浏览器从服务器读取响应报文。

但是这里面还有很多的知识点值得整理以下

HTTP是不保存状态的协议

无状态协议。HTTP协议自身不对请求和响应之间的通信状态进行保存,也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理,使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。
那么这样的好处:简单,但随着web的发展已经由于无状态的性质而导致的问题开始变得棘手。例如购物网站,我们希望他在跳转别的页面时带着登录信息,保持登录状态

持久连接之前

HTTP协议的原始版本中,每进行一次HTTP通信就要断开一次TCP连接,当年的通信都是些容量小的文本传输,但是随着HTTP普及,文档中包含大量图片的情况多了起来。
在这里插入图片描述

比如,使用浏览器浏览一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面包含的其他资源,因此,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。

持久连接

为了解决TCP连接问题,持久连接(HTTP keep-alive),特点:只要任意一端没有明确提出断开连接,则保持TCO连接状态,1.1中,所有的连接默认都是持久连接。
在这里插入图片描述

管线化技术

在持久连接的基础下,可以进一步优化,提高速度,用图片进行说明:
在这里插入图片描述

Cookie

让服务器记得之前的客户端。
在这里插入图片描述
扩展到这里,回归正题

第四步:浏览器渲染页面(浏览器解析html代码,并请求html代码中的资源)

浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,向服务器请求下载。
这里用多线程下载,这时候,我们刚刚介绍的keep-alive就登场了。建立一次HTTP连接后,可以请求多个资源。下载资源顺序按照代码的顺序。
这里多介绍一个状态码:304,说明服务器端没有进行修改,浏览器会直接读取本地的该资源的缓存文件

渲染并呈现给用户
1.解析html源码=》创建一个DOM树
2.解析CSS代码,形成CSS对象模型CSSOM
3.利用DOM和CSSOM构建出一颗渲染树
4.浏览器就根据渲染树直接把页面绘制到屏幕上。

到这里介绍完毕了,当用户输入url回车后发生的事情。

HTTP+加密+认证+完整性保护=HTTPS

HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL和TLS协议代替而已、
通常HTTP直接河TCP通信,当使用SSL时,演变成先和SSL通信,再由SSL和TCP通信了。
所以,直接上个总结:HTTPS更安全。它似穿着SSL外套的HTTP。
特性:基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
特点总结:
SSL证书需要购买申请,功能越强大的证书费用越高
SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗(SSL有扩展可以部分解决这个问题,但是比较麻烦,而且要求浏览器、操作系统支持,Windows XP就不支持这个扩展,考虑到XP的装机量,这个特性几乎没用)。
根据ACM CoNEXT数据显示,使用HTTPS协议会使页面的加载时间延长近50%,增加10%到20%的耗电。
HTTPS连接缓存不如HTTP高效,流量成本高。
HTTPS连接服务器端资源占用高很多,支持访客多的网站需要投入更大的成本。
HTTPS协议握手阶段比较费时,对网站的响应速度有影响,影响用户体验。比较好的方式是采用分而治之,类似12306网站的主页使用HTTP协议,有关于用户信息等方面使用HTTPS。

关于这部分直接分享一个前辈的博客https://blog.csdn.net/xiaoming100001/article/details/81109617

猜你喜欢

转载自blog.csdn.net/qq_42285889/article/details/107973511