http的一些知识点

HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。 
HTTPS是在HTTP基础上加了SSL,以安全为目标的HTTP通道,简单讲是HTTP的安全版。 
HTTP报文分为请求报文和响应报文,都由请求(响应)行、请求(响应)头和请求(响应)请求正文组成。 
HTTP请求报文 
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:

  • 请求行:包含了请求方法 URI协议/版本
  • 请求头(Request Header) :请求头包含许多有关的客户端环境和请求正文的有用信息
  • 请求正文


下面是一个HTTP请求的例子:

GET/sample.jspHTTP/1.1         ---------------------------------请求行
Accept:image/gif.image/jpeg,*/*                            --------
Accept-Language:zh-cn
Connection:Keep-Alive                                          请求头
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate                               --------

username=jinqiao&password=1234   -----------------------------请求正文


上面这个例子是get方法的请求报文,get请求也是HTTP默认的请求方法,但其实请求方式有很多种,比如post 、delete 、put等,但是我们常用的也就只有get方式和post方式,那么我们来比较一下他们之间的区别: 
GET和POST的区别:

1、从功能上来讲,GET请求一般用来获取数据,POST请求用来提交数据
2、GET请求将参数拼接到URL上,而POST请求将参数放到请求主体中
3、GET请求的URL会有长度限制(是由于浏览器地址栏输入框对于URL有长度限制),而POST
可以传输很多数据(POST请求也有长度限制,这是由于为了服务器安全和稳定浏览器会对
Content-length进行限制)。
4、相对来说,POST要比GET安全

HTTP响应报文 
HTTP响应报文与HTTP请求相似,HTTP响应也由3个部分构成,分别是:

  • 响应行:包含协议状态版本代码描述
  • 响应头(Response Header)
  • 响应正文


下面是一个HTTP响应的例子:

HTTP/1.1 200 OK                           ----------------------响应行
Server:Apache Tomcat/5.0.12                               ----------
Date:Mon,6Oct2003 13:23:42 GMT                                 响应头
Content-Length:112                                        ----------

<html>                                    --------------------响应正文
<head>
<title>HTTP响应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>

http响应码

HTTP响应码响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。 
响应码分五种类型,由它们的第一位数字表示:

1XX-信息类(Information),表示收到Web浏览器请求,正在进一步的处理中
2XX-成功类(Successful),表示用户请求被正确接收,理解和处理例如:200 OK
3XX-重定向类(Redirection),表示请求没有成功,客户必须采取进一步的动作。
4XX-客户端错误(Client Error),表示客户端提交的请求有错误 例如:404 NOT Found
意味着请求中所引用的文档不存在。
5XX-服务器错误(Server Error)表示服务器不能完成对请求的处理:如 500

常用的状态码

200   服务器成功返回内容
301/2 临时/永久重定向
304   资源未被修改过,重定向到浏览器缓存
404   请求内容不存在
403   (Forbidden/禁止)
500   服务器暂时不可用
503   服务器内部错误

具体含义如下:


http头部信息

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。

从上图可以看到,头部信息包括三部分:

1、通用头部

2、请求头部

3、响应头部

4、查询字符串参数

1、通用头部
通用头域包含请求和响应消息都支持的头域。

Request URL:请求的URL地址
Request Method: 请求方法,get/post/put/……
Status Code:状态码,200 为请求成功
Remote Address:路由地址



2、请求头部
     

1) Accept:  告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型;
2)Accept-Charset:  浏览器申明自己接收的字符集
  Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,
  支持什么压缩方法  (gzip,deflate)
3)Accept-Language:  浏览器申明自己接收的语言。语言跟字符集的区别:
   中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。
4)Authorization:  当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,
   该头部来回应自己的身份验证信息给WEB服务器。
5)Connection:表示是否需要持久连接。close(告诉WEB服务器或者代理服务器,
    在完成本次请求的响应后,断开连接,
     不要等待本次连接的后续请求了)。keep-alive(告诉WEB服务器或者代理服务器,
    在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
6)Referer:发送请求页面URL。浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 
   当前请求中的网址/URL。
7)User-Agent: 浏览器表明自己的身份(是哪种浏览器)。
8)Host: 发送请求页面所在域。
9)Cache-Control:浏览器应遵循的缓存机制。
   no-cache(不要缓存的实体,要求现在从WEB服务器去取)
   max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象) 
   max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值)  
   min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
10)Pramga:主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。
11)Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。
12)Form:一种请求头标,给定控制用户代理的人工用户的电子邮件地址。
13)Cookie:这是最重要的请求头信息之一

3、响应头部
   

1)Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
2)Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。
   bytes:表示接受,none:表示不接受。
3) Cache-Control:服务器应遵循的缓存机制。
    public(可以用 Cached 内容回应任何用户)
    private(只能用缓存内容回应先前请求该内容的那个用户)
    no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端) 
    max-age:(本响应包含的对象的过期时间)  
    ALL:  no-store(不允许缓存)  
4) Connection: 是否需要持久连接
    close(连接已经关闭)。
    keepalive(连接保持着,在等待本次连接的后续请求)。
    Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。
    例如:Keep-Alive:300
5)Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。 
    例如:Content-Encoding:gzip 
6)Content-Language:WEB 服务器告诉浏览器自己响应的对象的语言。
7)Content-Length:WEB 服务器告诉浏览器自己响应的对象的长度。
    例如:Content-Length: 26012
8)Content-Range:WEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。
    例如:Content-Range: bytes 21010-47021/47022
9)Content-Type:WEB 服务器告诉浏览器自己响应的对象的类型。
    例如:Content-Type:application/xml
10)Expired:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,
    只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。
11) Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间
   ,动态页面的最后产生时间等等。
12) Location:WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,
    到该头部指定的位置去取。
13)Proxy-Authenticate: 代理服务器响应浏览器,要求其提供代理身份验证信息。
14)Server: WEB 服务器表明自己是什么软件及版本等信息。
15)Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。

http头部关于缓存的字段

HTTP控制缓存的字段主要包括Cache-Control/Pragma,Expires,Last-Modified/Etag

Cache-Control/Pragma

这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,如果知道该页面是否为缓存,不仅可以控制浏览器,还可以控制和HTTP相关的缓存或代理服务器。它可以指定下列可选值:
    1、Public:所有内容都将被缓存,在响应头中设置
    2、Private:内容只缓存在私有缓存中,在响应头中设置
    3、no-cache:所有内容都不会被缓存,在请求头和响应头中设置
    4、no-store:所有内容都不会被缓存在缓存或Internet临时文件中,在响应头中设置
    5、must-revalidation/proxy-revalidation:如果缓存的内容失效,请求必须发送到服务  器/代理以进行重新验证,在请求头中设置
    6、max-age=xxx:缓存的内容将在xxx秒后失效,这个选项只在HTTP1.1中可用,和Last-Modified一起使用时优先级较高,在响应头中设置

    Cache-Control请求字段可以被个浏览器很好的支持,而且优先级也比较高,它和其他一些请求字段(如Expires)同时使用时,Cache-Control会覆盖其他字段

    Pragma字段的作用和Cache-Control类似,最常用的Pragma:no-cache,他和Cache-cache的作用是一致的。

Expires

Expires通常的使用格式是Expires:Sat,25 Feb 2012 12:22:17 GMT,后面跟着一个日期和时间,超过这个时间后,缓存的内容将失效,浏览器在发送请求之前检查这个页面的字段,看该页面是否已经过期了,如果过期,就向服务端重新发起请求。 

 Last-Modified/Etag

 Last-Modified字段一般用于表示一个服务器上的资源的最后修改时间,资源可以是静态资源,也可以是动态内容,通过这个最后修改时间可以判断当前请求的资源是否是最新的。
    一般服务端会在响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间,如Last-Modified:Sat, 25 Feb 2012 12:55:04 GMT,浏览器再次请求时在请求头中增加If-Modified-Since:Sat, 25 Feb 2012 12:55:04 GMT字段,询问当前缓存的页面是否是最新。如果是最新的就返回304,告诉浏览器是最新的,服务器也不会传输最新的数据
    Etag字段的作用和LastModified字段作用相同,这个字段的作用是让服务端给每个页面分配一个唯一的编号,然后通过这个编号来区分当前页面是否最新。这种方式比较灵活,但是当后端的服务器有多台时比较难以处理。
 

HTTP1.0 HTTP 1.1 HTTP 2.0主要区别

HTTP1.0 HTTP 1.1主要区别

长连接
HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。

HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。

节约带宽
HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。

这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。

另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。

HOST域
现在可以web server例如tomat,设置虚拟站点是非常常见的,也即是说,web server上的多个虚拟站点可以共享同一个ip和端口。

HTTP1.0是没有host域的,HTTP1.1才支持这个参数。

HTTP1.1 HTTP 2.0主要区别

多路复用
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。

当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。

TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求。

关于多路复用,可以参看学习NIO 。

数据压缩
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

服务器推送
意思是说,当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。

服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。

 参考:https://blog.csdn.net/xiaozhuxmen/article/details/51934706

https://blog.csdn.net/struggleshu/article/details/73113459

https://blog.csdn.net/linsongbin1/article/details/54980801/

猜你喜欢

转载自blog.csdn.net/qq_41720311/article/details/83901983