http协议

x33g5p2x  于2022-04-23 转载在 其他  
字(5.3k)|赞(0)|评价(0)|浏览(256)

一、HTTP协议有哪些方法
http1.0定义了三种请求方法:GET,POST和HEAD方法。
http1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACT和CONTENT方法。
二、这些方法的具体是什么?
GET方法:通常用于请求服务器发送某一些资源。
HEAD方法:请求资源的头部信息,并且这些头部与HTTP GET方法请求时返回一致,该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否需要下载,以此可以节约宽带资源。
OPTIONS方法:用于获取目的资源所支持的通信选项。
POST方法:发送数据给服务器。
PUT方法:新增资源或者使用已知负载资源替换目标资源的表现形式。
DELETE方法:用于删除指定资源。
PATCH方法:用于对部分资源进行修改。
CONNECT方法:connect的作用就是将服务器作为代理,让服务器代替用户去访问其他页面,之后将数据返回给用户。connect是通过TCP连接代理服务器的,假如我想告诉代理服务器向访问https://www.jianshu.com/u/ss网站,就需要首先建立一条从我的客户端到代理服务器的TCP连接,然后给代理服务器发送一条http报文。

CONNECT https://www.jianshu.com/u/f67233ce6c0c:80 HTTP/1.1
Host: www.web-tinker.com:80
Proxy-Connection: Keep-Alive
Proxy-Authorization: Basic *
Content-Length: 0

TRACE方法:回显服务器收到的请求,主要用于测试或诊断。
三、get和post请求有什么区别?
1、数据传输方法不同:get中的数据是通过url进行传输,post中的数据通过请求体传输。
2、安全性不同:由于get请求的数据是在url中,所以可以通过历史记录缓存很容易查到数据信心,post的数据因为在请求主体内,所以有一定的安全性保证。
3、数据类型不同:get只允许ascll字符,而post则无限制。
4、get无害刷新,后退等浏览器操作get请求无害的,post可能重复提交表单。
5、特性不同:get请求是安全的,这里的安全是指只读特性,就是使用这个方法不会引起服务器状态变化且幂等(幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同),而post是非安全费幂等的。
四、PUT和POST都是给服务器发送新增资源,有什么区别?
PUT和POST方法的区别是:PUT方法是幂等的,连续调用一次和多次的效果是相同的,但是POST方法是非幂等的。
除此之外,还有一个区别:PUT的URI指向具体单一的资源,而POST可以指向资源集合。
举一个例子:我们在开发一个博客系统,当我们要创建一篇博客往往使用POST请求,在articles的资源集合下创建⼀篇新的⽂章,如果我们多次提交这个请求会创建多个⽂章,这是⾮幂等的。
而PUT的语义是更新文章的资源(比如说修改作者名称等信息),这个URI指向的就是单一资源,而且是幂等的。
五、PUT和PATCH都是给服务器发送修改资源,有什么区别?
PUTPATCH都是更新资源,而PATCH用来对已知资源的局部更新。
比如说我们有一篇文章的地址为:https://www.jianshu.com/articles/820357430,这篇文章的可以表示为:

article = {
	author: 'dxy',
	creationDate: '2019-6-12',
	content: '我写⽂章像蔡徐坤',
	id: 820357430
}

当我们要修改文章的作者的时候,我们可以直接发送PUT
https://www.jianshu.com/articles/820357430,这个时候的数据应该是:

{
	author:'蔡徐坤',
	creationDate: '2019-6-12',
	content: '我写⽂章像蔡徐坤',
	id: 820357430
}

这种直接覆盖资源的修改方式应该使用PUT,但是你觉得每次都携带那么多无用的信息,那么可以发送PATCH``https://www.jianshu.com/articles/820357430,这个时候只需要。

{
	author:'哈哈哈'
}

六、http的请求报⽂是什么样的
请求报文有4部分组成:

1、请求行
2、请求头部
3、空行
4、请求体

请求行包括:请求方法字段,url字段,http协议的版本字段。它们用空格分割。比如:GET /index.html HTTP/1.1

请求头部:请求头部是由关键字/值对组成,每行一对,关键字和值用英文冒号分隔。

User-Agent:产生请求的浏览器类型。

