【转载】理解HTTP协议

在互联网时代HTTP协议的重要性无需多言,对于技术岗位的同窗们来讲理解掌握HTTP协议是必须的。本篇博客就从HTTP协议的演进、特性、重要知识点和工做中常见问题的总结等方面进行简单的介绍。理解掌握了这些点工做中就OK了,固然在面试中也是少不了的,若是能结合实践掌握这篇博客的80%应对通常的面试应该是够了。若是要深刻学习HTTP协议的细节请看那本经典的《HTTP权威指南》。html

1、HTTP协议的演进面试

HTTP(HyperText Transfer Protocol)协议是基于TCP的应用层协议,它不关心数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,最初是用来向客户端传输HTML页面的内容。默认端口是80。浏览器

一、HTTP 0.9版本 1991年缓存

这个版本就是最初用来向客户端传输HTML页面的,因此只有一个GET命令,而后服务器返回客户端一个HTML页面,不能是其余格式。利用这个版本彻底能够构建一个简单的静态网站了。安全

二、HTTP 1.0版本 1996年服务器

1.0版本是改变比较大的,奠基了如今HTTP协议的基础。这个版本的协议不只能够传输HTML的文本页面,还能够传输其余二进制文件,例如图片、视频。并且还增长了如今经常使用的POST和HEAD命令。请求消息和响应消息也不是单一的了,规定了一些元数据字段。例如字符集、编码、状态响应码等。网络

三、HTTP 1.1版本 1997年 app

其实是在1.0版本以后半年时间又发布了一个版本,这个版本在1.0版本的基础上更加完善了。这个版本增长了持久链接,就是说以前版本的协议一次请求就是一次TCP链接,请求完成后这个链接就关闭掉了。众所周知TCP协议是可靠的,创建链接须要3次握手,断开链接须要4次挥手,而且TCP有流量控制和拥塞控制,有慢开始机制,刚创建链接时传输比较慢,这是比较耗费资源的。一个丰富的页面会有许多图片、表单和超连接。这样的话就会有屡次的HTTP请求,因此在这个版本上默认不关闭TCP链接也不用声明Connection: keep-alive字段。若是确实要关闭能够指定Connection: close字段。还引入了管道机制,就是说在一个TCP链接里能够同时发送多个HTTP请求,而没必要等待上一个请求响应成功再发送。还增长了PUT、PATCH、HEAD、 OPTIONS、DELETE等命令,丰富了客户端和服务端交互动做。还增长了Host字段。框架

四、HTTP 2版本 2015年 分布式

这个版本也是随着互联网的发展,有了新的需求制定了新的功能还有对上一个版本的完善。1.1版本有了管道机制,可是正在服务端仍是要对请求进行排队处理。这个版本能够多工的处理。还有了头信息压缩和服务器的主动推送。

五、HTTPS

HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理。

关于HTTP协议历史演进的详细介绍请参考:http://www.ruanyifeng.com/blo...

下面介绍没有特殊说明默认HTTP/1.1版本

2、HTTP协议的特色

一、HTTP协议是无状态的

就是说每次HTTP请求都是独立的,任何两个请求之间没有什么必然的联系。可是在实际应用当中并非彻底这样的,引入了Cookie和Session机制来关联请求。

二、屡次HTTP请求

在客户端请求网页时多数状况下并非一次请求就能成功的,服务端首先是响应HTML页面,而后浏览器收到响应以后发现HTML页面还引用了其余的资源,例如,CSS,JS文件,图片等等,还会自动发送HTTP请求这些须要的资源。如今的HTTP版本支持管道机制,能够同时请求和响应多个请求,大大提升了效率。

三、基于TCP协议

HTTP协议目的是规定客户端和服务端数据传输的格式和数据交互行为,并不负责数据传输的细节。底层是基于TCP实现的。如今使用的版本当中是默认持久链接的,也就是屡次HTTP请求使用一个TCP链接。

3、HTTP报文

一、请求报文

举例:

GET /wxisme HTTP/1.1     
Host: www.cnblogs.com    
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0     
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5     
Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3     
Accept-Encoding: gzip,deflate     
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7     
Keep-Alive: 300     
Proxy-Connection: keep-alive     
Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45Cache-Control: max-age=0

简单来讲请求报文就是由请求行、请求头、内容实体组成的,注意,每一行的末尾都有回车和换行,在内容实体和请求头之间另有一个空行。其中请求行指定的是请求方法、请求URL、协议版本;请求头是键值对的形式存在的,就是字段名:值;内容实体就是要传输的数据。稍后会对方法、请求头字段作详细的说明。

二、响应报文

举例:

HTTP/1.1 200 OK
Date: Tue, 12 Jul 2016 21:36:12 
GMTContent-Length: 563
Content-Type: text/html
<html>    
    <body>    
        Hello http!    
    </body>
