您当前的位置:首页 > 知乎文章

当我们在网址输入框输入一个url会发生什么?(1)

时间:2022-02-28 10:48:39  知乎原文链接  作者:网盾科技

当我们在网址输入框输入一个url会发生什么?
是这样?


还是这样?

还是这样?


你只知道短短几秒内你用一个url打开了一个不可描述的网站,那么你知不知道这几秒时间这条url都做了些什么呢?

我们先从一个经典的面试题说起
从输入URL到页面展现的过程

第一步:输入URL后,会先进行域名解析。优先查找本地host文件有无对应的IP地址,没有的话去本地DNS服务器查找,还不行的话,本地DNS服务器会去找根DNS服务器要一个域服务器的地址进行查询,域服务器将要查询的域名的解析服务器地址返回给本地DNS,本地DNS去这里查询就OK了。

第二步:浏览器拿到服务器的IP地址后,会向它发送HTTP请求。HTTP请求经由一层层的处理、封装、发出之后,最终经由网络到达服务器,建立TCP/IP连接,服务器接收到请求并开始处理。

第三步:服务器构建响应,再经由一层层的处理、封装、发出后,到达客户端,浏览器处理请求。

第四步:浏览器开始渲染页面,解析HTML,构建render树,根据render树的节点和CSS的对应关系,进行布局,绘制页面。

这4个步骤包含了一个HTTP请求的完整生命周期,我们今天着重介绍第2步和第3步,也就是请求是如何在两个物理端点之间进行通信的。数据的发出和接收必然会经历一些处理、解析的过程,这些过程在系统的不同层次进行。

分层

一个HTTP请求从源端发出到在终端接收的处理过程都是要经过以下四层。其中每一层都有各自的协议。

我们先来理解一下协议是什么,协议是经过约定,双方共同承认,并且需要共同遵守的规则。上面的每一层,都有各自的协议,协议的执行者是通信链路两端内的对应层。每一层通过协议来理解数据,并进行处理。上图中只举例出了最常见的协议,实际上每一层都有细分的协议:

· 应用层:应用程序负责将数据以相应规则(协议)进行包装,发给传输层

§ HTTP:超文本传输协议

§ FTP:文件传输协议

§ SMTP:简单邮件传送协议

§ SNMP:简单网络管理协议

· 传输层:负责将应用层传过来的数据进行分组,为确保终端接收数据的顺序和完整性,会对每个分组进行标记,交给网络层

§ TCP:传输控制协议

§ UDP:用户数据协议

· 网络层:负责将传输层发来的数据分组发送到目标终端

§ IP:网际协议

§ ICMP:Internet互联网控制报文协议

§ IGMP:Internet组管理协议

· 链路层:为网络层发送和接收数据单元

§ ARP:地址解析协议

§ RARP:逆地址解析协议

class="ztext-empty-paragraph">

封装和分用

数据在经过每一层的时候都要被对应的协议包装,到达终端的时候,要一层一层的解包。这两个过程叫封装和分用。发送时,用户数据被HTTP封装为报文,每一层会将上层传过来的报文作为本层的数据块,并添加自己的首部,其中包含了协议标识,这一整体作为本层报文向下传递。接收时,数据自下而上流动,经过每一层时被去掉报文首部,根据报文标识确定正确的上层协议,最终到应用层被应用程序处理。

封装

源端发送HTTP报文时,报文会以数据流的形式通过一条已经打开的TCP连接按序传输,TCP收到数据流后会将其分割成小的数据块,每个小块被添加的TCP首部与数据块共同组成了TCP分组,分组经由网络层发送,网络层遵循IP协议,当收到分组发送请求后,会将分组其放入IP数据报,填充报头,将数据报发经由链路层发送出去。这一过程经过每层的时候都会被增加一些首部信息,有时还需要增加尾部信息,每一层都会把数据封装到各自的报文中, 并在报文首部添加协议标识,这个过程叫封装

class="ztext-empty-paragraph">

分用

终端接收到一个以太网数据帧时,数据自底层向上流动,去掉发送时各层协议加上的报文首部,每层协议都要检查报文首部的协议标识,从而确定上层协议,保证数据被正确处理,这个过程叫分用。

终端从链路层接收到数据请求后,进入网络层对数据进行解析,交给给传输层,校验分组顺序和完整性,从数据块中取出数据,得到HTTP报文,交给应用层进行处理。这个过程会逐层剥离报头还原数据。

逐层分析

我们已经知道,数据是从源端自上而下到终端自下而上被一层层处理的,现在就来看一下每层都做了什么事情。

HTTP

HTTP属于应用层,用户触发交互所产生的行为数据和服务端对此的响应都由它封装成HTTP报文,再交由下层协议进行处理。报文的作用是客户端与服务端沟通的载体,双方都要遵循统一规则对信息进行处理,这一规则称为HTTP。客户端与服务端的交互往往非常复杂,为了使双方都能高效、明确、安全地通信(例如传递意图与状态、承载数据、携带认证信息、控制连接行为与缓存),需要依赖报文中的结构来实现,下一期我们会从结构来看看客户端与服务端的交互。

上一篇      下一篇    删除文章    编辑文章
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
相关文章
    无相关信息
栏目更新
栏目热门