HTTP和HTTPS
HTTP 版本
1.0(1996) -> 1.1(1999) -> 2(2000)
1.0
每次都重新创建连接
1.1
- keep-alive 保持连接
- 断点续传
- 选择性传递数据
- 支持hostname
缺点:
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
2.0
- HTTP1.x的解析是基于文本, HTTP2.0的协议解析决定采用二进制格式
- HTTP1.x的header带有大量信息, HTTP2.0使用encoder来减少需要传输的header大小
- HTTP2.0完全兼容HTTP1.x的语义, 对于不支持HTTP2.0的浏览器,NGINX会自动向下兼容的
- 除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求
https有什么不同
- HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
- HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
- HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
- HTTPS 比 HTTP 要慢 2 到 100 倍
三次握手和四次分手
- 第一次握手:建立连接时,客户端A发送SYN包(SYN=1)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
- 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=x+1),同时自己也发送一个SYN包(SYN=1),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
- 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=y+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。之后就可以进行数据传送了。
- 第一次挥手:客户端向服务器发送一个FIN报文段,序列号为u,此时,客户端进入FIN_WAIT_1状态,这表示客户端没有数据要发送给服务器了
- 第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回一个ACK报文段,序列号为u+1,客户端进入FIN_WAIT_2状态,服务器告诉客户端,我也没有数据要发送了,可以进行关闭连接了
- 第三次挥手:服务器向客户端发送FIN报文段,请求关闭连接,同时服务器进入CLOSE_WAIT状态
- 第四次挥手:客户端收到服务器发送的FIN报文段,向服务器发送ACK报文段,然后客户端进入TIME_WAIT状态;服务器收到客户端的ACK报文段以后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明服务器已正常关闭,此时,客户端也可以关闭连接了
方法
GET
POST
PUT
DELETE
OPTION
查询请求的支持情况HEAD
只发送头部信息,确认URI的有效性和资源更新时间TRACE
追踪路径,让服务端返回之前发送的请求信息CONNECT
用隧道协议链接代理,进行加密传输
状态码
200
表示从客户端发来的请求在服务器端被正常处理了204
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分 , 一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。 206
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由 Content-Range指定范围的实体内容。 301
永久性重定向 302
临时性重定向 303
该状态码表示由于请求对应的资源存在着另一个 ### URI,应使用GET方法定向获取请求的资源304
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况 (附带条件的请求是指采用 GET 方法的请求报文中包含 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since 中任一首部 )307
临时重定向 , 会遵照浏览器标准,不会从 POST变成 GET400
该状态码表示请求报文中存在语法错误 , 浏览器 会像 ### 200 OK一样对待该状态码 401
该状态码表示发送的请求需要有通过 HTTP认证 403
404
500
服务器端在执行请求时发生了错误 503
服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
浏览器的最大连接数
在 HTTP/1.1 协议中
浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞。
keep-alive是指服务器和客户端的多个请求响应共用一个TCP连接,而不是每次请求响应都新建一个连接完了后关闭
http1.1 和 http 2请求差异
HTTP/2 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,
HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息,
并行地在同一个 TCP 连接上, 降低了请求延迟。
缓存
和缓存相关的头部字段
Pragma和Expires
在 http1.0 时代,给客户端设定缓存方式可通过这两个字段来规范。虽然这两个字段早可抛弃,但为了做http协议的向下兼容,你还是可以看到很多网站依旧会带上这两个字段
Cache-Control
区分对缓存机制的支持情况, 请求头和响应头都支持这个属性,报文中同时出现了 Expires 和 Cache-Control,则以 Cache-Control 为准。优先级 Pragma -> Cache-Control -> Expires
作为请求首部:
作为响应首部:
Last-Modified
服务器将资源传递给客户端时,会将资源最后更改的时间以“Last-Modified: GMT”的形式加在实体首部上一起返回给客户端.
客户端会为资源标记上该信息,下次再次请求时,会把该信息附带在请求报文中一并带给服务器去做检查,若传递的时间值与服务器上该资源最终修改时间是一致的,则说明该资源没有被修改过,直接返回304状态码,内容为空,这样就节省了传输数据量 。如果两个时间不一致,则服务器会发回该资源并返回200状态码,和第一次请求时类似。这样保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。一个304响应比一个静态资源通常小得多,这样就节省了网络带宽。
If-Modified-Since: Last-Modified-value
该请求首部告诉服务器如果客户端传来的最后修改时间与服务器上的一致,则直接回送304 和响应报头即可。当前各浏览器均是使用的该请求首部来向服务器传递保存的 Last-Modified 值
If-Unmodified-Since: Last-Modified-value
该值告诉服务器,若Last-Modified没有匹配上(资源在服务端的最后更新时间改变了),则应当返回412(Precondition Failed) 状态码给客户端.
Last-Modified 存在一定问题,如果在服务器上,一个资源被修改了,但其实际内容根本没发生改变,会因为Last-Modified时间匹配不上而返回了整个实体给客户端(即使客户端缓存里有个一模一样的资源)。
ETag
为了解决上述Last-Modified可能存在的不准确的问题,Http1.1还推出了 ETag 实体首部字段。 服务器会通过某种算法,给资源计算得出一个唯一标志符(比如md5标志),在把资源响应给客户端的时候,会在实体首部加上“ETag: 唯一标识符”一起返回给客户端
客户端会保留该 ETag 字段,并在下一次请求时将其一并带过去给服务器。服务器只需要比较客户端传来的ETag跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。
如果服务器发现ETag匹配不上,那么直接以常规GET 200回包形式将新的资源(当然也包括了新的ETag)发给客户端;如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。
If-None-Match: ETag-value
当前各浏览器均是使用的该请求首部来向服务器传递保存的 ETag 值。
Ctrl + F5 / Cmd+Shift+R 强制浏览器不使用缓存
引用1
nginx -> gzip
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript;
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
gzip_comp_level 2;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
gzip
语法:gzip on/off
默认值:off
作用域:http, server, location
说明:开启或者关闭 gzip 模块,这里使用 on 表示启动
gzip_min_length
语法:gzip_min_length length
默认值:gzip_min_length 0
作用域:http, server, location
说明:设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers
语法: gzip_buffers number size
默认值: gzip_buffers 4 4k/8k
作用域: http, server, location
说明:设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k 代表以 16k 为单位,按照原始数据大小以 16k 为单位的4倍申请内存。
gzip_comp_level
语法: gzip_comp_level 1..9
默认值: gzip_comp_level 1
作用域: http, server, location
说明:gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。这里设置为 5。
gzip_types
语法: gzip_types mime-type [mime-type ...]
默认值: gzip_types text/html
作用域: http, server, location
说明:匹配MIME类型进行压缩,(无论是否指定)"text/html" 类型总是会被压缩的。这里设置为 text/plain application/x-javascript text/css application/xml text/javascript。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。