网络协议:HTTP

一 什么是HTTP协议,有什么特点?

HTTP协议是超文本传输协议,即Hypertext Transport Protocol。它具有以下特点:

#1 是基于TCP协议的应用层协议

#2 是基于客户端-服务器模式或者请求-响应模式的协议

#3 是无状态协议。因为标准HTTP协议服务器端不需要维护客户端状态信息

#4 默认是短连接。即客户端向服务器发请求,会建立连接,然后服务器端响应客户端之后,连接关闭。但是也可以使得HTTP协议保持长连接特性,通过keep-alive,即再这个时间段内,客户端和服务器端的用于传输HTTP数据的TCP连接不会关闭,客户端在次访问的时候,无需再次建立连接,继续使用这个连接。但是,这并不代表是无连接,UDP才是无连接的。

二 HTTP协议报文组成

2.1 请求

2.1.1 请求行

请求行主要包括HTTP版本信息、请求方法和URI

2.1.2 首部字段

2.1.3 请求体

2.2 响应

2.2.1 状态行

状态行包括:HTTP协议版本号、状态码

2.2.2 首部字段

主要包括缓存控制和内容控制等首部字段,缓存控制主要是Cache-Control,内容控制主要是消息体相关的字段,比如Content-Length、Content-Encodingf等等

2.2.3 响应体

三 HTTP主要的方法以及幂等性

幂等性:无论这个请求发送多少次,结果都是一样的

3.1 GET(幂等)

GET: 获取服务器资源,无论调用多少次请求结果都是一样的,即便上司服务器修改了资源,那也是服务器的事情,不是客户端的事情。

3.2 POST(非幂等)

POST: 提交新资源,即新增资源,每调用一次都有可能产生不一样的资源,所以不是幂等的

3.3 PUT(幂等)

PUT: 全量更新资源,一个请求无论提交多少次,被更新后的资源都是一样,所以是幂等

3.4 DELETE(幂等)

DELETE: 删除资源,删除一次和多次的结果都一样,都没有了,所以也是幂等的

3.5 PATCH(非幂等)

四 GET和POST区别 以及 PUT和POST区别

4.1 GET和POST区别

#1 GET 是获取资源;POST是提交或者新增资源

#2 GET 是幂等的;POST是非幂等的

#3 GET 数据是以URL的参数的形式提供;POST的数据封装在请求消息体中,但是有时候也可以携带参数

#4 GET 的URL长度有限制;POST没有限制

#5 GET 只允许ASCII码字符;POST没有限制,比如二进制流也支持

#6 GET 因为是幂等的,所以可以被缓存;POST是非幂等的,不可被缓存

4.2 PUT和POST区别

#1 在HTTP协议中,PUT的语义是全量更新数据;POST是新增数据

#2 PUT是幂等的,无论提交多少次都是全量替换,结果是一样的;但是POST是非幂等的

五 缓存控制

5.1 新鲜度检测

5.1.1 ETag + If-None-Match

对于缓存控制,首先我们要了解新鲜度这个东西,新鲜指的就是服务器的资源是否有被修改过,那么怎么判断资源是否被修改了呢?需要通过ETag这个首部来确定。

ETag是什么?ETag就是一个为报文实体或者消息体提供的一个标记,如果消息体已经被修改过则会修改ETag值,客户端第一次请求服务器某资源的时候,会将这个ETag返回给客户端,客户端下一次请求的时候会携带。比如一张图片a.png存储到服务器的时候,产生一个ETag(nbh7ue),一个月之后,有人把a.png修改了,这时候就会产生一个新的ETag(oo123h)。

所以一旦ETag发生了变化,表示服务器资源发生了修改,就不新鲜了。当客户端下一次请求服务器资源的时候,会携带一个If-None-Match参数,If-None-Match后面就是ETag值,意思就是如果和ETag不相等,就拉取新的资源;如果携带了If-Match参数,后面也是ETag,意思就是如果和ETag相等才拉取资源,不相等则拉取。

5.1.2 If-Modified-Since(HTTP1.1)

资源失效的绝对时间

5.1.3 Cache-Control: max-age = 49200

资源最大的存活时间

5.1.4 Expires(HTTP1.0+)

和If-Modified-Since一样,也是资源失效的绝对时间

5.2 缓存控制

5.2.1 Cache-Control: no-store

表示客户端根本不会缓存拉取的资源,每一次都需要从服务器拉取

5.2.2 Cache-Control: no-cache

#1 每一次都要向服务器发送获取资源请求,并且携带ETag

