HTTP是什么

HTTP是一种超文本传输协议,用于完成客户端和服务器等一系列的运作流程。协议是规则的约定。也就是说web是建立在HTTP协议上进行通信的。

TCP/IP协议

一般使用的网络都是在TCP/IP协议的基础上运作的,而HTTP属于它内部的一个子集。
在计算机和网络设备进行互相通信时,双方都必须基于相同的方法。
协议中包括:从电缆的规格到IP地址的选定方法,寻找异地用户的方法,双方建立通信的顺序,以及web页面显示要处理的步骤等等。将这些相关联的协议集合起来总称为TCP/IP

TCP/IP模型各层作用:

TCP/IP重要的点就是分层。有以下4层:应用层,传输层,网络层和数据链路层。
image.png

  • 应用层:应用层决定了向用户提供应用服务时通信的活动,比如FTP(文件传输协议)和DNS(域名解析系统)。HTTP协议也在该层。
  • 传输层:传输层对上层应用层,提供处于网络连接的两台计算机之间的数据传送。该层有2个不同的协议:TCP传输控制协议和UDP用户数据协议。
  • 网络层:用来处理在网络上的数据包。数据包是网络传输的最小数据单位。网络层的作用就是在多条路线中选出一条传输路线进行数据传输。
  • 链路层:用来 处理连接网络的硬件部分。包括操作系统,硬件的设备,路由器之类等都属于该层。

TPC/IP层次化的好处是:如果互联网由一个协议统一规划,某个地方需要改变设计时,就必须将所有部分整体替换掉。而分层之后只需要把变动的层替换掉。
把各层之间的接口部分规划好之后,每层内部的设计就可以自由改动。比如,处于应用层上的应用可以只考虑分配给自己的任务,不用去考虑其它的问题。

TCP/IP通信传输流:

TCP/IP协议进行通信时,会通过分层顺序和对方进行通信。客户端从应用层往下走,服务器端则从链路层往上走。
image.png

  1. 首先客户端在应用层发出一个HTTP请求。
  2. 接着,在传输层接收到应用层的数据后进行分割,给每个报文打上标记序号及端口号转发给网络层。
  3. 在网络层,添加通信目的地的MAC地址后转发给链路层。
  4. 接收端(服务器端)的服务器在链路接收到,按次序向上层发送,一直到应用层。传输到应用层才算真正接收到客户端发过来的HTTP请求。

    HTTP相关的协议

    HTTP客户端向服务端发送报文之前,需要用到IP,TCP,DNS这3个和HTTP密不可分的协议。

    IP网络协议

    IP网络协议处于网络层,IP协议的作用是把各种数据包传送给对方。但要保证正确的传送给对方,其中两个重要的条件是IP地址和MAC地址(像家庭地址和电话号码)。
    IP地址:是节点被分配到的地址。MAC地址:是网卡所属的固定地址。IP地址可以跟MAC地址进行配对。IP地址是可变的,MAC地址是不可变的。

    TCP协议

    TCP协议处于传输层,主要的作用是提供可靠的字节流服务。字节流服务指的是为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理。而可靠性的传输服务指的是能把数据准确可靠的传给对方。
    image.png
    三次握手:

  5. 客户端先发送一个带SYN标志的包给服务端
  6. 服务端收到后,回传一个带有SYN/ACK标志的数据包表示确认信息
  7. 最后客户端再传回一个带ACK标志的数据包,表示握手结束。

    DNS服务

    DNS服务和HTTP协议一样,处于应用层,主要作用是将域名解析成IP地址,DNS协议可以通过域名查找IP地址,也可以通过IP地址反查域名的服务。

    HTTP相关WEB服务器

    HTTP进行通信时,除客户端和服务器端之外,还有用于通信数据转发的程序。

    代理

    是具有转发功能的程序,存在于客户端和服务器之间,相当于一个中间人。将客户端发过来的请求转发给服务器。也会将服务器返回的数据转发给客户端。
    image.png

    网关

    是一种特殊的服务器,为其它 服务器的中间实体使用。用于将HTTP请求转化为其它协议通信。网关接收请求时就好像自己的资源源服务器一样对请求做处理。
    image.png

    隧道

    是按要求建立一条和其它服务器的通信线路,使用SSL加密通信。隧道的目的是保证客户端和服务器进行安全的通信。
    image.png

    缓存

    缓存是代理服务器(缓存服务器)或客户端本地磁盘(浏览器中的缓存)中保存的资源副本。利用缓存可以减少向源服务器的访问,主要目的是减少网络带宽的流量和通信时间。
    缓存服务器是代理服务器的一种,当代理转发从服务器返回的响应时,会保存一份资源的副本。缓存服务器的优点在于通过缓存可以避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求。

    HTTP缓存

    目前大多数项目的缓存方案:HTML:协商缓存。css,js,图片:强缓存(文件名带hash)
    缓存种类:数据库缓存,CDN缓存,代理服务器缓存,浏览器缓存。

