ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HTTP简述

2021-04-11 12:06:14  阅读:107  来源: 互联网

标签:缓存 HTTP 请求 报文 简述 服务器 客户端


HTTP(超文本传输协议):是用于从Web服务器传输超文本到本地浏览器的传送协议。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

HTTP 有两种报文:
1)请求报文:客户端向服务器请求资源。
2)响应报文:服务端向客户端发送资源;

1.请求报文

在这里插入图片描述
GET /hello.htm HTTP/1.1
Accept: /
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
If-Modified-Since: Wed, 17 Oct 2007 02:15:55 GMT
If-None-Match: W/“158-1192587355000”
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: 192.168.2.162:8080
Connection: Keep-Alive

请求行:1)请求方法(远程调用) 2) URL(资源定位) 3) 协议版本(HTTP1.0/HTTP1.1/HTTP2.0)

请求头:
Accept: 客户端可以识别的响应内容格式 image/gif, image/jpeg。
Accept-Language:客户端可接受的语言。
Accept-Encoding:客户端可接受的编码压缩格式。
Accept-Charset:可接受的应答的字符集。
Host: 请求的主机名,允许多个域名同处于一个IP地址(虚拟主机)。
connection:对于请求来说:close(告诉WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不等待本次连接的后续请求了)。
Cookie:存储于客户端扩展字段,可以用来做用户认证,服务器校验,会话管理,个性化信息(记录用户相关的信息)等。

1.1 请求方法

GET:要求服务器将请求报文中的url对应的资源放在响应报文的数据部分,然后回送给客户端。GET方法的数据参数是暴露在起始行的URL中的。

POST:该方法允许客户端给服务器传递更多的信息,POST的url中不会去显示请求参数。

HEAD: 和GET相似,只不过服务端只返回响应头部分,所以在我们查看页面的状态的时候,使用这个方法是非常高效的。

PUT:向服务器发送一个实体对象,用于修改指定URL下资源内容。本质上,将参数实体对象数据放在报文的请求数据体当中。

HTTP 在TCP协议之上。包含有SSL/TLS协议,即HTTPS(文本加密传输)。
HTTP 默认端口号:80。
HTTPS默认端口号:443。
HTTP 是无状态协议。

2.响应报文

在这里插入图片描述

HTTP/1.1 200 OK
ETag: W/“158-1192590101000”
Last-Modified: Wed, 17 Oct 2007 03:01:41 GMT
Content-Type: text/html
Content-Length: 158
Date: Wed, 17 Oct 2007 03:01:59 GMT
Server: Apache-Coyote/1.1.

2.1 状态码

  • 1xx: 服务器接收客户端请求,客户端可以继续发送请求。
  • 2xx: 服务器接收客户端请求并进行处理。
  • 3xx: 服务器要求客户端重定向:要求用户进一步细化请求。
  • 4xx: 客户端请求非法:客户错误。
  • 5xx: 服务器未能正常处理客户端的请求而出现意外:服务器发生错误。

2xx: 服务器接收请求,并进行处理

200:ok 客户端的请求成功
201: create 请求已经完成,并且一个新的返回资源被创建,被创建的资源可能是一个URI资源。
202:Accepted 请求被接收用来处理,但是处理并没有完成,请求可能或者根本没有遵照执行。
204:No Content 服务器已经接受请求并且没必要返回实体数据,可能需要返回更新信息。

3xx:Redirection

300 Multiple Choices 请求资源符合任何一个呈现方式。
301 Moved Permanently 请求的资源已经被赋予一个新的URI。
302 Found 通过不同的URI请求资源的临时文件。

4xx Client Error请求客户端错误

400 Bad Request:表示客户端请求有语法错误,不能被服务器所理解;
401 Unauthonzed:表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一  起使用;
403 Forbidden:表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因;
404 Not Found:请求的资源不存在,例如,输入了错误的URL;

5xx 服务器错误

500 Internal Server Error:表示服务器发生不可预期的错误,导致无法完成客户端的请求;
503 Service Unavailable:表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常;
502 Bad Gateway
501 Not Implemented 服务器没有相应的执行动作来完成当前请求。

3.HTTPS 报文加密传输

HTTPS 是基于HTTP协议附加了SSL/或TLS安全协议,对HTTP报文进行加密传输。

3.1 对称加密

明文 + 秘钥 = 密文,密文 - 秘钥 = 明文。

例如:
“abc” 明文
“abc” + 1 = “bcd” 秘文
“bcd” - 1 = “abc” 明文

优点:加密解密规则简单,速度快。
缺陷:双方必须都有该秘钥。若任何一方缺失,则需要通过网络传输秘钥,但这种方式导致秘钥泄露。

3.2非对称加密

加密解密使用不同的密钥。公钥/私钥
公钥 + 明文 = 密文,密文 + 私钥 = 明文。 同样也可以:私钥 + 明文 = 密文,公钥 + 密文 = 明文。

如果实现报文加密传输?

假如A向B传输报文,A首先向B请求公钥。
A使用B的公钥对报文加密。此时加密的报文只能通过B的私钥解密,B接受到密文,使用私钥解密。

