打开一个网页背后都发生了什么


这是一个老生常谈的话题,我今天还是想凭我自己的理解,用自己的话来捋一捋这个过程。


对于我们用户来说,只需要在浏览器中输入或者点开一个 url ,我们就直接可以看到网页内容了,但是这背后却经历非常复杂的故事,简单来说主要有下面四大过程:


1、浏览器根据域名找到对应的 ip 地址(远程服务器)。

2、浏览器与远程服务器建立连接(tcp 连接,三次握手)。

3、浏览器与远程服务器发送和接收数据。

4、浏览器与远程服务器断开连接。


接下来我们再来详细解释一遍。


1、域名解析为ip

ip 即为网络为每一台电脑分配的一个地址,你可以简单的理解为一个门牌号,要想找到某台电脑,就需要先知道它的 ip 地址。由于 ip 地址不方便被记住等原因,于是有了域名,理论上一个域名对应一个 ip。浏览器拿到域名后,第一件事就是要把域名解析成 ip,然后找到这个 ip 对应的机器。


通常使用 DNS 解析来帮域名找到对应 ip 地址,为了让这个查找过程更高效,浏览器和操作系统都会将每次的解析结果缓存起来。


即下次再要解析某个域名时,就会先去缓存里去看下,如果缓存里没有对应数据,就再去根域名服务器、顶级域名服务器等查找 ip。


总之在这一过程中,不管用什么样的方式,最终都是为了把域名解析为 ip 地址。


2、建立连接

既然已经了对方的 ip 后,那就要开始建立连接了。由于 http 是基于 tcp 协议的,tcp 建立连接需要经历三次握手。下面模拟一下三次握手的过程:


浏览器A:你好,我是浏览器A,我想找你玩儿。

远程服务器B:你好啊,浏览器A,那你来吧。

浏览器A:好的嘞,我这就去了。


这就是三次握手的大致流程,tcp 的三次握手确保了每一个消息都有去有回。一旦某个消息得不到有效回应 tcp 协议就会重发该消息,直到得到有效回应。


tcp 属于传输层,其实传输层还有一种 udp 协议,udp 和 tcp 最大的区别就是不需要建立连接,也就是说 udp 无需像 tcp 通过三次握手建立连接才能开始通信,udp 发出包也不用确保能否得到有效响应,只管发出去就行了。udp 协议通常被用于对实时性要求性比较高的场景,比如直播等。


3、服务器响应和返回

建立连接后,就可以互相传送数据了。浏览器按照 http 协议的格式将数据组装好向服务器发起请求,服务器接收到请求并将处理结果响应给浏览器。


服务端的 http 服务器软件一般有 Apache 和 Nginx,Apache 或 Nginx 又将请求交由具体的编程语言(Java、Python、PHP 等)去处理。


服务器又将程序处理的结果按照 http 协议格式原路返回给客户端浏览器,浏览器则再根据返回的数据渲染页面和数据。


4、断开连接

在完成了数据通信之后,就要考虑断开连接了,毕竟任务完成了就要空出系统资源来。tcp 的断开相对于连接来说,其实是有四次握手的,通常被称作四次挥手,就是挥手拜拜了。


浏览器A:你好,时间不早了,我想回去了。

远程服务器B:哦哦,我看下几点了啊。

远程服务器B:哎呀,确实不早了,那你先回吧,拜拜。

浏览器A:好的,拜拜。


在这里你可能会问,为什么断开连接不能像建立连接一样只需三次挥手呢,即浏览器在告诉远程服务器想要断开的时候,服务器干嘛不直接断开呢?


因为服务器在收到断开消息的时候,可能还有任务或数据没有处理完成,在这个时候服务器会再去确认是否所有数据都处理完毕了,如果确实都处理完成了,服务器再告诉浏览器可以断开了。


好了,浏览器打开一个网页背后差不多就是这些流程了,但其实每一个过程都非常复杂。


比如 DNS 解析,是怎么去查缓存的,如果没有缓存又是怎么样去根域名服务器查询的,全球那么多的域名都会去根域名服务器查询 ip 吗,根域名服务器又是怎么应对这种超高并发的请求呢?


本文中讲的都是基于 http 的,对一些安全性要求比较高的比如支付等业务我们通常会使用 https, 那么 http 和 https 究竟是有啥区别呢,https 加密方式是怎样的一个原理?


关于这些问题,后面我会再单独详细讲,欢迎关注。原创文章不易,如果文章对你有一点点帮助或启发,希望能给文章一个好看,有问题也欢迎留言与我交流。

关键词: 网络协议

网友留言(0条)

发表评论