#2 服务器通过校验ETag,判断是否存在;如果不存在则返回资源缓存在本地;如果存在,则判断是否改变,如果改变则返回资源缓存在本地;如果没有改变,则无需获取新资源。注意缓存在本地,max-age设置为0,即每次都需要向服务器询问资源状态,只有资源没有改变才可以从本地缓存中获取。

#3 下一次请求资源的时候,首先从本地缓存检查是否存在这个资源,发现存在,但是到期了,因为max-age=0,所以不能用需要向服务器发送获取资源请求,并且携带ETag

5.2.3 cache-control: private

只能在浏览器被缓存,不会在代理服务器之类的缓存。如果存在max-age,则等待max-age过期了才访问服务器

5.2.4 cache-control: public

不仅内浏览器缓存,还可以被其他服务器,代理服务器缓存缓存

5.2.5 cache-control: max-age

指定资源的缓存的时间,也就是资源在本地存活时间

5.2.6 cache-control:no-cache,private,must-revalidate

#1 打开新窗口

private或者no-cache或者must-revalidation,若设置max-age,则在此缓存期间不访问服务器,max-age到期了则会打开新窗口

#2 后退按钮

private、must-revalidate不会重新访问;但是no-cache会重新访问

#3 刷新按钮

无论为何值,都会重新访问

六 Cookie和Session

我们知道HTTP协议本身是无状态的,但是有时候服务器需要知道一些客户端的信息,就需要一定的手段实现。

6.1 Cookie

#1 就是服务器在客户端存储的一些客户端自己的一些状态信息

#2每一次请求服务器的时候都会携带Cookie,从而服务器就可以获取客户端的一些信息

#3 Cookie可以设置有效期,通过maxAge表示最大存活时间。maxAge为正数,未被持久化;如果为负数,表示临时的Cookie,不会被持久化;maxAge=0,立即删除Cookie

#4 Cookie所在的域名,Cookie是不可以跨域名的,而且同一个一级域名和二级域名也不能交互使用Cookie,比如a.m.com和b.m.com。但是如果想要子域名都可以使用Cookie,需要设置域名为.m.com.

#5 Cookie可以有路径

6.2 Session

#1 会话是指用于服务器端为客户端创建的保存客户端的一些状态信息的东西

#2 一般会生成一个session id,然后每一个客户端都对一个session id, 然后状态信息就保存会话中

#3 session id会写入客户端的cookie,每一次cookie都需要携带,这样服务器根据session id 就可以获取服务器为客户端存储的状态信息

#4 会话可以设置到期,到期之后会话保存的消息丢失

七  HTTPS协议和TLS/SSL

7.1 HTTP 协议HTTPS协议的比较

7.1.1. 相同点

#1 都是应用层协议

#2 都是基于TCP协议的

#3 都是无状态协议

#4 默认都是短连接

7.1.2 不同点

#1 scheme不一样: HTTP以http://开头; HTTPS则是以https://开头

#2 端口不一样: HTTP默认端口80;HTTPS默认端口443

#3 安全程度不一样:

第一:HTTP是明文传输,不安全;HTTPS是以加密后的数据传输,更加安全

第二:HTTP不需要进行客户端或者服务器端的身份认证;HTTPS需要对客户端或者服务器端进行身份认证

#4 速度不一样:因为HTTP不需要TLS/SSL协议进行认证,加密解密处理,所以速度更快;而HTTPS协议速度更慢

7.2 HTTP 协议为什么不安全

第一:数据没有加密,是明文传输的,很容易被拦截获取

第二:无法验证对方身份

第三:数据很容易被篡改。因为经过很多节点或者路由器,都可以修改数据,客户端或者服务器没有办法确认这就是对方发送的数据

7.3 HTTPS协议是如何保证安全的

第一:为了保证数据安全,客户端和服务器端使用对称秘钥对传输的数据进行加密和解密,因为对称秘钥加密速度快、效率高

第二:但是对称秘钥是需要客户端和服务器端都需要拥有的,所以需要传输,但是在传输的过程中,容易泄露。所以为了保证对称秘钥的安全传输,所以使用非对称技术对对称秘钥进行加密

#3 非对称加密有多种,比如RSA和DH.我们以RSA为例子,服务器端会生成公钥和私钥,公钥以铭文的形式发送到客户端,即时泄露了也没有关系。然后客户端生成对称秘钥,使用公钥加密,服务器获取对称秘钥对其使用私钥解密。如果是以DH(迪夫-赫尔曼)算法,则私钥都不需要参与密码交换,只需要一些额外的参数就可以使得客户端和服务器端使用相同的对称秘钥进行加密和解密。

7.4 HTTPS协议工作原理

第一:客户端向服务器端发送握手消息,包括自己支持的密码套件、压缩算法、随机数等

