本文内容概括:

事务和方法

请求和响应的报文格式

无连接&断开

状态码

事务和方法:

本小节主要介绍了http当中的事务和方法,一个事务可以理解成为一个请求和相应的响应,而方法就是要执行的动作.

事务:客户端对http服务的一次请求加上http服务的一次响应就可以标识一个http完整的连接,这个过程就是http的事务.

方法:客户端对http的请求不仅一种,有时我们需要获取页面(get),有时我们需要向http提交页面(put),有的时候仅需要知道有没有这个报文希望http服务端响应一下就好,不用把页面的数据传送回来(head),有时需要提交表单(pust),删除页面(delete),事实上常用的方法有8种,以下的几种比较常见.

1.    GET:客户端向服务器请求获取资源,需要服务器回复响应报文。

2.    HEAD:与GET相似,仅要求服务器端返回首部信息即可以,不需要将内容返回,用于探测

3.    POST:支持HTML表单的提交,比如当用户注册的时候,用户注册的信息会通过表单的形式发送到服务器,由服务器存储到某个位置(例如发给处理程序做处理)

4.    PUT:也是提交,post偏向于提交创建,而PUT偏向于提交之后更新。

5.    DELETE:请求删除URL指向的资源

6.    OPTIONS:探测服务器对某资源所支持的请求方法

7.    TRACE:跟踪请求要经过的防火墙、代理或网关

请求和响应格式

请求和响应:整体来讲http的报文只有两种格式,一是请求,二是响应.无论是请求报文还是响应报文都是有特殊格式的.

请求报文格式:request

<method> <reqest-URL> <version>   #<方法><资源><版本>,因不同的版本特性不同,所以必须注明版本(http)信息.
<headers>   #是用来标记属性的,每个请求或者响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值。
       #这个空白行是必须要有的
<entity-body>#报文的主体,包含要请求的内容,请求报文的实体有可能为空,请求就应该为空,因为本来就不传输什么。

响应报文格式:response

<version><status><reason-phrase>       #<版本><状态><原因短语>,比如1.1 200 ok
<headers>                  #这指的是一个类:首部,其实首部就是指的是名称+值的格式,可以有多个
                       #这个空白行是必须要有的
<entity-body>                #报文的主体,包含要回应的内容,如果是响应是一个文件的话,那么这个文件就包含在entity-body里面。

无连接和断开机制

本小节概括:本小节主要介绍http的无连接机制,为什么要加速?怎样加速?

http是无连接的,何为无连接?即完成一次事务就必须断开,就是收到一个请求然后做出一个回应之后就要断开,这种机制其实是比较浪费资源的,效率低下,下文有一个例子,请仔细的体会:

当客户端访问www.baidu.com的时候,除去DNS不谈,第一步就是通过URL事务获取一个网页(一去一回),这一步仅仅是为获得网页的内容而已,仅这一个事务就经历了三次握手和四次挥手,然后客户端的浏览器通过读取获得的html文件得知还要获得10个图片,然后还要经历10个三次握手和四次挥手才能完整的显示出百度的页面.如果淘宝的网页的话可能有上百个图片需要获得,所以效率非常的低下.

因为无连接的http效率非常的低下,所以需要加速,其实加速的目的很简单,就是为了让用户获得更好的体验,获得网页的速度能够加快,那么怎样才能加速http呢?两种方法,并行和保持连接.

所谓并行,就是客户端一次发多个请求,而服务器一次回应多个请求,假如当一个浏览器读取html文件后发现还要获得10个图片,客户端会在建立三次握手之后 ,一次性发出5个请求,然后服务器也同时响应这个5个请求,客户端等到5个图片获得之后再四次挥手,这样话10张图片仅需要两次三次握手和四次挥手,当然这是建立在所有的图片都得在同一个IP下,如果不在同一个IP下,一般来讲都会在一个主机上,一般不会有那种10张图片分布10台服务器的情况,如果10张图片都分布在10个服务器上的话并行的机制就无法完成,就只能一个事务一事物的连接,毕竟一次连接只能用于一个IP.必须要提的是并行的机制是发生在获得主页面的前提下,任何加速方式都是在获得主网页的前提下实现的,而获得主页面的过程,客户端和服务器必须老老实实的完成一个事务.

