【浏览器工作原理】2. 数据包是如何完整送达浏览器的

引言

在网络中,一个文件会被拆分成很多数据包进行传输,在传输过程中有可能会出现丢包或者出错的情况,那么是如何保证页面文件被完整送达浏览器的?

下面通过数据包如何送达主机、主机如何将数据包转交给应用和数据是如何被完整地送达应用程序这三个问题来讲述数据的传输过程。

三个问题

1. 数据包如何送达主机--IP

  • 数据包要进行传输,需要符合国际协议(IP)标准,因此想要把数据包从主机A发送给主机B,需要知道主机B的ip地址。
  • 网络层会将IP头附加到数据包上,组成新的IP数据包,并交给底层(数据链路层和物理层)
  • 底层通过物理网络将数据包传输给主机B的网络层
  • 主机B拆开数据包的IP头信息及数据交给上层

2. 主机如何将数据包转交给应用 -- UDP

  • IP只负责把数据包传到对方电脑,但是并不知道是哪个程序,因此还需要用户数据包协议(UDP),
  • 通过端口号UDP把指定的数据包发送给指定的程序。

但是UDP不能保证数据可靠性,可能存在丢失及不能组装成完整的文件,基于这两个问题,引入了传输控制协议(TCP)。

3. 数据是如何被完整地送达应用程序 -- TCP

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议(提供重传机制和引入数据包排序机制)。

  • 建立连接:通过"三次握手"建立客户端和服务器之间的连接。
  • 传输数据:接收端需要对每个数据包进行确认操作,如何规定时间没有收到确认消息会触发重发机制。全部数据包到达接收端后,会按照TCP头中的序号为其排序,从而保证完成的数据。
  • 断开连接:数据传输完毕后会进行"四次挥手"来保证双方都能断开连接。

上面3个问题解决了,也就是有了对方的收信地址(IP)和路线(TCP),剩下的就到产生数据包内容的http协议出场了。

HTTP协议

http协议是建立在TCP连接基础上的,是一种允许浏览器向服务器获取资源的协议。浏览器端发起http请求流程如下:

  1. 构建请求:例如GET /index.html HTTP1.1
  2. 查找缓存:真正发起请求之前,浏览器会现在浏览器缓存中查询是否有要请求的文件,如有并没有过期则直接返回资源的副本,并结束请求,否则发起请求
  3. 准备IP地址和端口:浏览器会请求NDS返回域名对应的IP,http协议默认是80端口
  4. 等待TCP队列:同一个域名最多建立6个TCP连接,如果超过6个,会进入排队等待状态(将图片放到单独的cdn域名可以加快访问速度),如果不超过6个会建立TCP连接
  5. 建立TCP连接:该过程需要3次握手
  6. 发送HTTP请求:建立请求后,浏览器向服务器发送请求行(请求方法、请求URI和HTTP版本协议)和请求头
  7. 服务器根据请求返回内容:包括不同状态码的信息(响应行、响应头、响应体),例如200、304、404等状态码
  8. 断开连接:关闭TCP连接,如果有connection:keep-Alive,将继续保持打开状态,省去下次请求建立连接的时间,提升资源加载速度。

由此发现首次整个http请求要经历很多过程,假如资源没有过期再次请求还需要重新来一遍,确实比较浪费,如何解决这个问题,就用到了浏览器缓存机制。

缓存

对于二次页面打开很快,主要是第一次加载页面过程中,缓存了一些数据,例如DNS缓存和页面资源缓存。

  • DNS缓存:浏览器本地把对应的IP和域名关联起来
  • 页面资源缓存:主要是静态资源html、js、css及字体图片资源等。

服务器是如何让浏览器缓存页面资源的?

当服务器返回 HTTP 响应头给浏览器时,浏览器是通过响应头中的 Cache-Control字段来设置是否缓存该资源。比较常见的值有:

  1. no-store: 不做任何缓存
  2. no-cache:协商缓存,是否使用缓存需要和服务器确认,服务器返回304则使用缓存,否则不使用
  3. max-age: 缓存将在xx秒之后失效,xx秒内直接从缓存获取

浏览器缓存存在哪里?

  • 内存:存储空间比较小,访问速度快,关闭tab标签页会消失
  • 磁盘:存储空间比较大,访问速度慢,关闭tab标签页不会消失

浏览器根据请求资源情况决定放内存还是磁盘,例如css资源一般放到磁盘中,js及图片放到内存中。

总之,通过缓存不仅可以缓解服务器压力,提升性能,而且还能加快加载资源的速度,提升用户体验。

总结

本文简单介绍了数据包达到浏览器的各个流程,相信会解开很多迷惑问题,学习就是不断刷新认知的过程。

猜你喜欢

转载自juejin.im/post/7095689816938905613