但是如何证明B接收到的报文是A发送的? 其他终端也可以截获B的公钥,向B发送假数据。
我们可以使用A的私钥先对报文加密,这足证明是的发送的报文,之后再用B的公钥加密。B接受到报文后,使用自己的私钥解密,在通过A的公钥进行报文解密验证。

3.3 密钥分配中心(KDC)

KDC任务就是给需要的进行秘密通信的用户临时分配一个会话密钥(仅使用一次)假定用户A和B都是KDC的登记用户。A和B在KDC登记时就已经在服务器上安装了各自和KDC进行通信的主密钥KA和KB。

例如:A要与B进行通信。

  1. A向密钥分配中心,发送请求A与B通信。
  2. 密钥中心,产生一个临时密钥Kab,使用B的私钥对Kab加密 ,目的让A发送给B得到Kab。密钥中心将Kab 和密文 使用Ka密钥加密发送给A,
  3. A解密后获得Kab,再将剩余密文发送给B,于是B获取得到Kab。
  4. A/B使用Kab密钥进行报文加密/解密。
    在这里插入图片描述

4.HTTP传输过程

4.1、HTTP1.0

短连接:一次TCP连接,浏览器只能发送一个请求,接收到响应后,断开TCP。

4.2、HTTP1.1

长连接:一次TCP连接,浏览器采用流水线发送多个请求,但服务端只能按请求顺序响应。易造成http头阻塞。

4.3、HTTP2.0

HTTP/2 引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据。
HTTP/2 对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只建立一路连接。这样服务器可乱序响应请求,避免低效顺序响应。

5. Cookie和Session

HTTP 是一种无状态协议。一次TCP连接后,无法保留历史记录。那么对于商城网站,需要记录客户操作状态,就无法实现。所以在客户端方面引入Cookie,存储会话状态或识别客户端身份。HTTP头有对应cookie字段。
Session 是在服务端存储会话状态,以文件形式。在某些场合下,客户端首次请求服务器,服务器会创建Session,并响应一个SeesionID 在响应cooike字段中。SeesionID目的是为了客户端下次请求,服务端能够找到与之对应的Session。

6.HTTP缓存机制

客户端在第一次请求数据时,首先向缓存服务器请求资源,若没有,再想资源服务器请求。之后客户端再将资源存储到缓存服务器。

HTTP 缓存分为,强制缓存和比较缓存。

1) 强制缓存:


当强制缓存生效时,客户端不再与服务器交互。

如何判断缓存失效?

请求/响应报文包含缓存规则。对于强制缓存,报文里有两个字段标明失效规则(Expires/Cache-Control)

HTTP1.0使用Expires
Expires:服务端返回的资源到期时间,客户端下次请求时,请求时间小于服务端返回的资源到期时间,则直接使用缓存。

缺陷:服务端返回的资源到期时间,由服务端产生,客户端时间可能与服务端时间有误差。

HTTP1.1 使用Cache-Control

Cache-Control:常见的值有:

  • private: 客户端可以缓存。
  • public:客户端和代理服务器都可缓存。
  • max-age=xxx:缓存内容在XXX秒后失效
  • no-cache:使用对比缓存验证缓存数据。
  • no-store:所有内容都不使用缓存。
2)对比缓存:

对比缓存:对比判断缓存是否可用。

在第一次请求服务器时,服务器将资源标识和数据发送给客户端。客户端将二者备份到缓存数据库中。当再次请求时,客户端将缓存标识发送给资源服务器,服务器进行标识判断,判断成功后,返回304,通知客户端缓存可以使用。

缓存标识在请求Header和响应Header之间传递,总共有两种标识:
1) Last-Modified/If-Modified-Since

  1. Last-Modified:服务端响应时,告诉浏览器,资源修改的最后一次时间。
  2. If-Modified-Since:再次请求时,告诉服务端,上次请求时,服务端返回的最后资源修改时间。
  • 如果If-Modified-Since < 资源修改时间,则发送修改后的资源,并返回状态码200
  • 如果If-Modified-Since = 资源修改时间,则返回状态码304,告知资源可用。

2) Etag / If-None-Match(优先级高于Last-Modified / If-Modified-Since)

  1. Etag :资源在服务器的唯一标识。
  2. If-None-Match:再次请求时,服务端头有 If-None-Match,则与被请求的资源唯一标识进行对比,对比成功,则返回状态码304,失败,则响应资源,并返回状态码200.

总结:
强制缓存:服务端告诉浏览器一个缓存有效时间,在有效时间内请求,直接使用缓存。超过缓存时间,直接使用对比缓存。
对比缓存:通过对资源进行标识或时间标识,判断资源的缓存的有效性。服务端首先会通过资源标识判断,若没有该标识,则通过时间标识判断。

参考博文:彻底弄懂HTTP缓存机制及原理

标签:缓存,HTTP,请求,报文,简述,服务器,客户端
来源: https://blog.csdn.net/YunSu_CJ/article/details/115559635

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有