</html>

简单来讲响应报文由状态行、响应首部字段(响应头)、响应实体组成,其中第一行是状态行,依次包含HTTP版本,状态码和状态短语组成;在一个回车换行以后是响应头,也是键值对的形式,字段名:值;而后会有一个空行也包含回车换行,以后是响应实体,就是要传输的数据。在上面的例子当中就是一个很是简单的HTML页面。对于响应状态码,首部字段键值对稍后会有更加详细的说明。

4、HTTP请求方法

请求方法是客户端用来告知服务器其动做意图的方法。就像下达命令同样。在HTTP1.1版本中支持GET、POST等近10种方法。须要注意的是方法名区分大小写,须要用大写字母。下面详细说明。

一、GET:获取资源

GET方法用来请求访问已被URI识别的资源。也就是指定了服务器处理请求以后响应的内容。

二、POST:传输实体主体

POST方法用来传输实体主体。POST与GET的区别之一就是目的不一样,两者之间的区别会在文章的最后详细说明。虽然GET方法也能够传输,可是通常不用,由于GET的目的是获取,POST的目的是传输。

三、PUT:传输文件

PUT方法用来传输文件。相似FTP协议,文件内容包含在请求报文的实体中,而后请求保存到URL指定的服务器位置。

四、HEAD:得到报文首部

HEAD方法相似GET方法,可是不一样的是HEAD方法不要求返回数据。用于确认URI的有效性及资源更新时间等。

五、DELETE:删除文件

DELETE方法用来删除文件,是与PUT相反的方法。DELETE是要求返回URL指定的资源。

六、OPTIONS:询问支持的方法

由于并非全部的服务器都支持规定的方法,为了安全有些服务器可能会禁止掉一些方法例如DELETE、PUT等。那么OPTIONS就是用来询问服务器支持的方法。

七、TRACE:追踪路径

TRACE方法是让Web服务器将以前的请求通讯环回给客户端的方法。这个方法并不经常使用。

八、CONNECT:要求用隧道协议链接代理

CONNECT方法要求在与代理服务器通讯时创建隧道,实现用隧道协议进行TCP通讯。主要使用SSL/TLS协议对通讯内容加密后传输。

汇总:

5、HTTP的响应状态码

状态码是用来告知客户端服务器端处理请求的结果。凭借状态码用户能够知道服务器是请求处理成功、失败或者是被转发;这样出现了错误也好定位。状态码是由3位数字加缘由短语组成。3位数字中的第一位是用来指定状态的类别。共有5种。

HTTP状态码一共有60多种,可是不用所有都记住,由于大部分在工做当中是不常用的。常用的大概就是16种,下面来详细介绍。(其实最最经常使用的也就8种,下面有背景色的就是)

一、200:OK

这个没有什么好说的,是表明请求被正常的处理成功了。

二、 204:No Content

请求处理成功,可是没有数据实体返回,也不容许有实体返回。好比说HEAD请求,可能就会返回204 No Content,由于HEAD就是只获取头信息。这里简单提一下205 Reset Content,和204 No Content的区别是不但没有数据实体返回,并且还须要重置表单,方便用户再次输入。

三、206:Partial Content

这是客户端使用Content-Range指定了须要的实体数据的范围,而后服务端处理请求成功以后返回用户须要的这一部分数据而不是所有,执行的请求就是GET。返回码就是206:Partial Content。

四、301 : Moved Permanently

表明永久性定向。该状态码表示请求的资源已经被分配了新的URL,之后应该使用资源如今指定的URL。也就是说若是已经把资源对应的URL保存为书签了,这是应该按照Location首部字段提示的URL从新保存。

五、302:Found

表明临时重定向。该状态码表示请求的资源已经被分配了新的URL,可是和301的区别是302表明的不是永久性的移动,只是临时的。就是说这个URL还可能会发生改变。若是保存成书签了也不会更新。

六、303:See Other

和302的区别是303明确规定客户端应当使用GET方法。

七、304:Not Modified

该状态码表示客户端发送附带条件请求时,服务器端容许请求访问资源,可是没有知足条件。304状态码返回时不包含任何数据实体。304虽然被划分在3XX中可是和重定向没有关系。

八、307:Temporary Redirect

临时重定向,与302 Found相同,可是302会把POST改为GET,而307就不会。

九、400:Bad Request

400表示请求报文中存在语法错误。须要修改后再次发送。

十、401:Unauthorized

该状态码表示发送的请求须要有经过HTTP认证的认证信息。

十一、403:Forbidden

代表请求访问的资源被拒绝了。没有得到服务器的访问权限,IP被禁止等。

十二、404:Not Found

代表请求的资源在服务器上找不到。固然也能够在服务器拒绝请求且不想说明理由时使用。

