HTTP版本
HTTP/0.9
只有一个命令get 没有header等描述数据的信息 服务器发送完毕,就关闭TCP连接(短连接)
HTTP/1.0
增加了如POST,PUT,DELETE等的请求 增加了status code和header 多字符集支持、多部分发送、权限、缓存
HTTP/1.1
支持长连接(
Connection:keep-alive,一个TCP链接可以发送多个请求,默认开启),有“队头阻塞”的缺陷:一个请求响应完才能发送下一个。 pipeline 管线化技术(允许在第一个应答被发送之前就发送第二个请求,降低了通讯延迟)。解决了队头阻塞的问题。(默认关闭)但 pipeling 要求返回是按序的,如果前一个请求很耗时,那么后面的请求即使服务器处理完成,仍会等待前面的请求处理完成才能返回; 增加host,完善HTTP缓存
HTTP2.0
头部压缩 服务器推送(只有HTTPS的网站才能使用) 多路复用(所有帧都采用二进制编码)
- HTTP2.0的中,有两个重要的概念:
帧和流;帧代表着最小的数据单位,每个帧都会标识该帧属于哪个流。多个帧组成一个数据流 多路复用就是在一个TCP链接中和可以存在多条流同时传输。换句话说 也就是一个TCP链接可以并行交错的发送请求和响应,这些请求和响应之间互不影响。另一端根据流的标识符和首部将他们重新组装起来;- 同域名下所有通信都在单个连接上完成,消除了因多个 TCP 连接而带来的延时和内存消耗。
- 单个连接上可以并行交错的请求和响应,之间互不干扰
URI和URL
URI是统一资源标识符,URL是统一资源定位符。URI:用字符串标识某一互联网资源,而URL:用来标识某一网页资源,可以理解为**URL是URI的某种资源的具体表现形式,是URI**的子集。
HTTP和TCP/IP协议族
网络是在TCP/IP协议族的基础上运作的,而HTTP协议只是其中的一个子集。HTTP协议和TCP/IP协议族内的其他众多的协议相同,用于客户端和服务器端之前的通信。
TCP/IP协议族分层管理
层次的划分有助于模块化,只需要把各层之间的接口部分规划好之后,每个层次内部的设计就能够自由改动了。某一部分修改了就只需要改动修改的那个模块就好,
应用层
应用层是大多数普通与网路相关的程序为了通过网络与其他程序通信所使用的层。每一个应用层的协议一般都会使用到传输层协议TCP和UDP协议之一。TCP能够确认数据最终是否送达对方:
- 运行在TCP协议上的协议:
- HTTP(80端口):用于浏览网页
- HTTPS(443端口):比HTTP更安全
- FTP(20和21端口):用于传输文件
- POP3(25端口):用于收邮件
- SSH(22端口):用于加密安全登录用
- 运行在UDP协议上的协议:
- DCHP(67端口):动态配置IP协议
传输层
传输层提供了网络连接中的两台计算机之间的数据传输。TCP和UDP都是传输层的协议。
网络层
网络层起的作用就是在众多的选项内选择一条传输路线。IP协议是网络层的协议
数据链路层
用来处理连接网络的硬件部分。包括控制操作系统、硬件设备驱动,光纤等物理可见部分,硬件上的范畴均在链路层的作用范围
TCP连接的建立与释放
TCP的三次握手
为了准确无误的将数据送达目标处,TCP协议采用了三次握手的策略; 例子:客户端:我准备好了,你准备好了么,收到请回答? 服务端:我收到了,我也准备好了,你收到了么? 客户端:我也收到了
作用:
- 1、让对方知道自己的发送能力和接受能力都是OK的。
- 2、指定自己的初始化ISN序列号,为后面的可靠传送做准备
- 3、如果是HTTPS协议,三次握手还会进行数字证书验证和加密密匙的生成;
ISN是固定的么?
- 三次握手的一个重要功能是客户端和服务端交换ISN,以便让对方知道接下来的接收数据的时候如何按序列号组装数据。如果ISN是固定的,很容易被攻击者猜到后续的确认号,因此ISN是动态生成的;
TCP的四次挥手
客户端:我要关闭了(主动关闭),你收到了么? 服务器:我收到了,开始关闭了,关闭好了我再告诉你! …… 服务器:我已经关闭(被动关闭)了,你收到了么? 客户端:我收到了 为什么关闭要4步? 因为服务端的listen状态下的socket当收到客户端建立连接请求的SYN报文后,它可以把ACK和SYN(ACK起应答作用而SYN起同步作用)放在一个报文里来发送。但是关闭链接时,当服务器接到客户端的FIN报文通知时服务器只能发一个回应报文,然后通知应用程序开始关闭,应用程序完成全部数据发送并确定可以终止时,服务器才会发送FIN告诉客户端可以真正断开连接了。所以这一步ACK报文和FIN报文需要分开发送,因此多了一个环节。
TCP是全双工信道,何为双工就是客户端和服务端建立两条通道: 通道1:客户端的输出链接服务器端的输入; 通道2:客户端的输入链接服务器端的输出; 两个通道可以同时工作,所以关闭双通道时需要双方各自关闭; 客户端:我要关闭输出通道了。 服务端:好的我知道了,我也要关闭输入通道了。 服务端:我也要关闭输出通道了。 客户端:好的,知道了,我也关闭输入通道了。
TCP协议
TCP协议是一个基于连接的采用流模式来传输数据的可靠(保证数据的正确性和顺序)性传输协议。(谷歌浏览器的TCP链接最多并发6个)
不可靠的UDP协议
UDP是无连接采用数据报模式来传输数据的不可靠的传输协议(不需要接收到反馈),对于大批量广播或者类似于寄信。
浏览器缓存
缓存位置
Memory Cache:内存缓存,窗口关闭就会消失Disk Cache:磁盘缓存,也就是存储在硬盘中的缓存,读写速度慢,比Memory Cache胜在容量和存储时效性上。
浏览器会把哪些文件丢进内存中,哪些丢进硬盘中?
对于大文件来说,是不会存在内存中的,反之优先。 当前系统内存使用率高的话,文件优先存进磁盘中。
浏览器的缓存策略
通常浏览器的缓存策略有两种:
强制缓存和协商缓存,并且缓存策略都是通过HTTP header来实现的。
强缓存
不会向服务器发送请求,直接从缓存中读取资源。在chrome控制台的Network选项中可以看到请求返回200的状态码,并且Size显示
form disk cache或form memory cache。强缓存可以通过设置两种HTTP Header来实现:Expires和Cache-control;
Expires
http1.0的产物,缓存的过期时间,用来指定资源的到期时间,是服务器端的具体时间点(已不推荐使用)。也就是说,
Expires=max-age + 请求时间,需要和Last-Modified结合使用。Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
Cache-Control
http1.1的产物,控制缓存的行为
Cache-Control的默认取值private:所有内容只有客户端可以缓存。取值max-age时是以秒为单位的。
Expires和Cache-Control的区别
最大的区别就是
Expires是http1.0的产物,而Cache-Control是http1.1的产物,两者同时存在的话Cache-Control优先级是高于Expires的。强缓存判断是否缓存的依据来自于是否超出某个时间或某个时间段,而不关心服务器端文件是否更新。因此才有了协商缓存策略;
协商缓存
协商缓存就是当强缓存失效后,浏览器携带缓存标识向服务器发送请求,由服务器根据缓存标识决定是否使用缓存。协商缓存可以通过设置HTTP Header:
Last-Modified和Etag来实现;
Last-Modified 和 If-Modified-Since
浏览器在第一次访问资源时,服务器返回资源的同时,在response header中会添加
Last-Modified的header,值为这个资源在服务器上最后的修改时间,浏览器接收后缓存资源和header。 浏览器下一次请求时,当强缓存已过期,且检测到有Last-Modified这个header,就会在请求中添加If-Modified-Since这个header,值就是Last-Modified的值,服务器再次收到这个资源请求,就会根据If-Modified-Since这个值与服务器中这个资源的最后修改时间做对比,如果没有变化,就返回304、新的header和空响应体,直接从缓存中读取。如果资源修改了,就会返回新的资源和新的过期时间。Last-Modified存在的弊端:
- Last-Modified只能以秒为单位计时,有些服务器的文档会在亚秒间隙发生变化,这样的话,Last-Modified就不再准确;
- 有些文档可能会被周期性的重写,尽管内容没有发生变化,但修改日期会发生变化。
Etag 和 If-None-Match
为了解决
Last-Modified存在的弊端,HTTP1.1推出了Etag 和 If-None-Match。Etag是服务器响应请求时,返回当前资源的实体标签(由服务器生成,可以是文档的序列号或版本名,或者是文档内容的校验和及其他指纹信息),当发布者对文档进行修改时,可以修改文档的实体标签来说明这个新的版本,这样,缓存就可以用If-None-Match来检验资源是否被修改过。 浏览器在下次发送请求时,就会将Etag的值放在请求头header的If-None-Match中。服务器会比对If-None-Match的值和该资源的Etag值是否一致,如果一致,说明未修改,返回304,浏览器继续使用缓存。如果不一致,返回200以及新的资源和Etag;Etag 和 Last-Modified 用哪个?给哪个用哪个,如果两个都给,则只有Etag不变,且Last-Modified与服务器一致的时候才能返回304 Not Modified;
如果什么缓存策略都没设置,那么浏览器会怎么处理?
浏览器会采用一个启发式的算法,通常会取响应头中的 Date 减去 Last-Modified 值的 10% 作为缓存时间。
用户行为对缓存的影响
意思是用户行为会如何触发缓存策略
- 用户输入url,查找disk cache,是否有匹配,有则直接使用,没有则发送请求;
- 普通刷新(F5):因为窗口并没有关闭,因此memory cache 依然是可用的,会被优先使用(如果匹配的话)。其次才是disk cache。
- 强制刷新(Ctrl+F5):浏览器不使用缓存。因此发送请求头部均带有Cache-Control:no-cache,服务器直接返回200和最新内容;
缓存总结
当浏览器需要资源时
- 1、调用
Service Worker的fetch事件响应- 2、查看
memory cache- 3、查看
disk cache,这里会细分:
- 有强缓存且未失效,则使用强制缓存,返回200
- 有强制缓存已失效,则使用协商缓存,可用返回**
304** ,不可用返回新数据和**200**- 4、向服务器发送请求,等待响应
- 5、把响应内容存入
disk cache(如果HTTP头信息配置可存)- 6、吧响应内容 的引用 存入
memory cache(无视HTTP头信息的配置)- 7、把响应内容存入**
Service Worker的Cache Storage(如果Service Worker的脚本调用了cache.put()**)
Transfer-Encoding
指定报文主体的传输编码方式
HTTP与HTTPS的区别
https协议需要ca证书,免费的证书很少 http协议是明文传输的,而https协议是通过ssl加密传输的安全性协议; http与https连接方式不同,采用的端口号也不同; http是无状态协议;https协议是通过SSL+http协议构建的可进行加密传输、身份认证的网络协议,比http安全;