Accept:客户端可是比的内容类型的列表。

七、http的响应报文是怎样的?
主要包含四部分

1、响应行
2、相应头
3、空行
4、响应体

八、聊一聊http的状态码有哪些?

200:ok,表示从客户端发送来的请求被正确处理。

301:永久重定向
302:临时重定向
304:仍然访问缓存中的资源。

400:服务器不理解客户端的请求语法
401:请求用户尚未进行验证
403:服务器正常理解客户端的请求,但是拒绝处理此请求。
404:资源不存在
405:http请求方法不被允许。

500:内部服务器错误
502:网关错误。

九、HTTP中的keep-alive是干什么的?
在早期的http/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短相应时间,就需要重用连接。在后来的http1.0中以及http1.1中,引入了重用连接的机制,就是在http请求头中加入connetcion:keep-alive来告诉对⽅这个请求响应完成后不要关闭,下⼀次咱们还⽤这个请求继续交流。协议规定http1.0囚想要保持长链接,需要在请求头中加上connection:keep-alive。

keep-alive的优点:
1、较少的cpu和内存的使用(由于同时打开的连接减少)
2、减少后续请求的延时(无需再进行握手)
3、降低拥塞控制(TCP连接减少了)

十、为什么有了HTTP为什么还要存在https?

https是安全的http,因为http协议的数据都是明文传输
的,所以对于一些敏感的信息的传输不安全,https就是
为了解决http的不安全而生的。

十一、HTTPS是如何保证安全的?
过程⽐较复杂,我们得先理解两个概念
对称加密:即通信的双⽅都使⽤同⼀个秘钥进⾏加解密,⽐如特务接头的暗号,就属于对称加密对称加密虽然很简单性能也好,但是⽆法解决⾸次把秘钥发给对⽅的问题,很容易被⿊客拦截秘钥。
非对称加密:
1、私钥 + 公钥 = 密钥对
2、即⽤私钥加密的数据,只有对应的公钥才能解密,⽤公钥加密的数据,只有对应的私钥才能解密。
3、因为通信双⽅的⼿⾥都有⼀套⾃⼰的密钥对,通信之前双⽅会先把⾃⼰的公钥都先发给对⽅。
4、 然后对⽅再拿着这个公钥来加密数据响应给对⽅,等到到了对⽅那⾥,对⽅再⽤⾃⼰的私钥进⾏解密
⾮对称加密虽然安全性更⾼,但是带来的问题就是速度很慢,影响性能
解决方法:
那么结合两种加密⽅式,将对称加密的密钥使⽤⾮对称加密的公钥进⾏加密,然后发送出去,接收⽅使⽤私钥进⾏解密
得到对称加密的密钥,然后双⽅可以使⽤对称加密来进⾏沟通。此时⼜带来⼀个问题,中间⼈问题:如果此时在客户端和服务器之间存在⼀个中间⼈,这个中间⼈只需要把原本双⽅通信互发的公钥,换成⾃⼰的公钥,这样中间⼈就可以轻松解密通信双⽅所发送的所有数据。
所以这个时候需要⼀个安全的第三⽅颁发证书(CA),证明身份的身份,防⽌被中间⼈攻击。
证书中包括:签发者证书⽤途使⽤者公钥使⽤者私钥使⽤者的HASH算法证书到期时间等。
但是问题来了,如果中间⼈篡改了证书,那么身份证明是不是就⽆效了?这个证明就⽩买了,这个时候需要⼀个新的技
术,数字签名。
数字签名就是⽤CA⾃带的HASH算法对证书的内容进⾏HASH得到⼀个摘要,再⽤CA的私钥加密,最终组成数字签名。
当别⼈把他的证书发过来的时候,我再⽤同样的Hash算法,再次⽣成消息摘要,然后⽤CA的公钥对数字签名解密,得到CA创建的消息摘要,两者⼀⽐,就知道中间有没有被⼈篡改了。
这个时候就能最⼤程度保证通信的安全了。
十二、HTTP2相对于HTTP1.x有什么优势和特点?
12.1、二进制分帧技术
帧:HTTP/2数据通信的最小单位信息:指HTTP/2中逻辑上的HTTP消息。例如请求和响应等,消息由一个或多个帧组成。
12.2、头部压缩
HTTP/1.x会在请求和响应中中重复地携带不常改变的、冗⻓的头部数据,给⽹络带来额外的负担。
12.3、服务器推送
服务端可以在发送⻚⾯HTML时主动推送其它资源,⽽不⽤等到浏览器解析到相应位置,发起请求再响应。例如服务端
可以主动把JS和CSS⽂件推送给客户端,⽽不需要客户端解析HTML时再发送这些请求。
服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发
送RST_STREAM帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三⽅资源给客户端。
12.4、多路复⽤
HTTP 1.x 中,如果想并发多个请求,必须使⽤多个 TCP 链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制。
HTTP2中:
同域名下所有通信都在单个连接上完成。
单个连接可以承载任意数量的双向数据流。
数据流以消息的形式发送,⽽消息⼜由⼀个或多个帧组成,多个帧之间可以乱序发送,因为根据帧⾸部的流标识可 以重新组装
十三、HTTP的缓存的过程是怎样的?
通常情况下的步骤是:

1、客户端向服务器发出请求,请求资源
2、服务器返回资源,并通过响应头决定缓存策略
3、客户端根据响应头的策略决定是否缓存资源,并将响应
头和资源缓存下来。
4、在客户端再次请求命中资源的时候,此时客户端去检查
上次缓存策略,根据缓存策略不同,是否过期等判断是直接
读取本地缓存还是与服务器协商缓存。

什么时候会触发强缓存或者协商缓存?
强缓存
强缓存离不开两个响应头ExpiresCache-Control
Expires:Expires是http1.0提出的⼀个表示资源过期时间的header,它描述的是⼀个绝对时间,由服务器返回,Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效。

Expires: Wed, 11 May 2018 07:20:00 GMT

Cache-Control: Cache-Control出现于HTTP/1.1,优先级高于Expries,表示的是相对时间。

Cache-Control: max-age=315360000

目前主流的做法使用Cache-Control控制缓存,除了max-age控制过期时间外,还有一些不得不提的。

1、Cache-control: public 可以被所有⽤户缓存,包括终端和CDN等中间代理服务器
2、Cache-Control: private  只能被终端浏览器缓存,不允许中继缓存服务器进⾏缓存
3、Cache-Control: no-cache  先缓存本地,但是在命中缓存之后必须与服务器验证缓存的新鲜度才能使⽤
4、Cache-Control: no-store 不会产⽣任何缓存

在缓存有效期内命中缓存,浏览器会直接读取本地的缓存资源,当缓存过期之后会与服务器进⾏协商。
协商缓存:当第⼀次请求时服务器返回的响应头中没有Cache-Control和Expires或者Cache-Control和Expires过期抑或它的属性设置为no-cache时,那么浏览器第⼆次请求时就会与服务器进⾏协商。
当第⼀次请求时服务器返回的响应头中没有Cache-Control和Expires或者Cache-Control和Expires过期抑或它的属性设置为no-cache时,那么浏览器第⼆次请求时就会与服务器进⾏协商。
服务器判断缓存是否是新鲜的⽅法就是依靠HTTP的另外两组信息。
Last-Modified/If-Modified-Since

客户端⾸次请求资源时,服务器会把资源的最新修改时间 Last-
Modified:Thu, 19 Feb 2019 08:20:55 GMT 通过响应部⾸
发送给客户端,当再次发送请求是,客户端将服务器返回的修改
时间放在请求头 If-Modified-Since:Thu, 19 Feb 2019
08:20:55 GMT 发送给服务器,服务器再跟服务器上的对应资源
进⾏⽐对,如果服务器的资源更新,那么返回最新的资
源,此时状态码200,当服务器资源跟客户端的请求的部⾸时间
⼀致,证明客户端的资源是最新的,返回304状态码,
表示客户端直接⽤缓存即可。

ETag/If-None-Match

ETag的流程跟Last-Modified是类似的,区别就在于
ETag是根据资源内容进⾏hash,⽣成⼀个信息摘要,只要
资源内容有变化,这个摘要就会发⽣巨变,通过这个摘要信
息⽐对,即可确定客户端的缓存资源是否为最新,这⽐
Last-Modified的精确度要更⾼。

相关文章

微信公众号

最新文章

更多