我们第一次进入页面,请求服务器,然后服务器进行应答,浏览器根据Response Header来判断是否对资源进行缓存,如果响应头中Expires,Paragma和Cache-Control字段,代表这是强缓存,浏览器就会把资源缓存在memory cachedisk cache中。
第二次再请求时,浏览器判断请求参数,如果符合强缓存条件(没过期)就直接返回200,从本地缓存中拿数据。否则把响应参数存在request header请求头中,看是否符合协商缓存(资源没改变)符合就返回304,不符合服务器就返回全新资源。

强缓存

当我们访问URL的时候,浏览器会判断 请求的资源是否在有效期内,如果在有效期,就直接从缓存中读取资源,同时返回200.
强缓存通过Expires,ParagmaCache-Control字段设置。

Expires

是不个时间戳,服务器返回请求结果的到期时间。再次发起时如果未超过,可以直接用缓存,超过就重新请求。
注意的是:它判断是否过期是用本地时间的,而本地时间是可以自己改的。优先级最低

Cache-Control

优先级最高,主要取值:

  • public:资源客户端和服务器都可以缓存
  • privite:资源只有客户端可以缓存
  • no-cache:客户端缓存资源,但是是否缓存需要经过协商缓存来验证。
  • no-store:不使用缓存
  • max-age:缓存保质期

    Pragma

    取值no-cacheCache-Control=no-cache效果一样。客户端缓存资源,但是是否缓存需要经过协商缓存来验证。

强缓存主要把资源放在memory cache和disk cache中。
一般存储图像网页等主要放在disk cache中
操作系统缓存文件等大部分都会在memory cache中,比较快。
查找浏览器缓存位置:Service Worker->Memory Cache->Disk Cache->Push Cache.

协商缓存

是强缓存失效之后,带着缓存标识去向服务器发送get请求,由服务器根据缓存标识来决定是否使用缓存的过程,如果协商缓存生效,返回304,指向缓存地址。协商缓存失效,返回200和请求的结果。主要通过Last-Modified/If-Modified-Since和Etag/If-None-Match来设置。

Last-Modified/If-Modified-Since

Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间。
If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,通过这个值告诉服务器该资源上次请求返回的最后修改时间。服务器通过If-Modified-Since跟资源在服务器上的最后被修改的时间做对比,如果服务器上的最后修改时间大于If-Modified-Since,说明该资源又被更改了,则重新返回资源,状态为200。反之则返回304,可继续用缓存。

Etag/If-None-Match

优先级高,可以费性能。Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成)。
If-None-Match是客户端再次发起请求时,携带上次请求返回的Etag值,服务器收到后会根据If-None-Match与该资源在服务器的Etag对比,一致则返回304资源无更新用缓存,否则返回该资源,200。

区别

强缓存不发请求到服务器,所以有时候资源更新了浏览器也不知道。但是协商缓存会发请求到服务器
大部分web服务器都默认开启协商缓存。

当ctrl+f5时,会路过强缓存和协商缓存,直接从服务器加载。
当f5时,会跳过强缓存,但是会检查协商缓存。


Waxiangyu
670 声望30 粉丝