欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浏览器输入url到发起http请求所经历的过程

程序员文章站 2022-12-09 17:30:25
用户输入url 当用户输入url,操作会将输入事件传递到中,在这过程中,浏览器可能会做一些预处理,比如 chrome 会根据历史统计来预估所输入字符对应的网站,例如输入goog,根据之前的历史发现...

用户输入url

当用户输入url,操作会将输入事件传递到中,在这过程中,浏览器可能会做一些预处理,比如 chrome 会根据历史统计来预估所输入字符对应的网站,例如输入goog,根据之前的历史发现 90% 的概率会访问「www.google.com 」,因此就会在输入回车前就马上开始建立 tcp 链接甚至渲染了。

接着是输入url之后,点击回车,这时浏览器会对 url 进行检查,首先判断协议,如果是 http 就按照 web 来处理,另外还会对这个 url 进行安全检查

安全检查完成之后,在浏览器内核中会先查看缓存,然后设置 ua 等 http 信息,接着调用不同平台下网络请求的方法。

注意:
浏览器和浏览器内核是不同的概念,浏览器指的是 chrome、firefox,而浏览器内核则是 blink、gecko,浏览器内核只负责渲染,gui 及网络连接等跨平台工作则是浏览器实现的

http网络请求

通过 dns 查询 ip;
通过 socket 发送数据

dns查询ip

dns,英文是domain name system,中文叫域名系统,是internet的一项服务,他将域名和ip地址相互映射的一个分布式

假设用户在浏览器中输入的是www.google.com,大概过程:

如果输入的是域名,则需要进行dns查询,将域名解析成ip;

进行dns查询的主机或软件叫做dns解析器,用户使用的工作站或电脑都属于解析器。域名解析就是利用dns解析器得到对应ip过程,解析器会向域名服务器进行查询处理。

主要过程如下:

从浏览器缓存中查找域名www.google.com的ip地址 在浏览器缓存中没找到,就在操作系统缓存中查找,这一步中也会查找本机的hosts看看有没有对应的域名映射(当然已经缓存在系统dns缓存中了) 在系统中也没有的话,就到你的来查找,因为路由器一般也会有自己的dns缓存

如果以上都没有找到,则继续往下向dns域名服务器查询

用户电脑的解析器向ldns(也就是local dns,互联网服务提供商isp),发起域名解析请求,查询www.google.com的ip地址,这是一个递归查找过程 在缓存没有命中的情况下,ldns向根域名服务器.查询www.google.com的ip地址,ldns的查询过程是一个迭代查询的过程 根告诉ldns,我不知道www.google.com对应的ip,但是我知道你可以问com域的授权服务器,这个域归他管 ldns向com的授权服务器问www.google.com对应的ip地址 com告诉ldns,我不知道www.google.com对应的ip,但是我知道你可以问google.com域的授权服务器,这个域归他管 ldns向google.com的授权服务器问www.google.com对应的ip地址 google.com查询自己的zone文件(也称区域文件记录),找到了www.google.com对应的ip地址,返回给ldns ldns本地缓存一份记录,把结果返回给用户电脑的解析器 在这之后,用户电脑的解析器拿到结果后,缓存在自己操作系统dns缓存中,同时返回给浏览器,浏览器依旧会缓存一段时间。

注意
域名查询时有可能是经过了cdn调度器的(如果有cdn存储功能的话)

而且,需要知道dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑dns-prefetch优化

tcp/ip请求

有了 ip 地址,就可以通过 socket api 来发送数据了,这时可以选择 tcp 或 udp 协议。

http本质是tcp协议。

tcp是一种面向有连接的传输层协议。他可以保证两端(发送端和接收端)通信主机之间的通信可达。他能够处理在传输过程中丢包、传输顺序乱掉等异常情况;此外他还能有效利用宽带,缓解网络拥堵。

建立tcp连接一开始都要经过三次握手:

第一次握手,请求建立连接,发送端发送连接请求报文
第二次握手,接收端收到发送端发过来的报文,可知发送端现在要建立联机。然后接收端会向发送端发送一个报文

第三次握手,发送端收到了发送过来的报文,需要检查一下返回的内容是否是正确的;若正确的话,发送端再次发送确认包

在tcp连接建立完成之后就可以发送http请求了。

注意
浏览器对同一个域名有连接数限制,大部分是 6,http1.0中往往一个资源下载就需要对应一个tcp/ip请求,而像 http 2.0 协议尽管只使用一个 tcp 连接来传输数据,但性能反而更好,而且还能实现请求优先级。