第二:服务器端收到客户端发送的握手消息,并且从客户端密码套件中选择一个自己支持的密码套件、生成一个随机数、TLS版本等信息,发送给客户端

第三:服务器端紧接着发送自己的证书给客户端,证书包括网站域名和服务器公钥,用于客户端对服务器端进行身份认证

第四:如果是使用DH(迪夫-赫尔曼)算法作为密码交换,则服务器还需要传递一些额外参数;如果使用RSA则不需要

第五:客户端校验证书

第六:客户端生成一个随机数,然后使用加密算法(RSA为例),使用证书的公钥对随机数进行非对称加密,生成一个预主秘钥(pre-master key),然后发送给服务器

第七:客户端切换到服务器指定的加密方式,然后给服务器端发送消息,告诉服务器端可以开始通信了

第八:服务器端根据自己的私钥解密预主秘钥,然后计算主秘钥。并且将服务器切换到对应的加密方式,通知客户端可以开始加密通信。

7.5 HTTPS协议的优化

7.5.1网络层优化

常见的网络层优化手段包括减少连接次数(长连接),流量控制,慢启动

7.5.2 应用层优化

长连接(keepAlive),CDN技术(减少握手的时间,距离越短,时间越少)

7.5.3 HTTP/2 优化

第一:HTTP/2是基于TLS/SSL协议运行的,他完全能够抵消TLS/SSL带来的性能损耗

第二:采用二进制分帧。帧由头部帧和数据帧组成,每一个帧都是有编号的,所以可以乱序发送,收到数据后然后进行组装。并且支持优先级,优先级高的帧先发送

第三:一个连接可以发送多个请求,也可以接受多个响应

第四:HTTP2.0头部和主体都可以压缩;但是HTTP1.1头部是不能压缩的

八  HTTP协议首部字段

8.1 通用首部字段

Connection: 允许客户端和服务器端指定与连接有关的选项

Date: 指定报文创建日期

Transfer-Encoding: 告知接收端为了保证报文的可靠传输,对报文采用什么编码方式

Via: 显示报文经过的中间节点

8.2 请求首部

User-Agent: 发起请求的应用程序名称

Referer: 提供了包含当前URI的文档的URL,即这个请求源自哪一个URI

8.2.1 偏好首部:告诉服务器应该发送什么,不应该发送什么

偏好首部:告诉服务器应该发送什么,不应该发送什么

Accept: 告诉服务器能发送哪些媒体类型

Accept-Charset: 告诉服务器能发送哪些哪些字符

Accept-Encoding: 告诉服务器能发送哪些编码方式

8.2.2条件首部

条件首部:需要能满足一定条件,才可以发送请求或者响应

IF-Match:后面跟ETag,如果资源的ETag和当前传递ETag相同,就从服务器获取新的返回

IF-None-Match:后面跟Eta,如果资源的ETag和当前传递ETag不相同,就从服务器获取新的返回

If-Modified-Since: 除非在某个指定的日期之后资源被修改过,否则就限制这个请求,一定要改变才发送

If-Unmodified-Since: 除非在某个指定的日期之后资没有被修改过,否则就限制这个请求,一定不要改变才发送

8.2.3 安全首部

Authorization: 客户端提供给服务器,以便于服务器对客户端进行认证的数据

Cookie: 客户端保存的服务器存储在客户端的一些状态信息

8.2.4 代理请求首部

Max-Forward: 在通往源服务器的路径上,将请求转发给其他代理或者网关的最大数

Proxy-Connection:和Connection一样,不过是在和代理建立连接的时候使用

8.3 响应首部

8.4 主体首部

8.4.1 描述负荷的首部

描述HTTP报文负荷的首部,因为请求和响应报文中都有可能包含实体内容:

Allow: 对此实体允许的请求方法

Location: 告诉客户端资源的实际位置,重定向经常使用

8.4.2 内容首部

Content-Length: 消息体的长度

Content-Location: 资源实际位置

Conetnt-Endoing: 对消息体的编码方式

8.4.3 新鲜度相关的首部

ETag: 与此实体相关的标记

[HTTP1.0+]Expires: 实体不再有效的绝对时间,过了这个时间需要从服务器端再次获取消息体

Last-Modified: 这个消息体最后一次被修改的日期和时间

[HTTP1.1]Cache-Control: max-age=49200 定义了文档最大生存时间(相对时间)

8.4.4 缓存相关首部

控制缓存: 服务器可以定义在文档过期之前可以将其缓存多长时间,讲这些添加到响应首部,按照优先的顺序:

Cache-Control: no-store

Cache-Control: no-cache

Cache-Control: must-revalidate

Cache-Control: max-age=xxxx

Expires: 绝对时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值