HTTP
是什么
HTTP
是一种超文本传输协议,用于完成客户端和服务器等一系列的运作流程。协议是规则的约定。也就是说web
是建立在HTTP
协议上进行通信的。
TCP/IP
协议
一般使用的网络都是在TCP/IP
协议的基础上运作的,而HTTP
属于它内部的一个子集。
在计算机和网络设备进行互相通信时,双方都必须基于相同的方法。
协议中包括:从电缆的规格到IP
地址的选定方法,寻找异地用户的方法,双方建立通信的顺序,以及web
页面显示要处理的步骤等等。将这些相关联的协议集合起来总称为TCP/IP
。
TCP/IP
模型各层作用:
TCP/IP
重要的点就是分层。有以下4层:应用层,传输层,网络层和数据链路层。
- 应用层:应用层决定了向用户提供应用服务时通信的活动,比如
FTP
(文件传输协议)和DNS
(域名解析系统)。HTTP
协议也在该层。 - 传输层:传输层对上层应用层,提供处于网络连接的两台计算机之间的数据传送。该层有2个不同的协议:
TCP
传输控制协议和UDP
用户数据协议。 - 网络层:用来处理在网络上的数据包。数据包是网络传输的最小数据单位。网络层的作用就是在多条路线中选出一条传输路线进行数据传输。
- 链路层:用来 处理连接网络的硬件部分。包括操作系统,硬件的设备,路由器之类等都属于该层。
TPC/IP
层次化的好处是:如果互联网由一个协议统一规划,某个地方需要改变设计时,就必须将所有部分整体替换掉。而分层之后只需要把变动的层替换掉。
把各层之间的接口部分规划好之后,每层内部的设计就可以自由改动。比如,处于应用层上的应用可以只考虑分配给自己的任务,不用去考虑其它的问题。
TCP/IP
通信传输流:
TCP/IP
协议进行通信时,会通过分层顺序和对方进行通信。客户端从应用层往下走,服务器端则从链路层往上走。
- 首先客户端在应用层发出一个
HTTP
请求。 - 接着,在传输层接收到应用层的数据后进行分割,给每个报文打上标记序号及端口号转发给网络层。
- 在网络层,添加通信目的地的
MAC
地址后转发给链路层。 接收端(服务器端)的服务器在链路接收到,按次序向上层发送,一直到应用层。传输到应用层才算真正接收到客户端发过来的
HTTP
请求。和
HTTP
相关的协议在
HTTP
客户端向服务端发送报文之前,需要用到IP
,TCP
,DNS
这3个和HTTP
密不可分的协议。IP
网络协议IP
网络协议处于网络层,IP
协议的作用是把各种数据包传送给对方。但要保证正确的传送给对方,其中两个重要的条件是IP
地址和MAC
地址(像家庭地址和电话号码)。IP
地址:是节点被分配到的地址。MAC
地址:是网卡所属的固定地址。IP
地址可以跟MAC
地址进行配对。IP
地址是可变的,MAC
地址是不可变的。TCP
协议TCP
协议处于传输层,主要的作用是提供可靠的字节流服务。字节流服务指的是为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理。而可靠性的传输服务指的是能把数据准确可靠的传给对方。
三次握手:- 客户端先发送一个带
SYN
标志的包给服务端 - 服务端收到后,回传一个带有
SYN/ACK
标志的数据包表示确认信息 最后客户端再传回一个带
ACK
标志的数据包,表示握手结束。DNS
服务DNS
服务和HTTP
协议一样,处于应用层,主要作用是将域名解析成IP
地址,DNS
协议可以通过域名查找IP
地址,也可以通过IP
地址反查域名的服务。和
HTTP
相关WEB
服务器HTTP
进行通信时,除客户端和服务器端之外,还有用于通信数据转发的程序。代理
是具有转发功能的程序,存在于客户端和服务器之间,相当于一个中间人。将客户端发过来的请求转发给服务器。也会将服务器返回的数据转发给客户端。
网关
是一种特殊的服务器,为其它 服务器的中间实体使用。用于将
HTTP
请求转化为其它协议通信。网关接收请求时就好像自己的资源源服务器一样对请求做处理。隧道
是按要求建立一条和其它服务器的通信线路,使用
SSL
加密通信。隧道的目的是保证客户端和服务器进行安全的通信。缓存
缓存是代理服务器(缓存服务器)或客户端本地磁盘(浏览器中的缓存)中保存的资源副本。利用缓存可以减少向源服务器的访问,主要目的是减少网络带宽的流量和通信时间。
缓存服务器是代理服务器的一种,当代理转发从服务器返回的响应时,会保存一份资源的副本。缓存服务器的优点在于通过缓存可以避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求。HTTP
缓存目前大多数项目的缓存方案:HTML:协商缓存。css,js,图片:强缓存(文件名带hash)
缓存种类:数据库缓存,CDN
缓存,代理服务器缓存,浏览器缓存。
我们第一次进入页面,请求服务器,然后服务器进行应答,浏览器根据Response Header
来判断是否对资源进行缓存,如果响应头中Expires
,Paragma
和Cache-Control字段,代表这是强缓存,浏览器就会把资源缓存在memory cache
或disk cache
中。
第二次再请求时,浏览器判断请求参数,如果符合强缓存条件(没过期)就直接返回200,从本地缓存中拿数据。否则把响应参数存在request header
请求头中,看是否符合协商缓存(资源没改变)符合就返回304,不符合服务器就返回全新资源。
强缓存
当我们访问URL
的时候,浏览器会判断 请求的资源是否在有效期内,如果在有效期,就直接从缓存中读取资源,同时返回200.
强缓存通过Expires
,Paragma
和Cache-Control
字段设置。
Expires
是不个时间戳,服务器返回请求结果的到期时间。再次发起时如果未超过,可以直接用缓存,超过就重新请求。
注意的是:它判断是否过期是用本地时间的,而本地时间是可以自己改的。优先级最低
Cache-Control
优先级最高,主要取值:
public
:资源客户端和服务器都可以缓存privite
:资源只有客户端可以缓存no-cache
:客户端缓存资源,但是是否缓存需要经过协商缓存来验证。no-store
:不使用缓存max-age
:缓存保质期Pragma
取值
no-cache
和Cache-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时,会跳过强缓存,但是会检查协商缓存。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。