所谓保持连接就非常好理解了,当获得主要页面之后,三次握手获得一个图片之后并不进行四次挥手,而是一直保持着连接,来完成下面9张图片的传输,等到9张图片都传输完毕之后再进行四次挥手,这种方式的效率是很高的,但并不是完全没有缺点,假如一个服务器只能同时接收5000个连接,但是同时进来了10000个请求,那么5000连接就要被拒之门外,而已经连入的5000个请求因为要请求的资源很多,很长时间都不断开的话,门外的5000个连接就没有机会,我们深入想一想就会知道这种情况并不好,用户体验很差,用户连接了几次发现很验证连上可能以后都不会这个网站了,上次考试报名的时候就遇到过这种情况 .所以为了保证服务质量和用户体验,所以http又有断开的机制,下面就来讲一下http的断开机制.

 

断开机制:保持连接,三次握手以后不断开,完成之后终的断开,并不是全都是好处,比如说当用户访问淘宝的时候刚打开网页却恰好有事出去了,对于服务器来并不知道,服务器仍然以为有人在访问它,一个用户无所谓,假如是成千上万台都这样做呢?有的×××方式就是这种原理,所以服务器有一种机制来防止这种情况的发生,那就是断开机制。

其实断开机制是我们买车时候的保险是相似的,一台新车在3年或者10万公里内可以保修,那么这个3年和10万公里是什么意思?是这样:

Ø  如果3年不到但是已经超过了10万公里,对不起,不保修!,因为违反了公里限制!

Ø  如果3年到了但是没有超过10万公里,对不起,不保修!因为这里违反了时间限制!

Ø  只有在3年以内而且没有跑够10万公里,才可以保修。

断开的方式:超时或者限制最大资源数

超时:工程师规定连接到达10秒,就必须重新断开

限制最大资源数:一旦链接后的请求资源达到100个就必须断开,一秒到上限就一秒断开,1分钟到达上限就一分钟断开

 

这两种规则是同时生效的,无论违反哪一个就会断开重新连接,这种机制就是为了弥补保持连接的,让那些被“拒之门外”的连接也有很大的机会。

客户端在建立连接之后到达10秒上限,断开,重新连接

客户端在建立连接之后请求了100个资源,断开,重新连接

状态码

1XX

1XX:1开头的状态码都是信息性状态码,没什么具体的含义,也很少见到

2XX

2XX:以2开头有一个必须要记住200,200代表成功状态,201代表提交成功

3XX

3XX:重定向状态码:

301:moved  parmanently永久重定向,在服务器响应时使用首部”location:URL”指定资源现在所处的位置,比如客户端把URL指向服务器上的一软链接,服务器给客户端响应时会在首部告诉客户端真正的文件在什么地方,让客户端再去连接。

302:found,临时的重定向,在服务器响应时使用首部”location:URL”指定资源现在所处的位置,看下来与永久重定向没有什么区别?事实上,区别还是很大的,一个永久重定向告诉客户端真实文件所在之处后,客户端就可以直接使用真正的位置,而临时重定向则不然,客户端每次访问时也要先访问这个临时重定向,每一次事务都要要如此,因为它是临时,保不齐什么时候又指向别的位置了呢。

总结:永久的重定向可以留给后面的连接用,而临时的连接不能留给后面的连接使用

304:not modified没有改变,当用户使用浏览器访问一个网站之后,会在本地有一个缓存,等到下次再访问的时候,服务器端直接响应一个304告诉客户端网页没有改变,这样的话可以加快用户的体验。

4XX

4XX:客户端的错误

403:forbidden请求被服务器拒绝,可能没有权限

404:not found 服务器没有找到请求的URL

405:不允许使用此方法请求相应的URL

5XX

5XX:服务器错误

500:internal server error 服务器内部错误

502:bad gateway代理服务器或者网关路由出了问题,也可以从上游收到了一条不能用的响应。

503:service unavailable服务器此时无法提供服务,但将来可以使用