1三、408:Request Timeout

表示客户端请求超时,就是在客户端和服务器创建链接后服务器在必定时间内没有收到客户端的请求。

1四、500:Internal Server Error

代表服务器端在执行请求时发生了错误,颇有多是服务端程序的Bug或者临时故障。

1五、503:Service Unavailable

代表服务器暂时处于超负载或正在进行停机维护,如今没法处理请求。若是事先得知解除以上情况须要的时间,最好写入Retry-After字段再返回给客户端。

1六、504:Getaway Timeout

网关超时,是代理服务器等待应用服务器响应时的超时,和408 Request Timeout的却别就是504是服务器的缘由而不是客户端的缘由

更加详细的状态码请参考:http://tool.oschina.net/commo...

6、HTTP的首部字段

HTTP首部字段是构成HTTP报文最重要的元素之一。在客户端与服务端以前进行信息传递的时候请求和响应都会使用首部字段,会传递一些重要的元信息。首部字段是以键值对的形式存在的。包含报文的主体大小、语言、认证信息等。HTTP首部字段包含4种类型:

通用首部字段(General Header Fields)

表明请求报文和响应报文都会使用的字段

请求首部字段(Request Header Fields)

是客户端向服务端发送请求时使用的首部字段。包含请求的附加内容、客户端信息、响应内容相关优先级等信息。

响应首部字段(Response Header Fields)

是服务端向客户端返回响应时使用的首部字段,包含响应的附加内容,可能也会要求客户端附加额外的内容信息。

实体首部字段(Entity Header Fields)

是针对请求报文和响应报文的实体部分使用的首部。包含资源内容更新时间等和实体有关的信息。

在HTTP/1.1种规定了47种首部字段(图表参考《图解HTTP》,感谢做者。)

通用首部字段

请求首部字段

响应首部字段

实体首部字段

其余首部字段

Cookie、Set-Cookie、Content-Disposition、Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade etc...

这么多的首部字段,估计若是不是很了解会被吓着,可是根本不用所有记住,其实字段的名字就说明了做用,看一眼就大概知道是干啥的了,只不过有些相似的字段要区分一下就行了。只要深入理解了HTTP的设计思路就没有大问题了,熟悉常见的就能够了。用到的时候想了解细节再去查。

关于首部字段的细节请参考《图解HTTP》或者《HTTP权威指南》的首部字段部分。够再写一篇长博客的了~

以上就把HTTP协议的重点内容——报文格式、方法、状态码、首部字段介绍完了,能够说对HTTP协议有了一些了解。下面就工做中的常见问题(或者说面试中的)作一个总结。^_^

7、关于HTTP的常见问题及解答

一、GET和POST的区别

A. 从字面意思和HTTP的规范来看,GET用于获取资源信息而POST是用来更新资源信息。

B. GET提交请求的数据实体会放在URL的后面,用?来分割,参数用&链接,举个栗子:/index.html?name=wang&login=1

C. GET提交的数据长度是有限制的,由于URL长度有限制,具体的长度限制视浏览器而定。而POST没有。

D. GET提交的数据不安全,由于参数都会暴露在URL上。

二、408 Request Timeout和504 Gateway Timeout的区别

408是说请求超时,就是创建链接以后再约定的时间内客户端没有发送请求到客户端到服务端。本质上缘由在于客户端或者网络拥塞。504是网关超时,是说代理服务器把客户端请求转发到应用服务器后再约定的时间内没有收到应用服务器的响应。本质上缘由在于服务端的响应过慢,也有多是网络问题。

三、Cookie和Session的区别和联系

Cookie和Session都是为了保存客户端和服务端之间的交互状态,实现机制不一样,各有优缺点。首先一个最大的区别就是Cookie是保存在客户端而Session就保存在服务端的。Cookie是客户端请求服务端时服务器会将一些信息以键值对的形式返回给客户端,保存在浏览器中,交互的时候能够加上这些Cookie值。用Cookie就能够方便的作一些缓存。Cookie的缺点是大小和数量都有限制;Cookie是存在客户端的可能被禁用、删除、篡改,是不安全的;Cookie若是很大,每次要请求都要带上,这样就影响了传输效率。Session是基于Cookie来实现的,不一样的是Session自己存在于服务端,可是每次传输的时候不会传输数据,只是把表明一个客户端的惟一ID(一般是JSESSIONID)写在客户端的Cookie中,这样每次传输这个ID就能够了。Session的优点就是传输数据量小,比较安全。可是Session也有缺点,就是若是Session不作特殊的处理容易失效、过时、丢失或者Session过多致使服务器内存溢出,而且要实现一个稳定可用安全的分布式Session框架也是有必定复杂度的。在实际使用中就要结合Cookie和Session的优缺点针对不一样的问题来设计解决方案。