开启网络请求线程到发出一个完整的http请求

输入URL到页面加载——开启网络请求线程到发出一个完整的http请求

解析URL

URL一般包括几大部分:

  • protocol:协议头,比如https、htpp、ftp等
  • host:主机域名或IP地址
  • port:端口号
  • path:目录路径
  • query:查询参数,比如 a=1&&b=2
  • fragment:即#后的hash值,一般用来定位到某个位置

网络请求都是单独的线程

每次网络请求时都需要开辟单独的线程进行,比如如果URL解析到http协议,就会新建一个网络线程去处理资源下载。

因此浏览器会根据解析出得协议,开辟一个网络线程,前往请求资源。

DNS查询得到IP

如果输入的是域名,需要进行dns解析成IP,会经历以下流程

  1. 如果浏览器缓存命中,直接使用浏览器缓存
  2. 如果浏览器没有缓存,找寻本地缓存
  3. 如果本地还没有,就向DNS服务器进行查询,查询到对应的IP

在这个过程中,DNS服务器解析过程是非常耗时的,因此如果解析域名过多,会让首屏加载变得过慢,这里会用到dns-prefetch优化

五层因特网协议栈

其实就是一个概念: 从客户端发出http请求到服务器接收,中间会经过一系列的流程。

简括就是:

从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接,再到网络层的ip寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输。

1.应用层(dns,http): DNS解析成IP并发送HTTP请求,应用层HTTP协议将规定好的数据放入TCP数据包的数据部分。
2.传输层(tcp,udp): 有了MAC地址和IP地址后,我们还需要端口来知道数据服务于哪个应用。通过UDP协议封装端口信息进入UDP数据包,标头占用8个字节,总长度不超过65535,并将其放入IP数据包的数据部分。但是UDP协议传输上可靠性较差,为了提高网络可靠性,TCP协议诞生了,与UDP摆放的位置时一样的。
3.网络层(IP,ARP): 通过IP能够知道两台电脑是否为同一子网络的机器,如果是同一子网络的机器的话直接通过ARP协议就可以找到对方的MAC地址进行发送数据,否则还需经过网关以及路由协议处理,同样通过IP协议将数据链路层的帧进行再次封装,IP数据包的标头长度为20到60字节,整个数据包总长为65555字节,封装后将其放入以太网数据包。如果IP数据包超过了1500字节,将分开发送。
4.数据链路层(PPP): 通过以太网协议将电信号封装成帧,每个帧分为标头和数据,标头由最初的18字节提升为现在的22字节,数据最短为46字节,最长为1500字节。如果数据很长就需要分包发送。计算机通过MAC地址以及广播的方式找到目标机器
5.物理层: 物理传输,通过双绞线,电磁波等介质将电脑连接

总结

接上文,假设用户输入的为Google官网,浏览器内核进程开启http协议请求线程,当用户按下回车时。

1.DNS查询

​ 首先本机查询本地hosts文件和本地DNS缓存中是否有记录,如果本机没有记录的话,会向本地DNS名称服务器进行递归查询,此时如果本地DNS名称服务器上有该网址的缓存记录,则返回结果。

本地DNS名称服务器上若没有此缓存记录,将会代替客户机进行迭代查询,迭代的顺序为根服务器,顶级域名DNS服务器,权限域名名称服务器,直到权限域名服务器将查询的结果返回给本地DNS名称服务器。

最终,本地DNS名称服务器将结果返回给客户机,此时客户机已知目标网站的IP地址,

2.应用层

应用层根据http协议构建规定格式的数据内容,并把数据放入到send_buffer中。并且应用层拼装套接字,通过系统调用传输层接口开启客户机与接收方的通信在完成3次握手后,将数据传入下层。

3.传输层

传输层主要负责端口对端口的连接,根据TCP协议,传输层将双发端口号等信息打上传输层的标头,与上层数据组成TCP的传送单位segment。通过TCP协议,控制了数据包的发送序列的产生,不断调整发送序列,实现流量控制以及数据完整。并把TCP包传输到下层。

4.网络层

网络层将本机IP地址及目的地IP地址封装为IP标头,并将传输层TCP包嵌入数据部分,形成packet。网络层负责数据包如何在网络上进行传输,如果接收方地址与当前路由器在同一子网的话直接发送,否则它将根据IP自己路由算法查找下一跳路由的地址。在查找到IP地址后,通过ARP协议找到接收方的MAC地址,这个MAC地址将与IP包共同传输给下层。

5.数据链路层

数据链路层根据以太网协议将双方MAC地址封装成标头,并将IP包放入数据部分,形成frame。因为以太网协议规定数据部分最大为1500字节,如果IP包内容过大需要进行拆分,每个数据都需要包含IP标头。frame在数据链路层协议下,完成了相邻节点的数据传输。

6.物理层

物理层负责将数据以bit为单位从主机传送到下一个目的地。下一个目的地接受到数据后,从物理层到网络层从下往上,根据每层的协议将frame拆包,如果此时网络层发现自己如果不是最终接收方的话,会将数据重新进行重新进行上述的封包处理,再经由物理层将数据发送到下一个目的地。

如果此时接受方就是目的地的话,网络层会将数据解包并进行差错检验,如果没有问题会将数据交付给传输层层,传输层根据数据包中端口,以及应用层协议,将数据交付给实际需要的应用层的应用程序。

此时服务器已经接收到来自于浏览器的请求了。

上篇 下篇

你可能感兴趣的:(JavaScript)