HTTP协议详解
此文为以下文章的学习笔记,为尊重原创,链接:http://www.cnblogs.com/wxisme/p/6212797.html 与 http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html
一.概念
HTTP(超文本传输协议)是一种通讯协议,它允许将超文本标记语言(HTML)文档从WEB服务器传送到客户端的浏览器。
HTTP超文本传输协议是一种详细规定了浏览器和万维网服务器之间相互通讯的规则,通过因特网传送万维网文档的数据传输协议。
HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少,它不仅保证计算机正确快速的传输超文本文档,还确定文档中的哪一部分,以及那部分内容首先显示等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
在Internet中所有的传输都是通过TCP/IP进行的,HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载在TCP协议之上,有时也承载在TLS或SSL协议层之上,就这是我们常说的HTTPS。
HTTP默认端口是80
浏览网页是HTTP的主要作用,但是这并不代表HTTP就只能应用于网页的浏览。
二.特点
HTTP协议永远是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器蒋消息推送给客户端。
HTTP协议主要特点如下:
1.支持客户/服务器模式,支持基本认证和安全认证。
2.简单快速:客户想服务器请求服务时,只需要传送请求方法和路径。请求方法常用的有GET,POST,HEAD。每种方法规定了客户与服务器的联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通讯速度很快。
3.灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。
4.HTTP 0.9和1.0使用非连续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,既断开连接。HTTP1.1使用连续连接:不必为每个WEB对象创建一个新的连接,一个连接可以传送多个对象。
5.无状态:HTTP协议是无状态协议,无状态是指对于事物处理能有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
无状态协议:
协议的状态是下一次传输可以“记住”这次传输信息的能力。HTTP是不会为了下一次连接而维护这次连接所传输的信息,为了保证服务器内存。
比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登录该网站,但是服务器并不知道客户关闭了一次浏览器。
由于WEB服务器要面对很多浏览器的并发访问,为了提高WEB服务器对并发访问的处理能力,在设计HTTP协议时规定WEB服务器发送应答报文和文档时,不保存发出请求的WEB浏览器进程的任何状态信息。这有可能出现一个浏览器在短短几秒之内两次访问同一个对象时,服务器进程不会因为已经给它发过应答报文而不接受第二次的服务请求。由于WEB服务器不保存发送请求的WEB浏览器进程的任何信息,因此HTTP协议属于无状态协议。
HTTP协议是无状态的和connection:keep-alive的区别:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一个方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面相连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议。
从HTTP1.1起,默认都开启了KEEP-ALIVE,保持连接连续性,简单的说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会急促使用这一条已经建立的连接。
KEEP-ALIVE不会永久保持连接,它有一个保持时间,可以在不同的服务器软件中设定这个时间。
三.工作流程
一次HTTP操作成为一个事务,其工作步骤分为四步:
1.首先客户端与服务器需要建立连接,只要单机某个超级链接,HTTP的工作开始。
2.建立连接后,客户端发送一个请求给服务器,如:GET www.baidu.com HTTP/1.1
3.服务器接收到请求后,给予相应的相应信息,如:HTTP/1.1 200 OK
4.客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上
图:
HTTP是基于传输层的TCP协议,而TCP是一个端到端的面相连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”,下图就是三次握手截图:
四.抓包
1.No1:浏览器(192.168.1.6)向服务器(115.239.210.36)发出连接请求。此为TCP三次握手的第一步:SYN,seq:X(X=0)
2.No2:服务器(115.239.210.36)回应了浏览器(192.168.1.6)的请求,并确认请求,此时为 SYN,ACK 此时seq:(Y=0),ACK:X+1(X=0),此为握手的第二步。
3.No3:浏览器(192.168.1.6)回应了服务器的确认,连接成功,为ACK,此时seq:X+1(X=0),ACK:y+1(y=0),此为握手的第三步。
4.No4:浏览器(192.168.1.6)发出一个页面HTTP请求。
5.No5:服务器(115.239.210.36)发送数据。
五.头域
5.1 请求方法
GET:向特定资源发出请求,注意:GET方法不应与当被用于产生“副作用”的操作中,例如在web app中,其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST:向指定资源提交数据进行处理请求,数据被包含在请求体中,POST请求可能会导致新的资源的建立或已有资源的修改。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中元信息,该方法用于测试超链接的有效性,是否可以访问。
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向WEB服务器发送“*”的请求来测试服务器的功能性。
PUT:向指定资源位置上传最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求。
CONNECT:HTTP 1.1协议中预留能够将连接改为管道方式的代理服务器。
5.2 POST与GET区别
1.GET提交的数据在URL之后,以?分割URL和传输数据,参数之间以&相连接,如edit.aspx?name=test&id=100。POST是将提交的数据放在HTTP包的body中。
2.GET提交的数据大小有限制,最多只有1024byte,而POST却没有限制。
3.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4.GET方式提交数据,会带来安全问题,比如登录时,用户名和密码会出现在URL中。
5.3 请求报文
5.4 响应报文
5.5 响应状态码
状态码是用来告知客户端服务器端处理请求的结果。凭借状态码用户可以知道服务器是请求处理成功、失败或者是被转发;这样出现了错误也好定位。状态码是由3位数字加原因短语组成。3位数字中的第一位是用来指定状态的类别。共有5种。
HTTP状态码一共有60多种,但是不用全部都记住,因为大部分在工作当中是不经常使用的。经常使用的大概就是16种,下面来详细介绍。(其实最最常用的也就8种,下面有背景色的就是)
1. 200:OK
这个没有什么好说的,是代表请求被正常的处理成功了。
2. 204:No Content
请求处理成功,但是没有数据实体返回,也不允许有实体返回。比如说HEAD请求,可能就会返回204 No Content,因为HEAD就是只获取头信息。这里简单提一下205 Reset Content,和204 No Content的区别是不但没有数据实体返回,而且还需要重置表单,方便用户再次输入。
3. 206:Partial Content
这是客户端使用Content-Range指定了需要的实体数据的范围,然后服务端处理请求成功之后返回用户需要的这一部分数据而不是全部,执行的请求就是GET。返回码就是206:Partial Content。
4. 301 : Moved Permanently
代表永久性定向。该状态码表示请求的资源已经被分配了新的URL,以后应该使用资源现在指定的URL。也就是说如果已经把资源对应的URL保存为书签了,这是应该按照Location首部字段提示的URL重新保存。
5. 302:Found
代表临时重定向。该状态码表示请求的资源已经被分配了新的URL,但是和301的区别是302代表的不是永久性的移动,只是临时的。就是说这个URL还可能会发生改变。如果保存成书签了也不会更新。
6. 303:See Other
和302的区别是303明确规定客户端应当使用GET方法。
7. 304:Not Modified
该状态码表示客户端发送附带条件请求时,服务器端允许请求访问资源,但是没有满足条件。304状态码返回时不包含任何数据实体。304虽然被划分在3XX中但是和重定向没有关系。
8. 307:Temporary Redirect
临时重定向,与302 Found相同,但是302会把POST改成GET,而307就不会。
9. 400:Bad Request
400表示请求报文中存在语法错误。需要修改后再次发送。
10. 401:Unauthorized
该状态码表示发送的请求需要有通过HTTP认证的认证信息。
11. 403:Forbidden
表明请求访问的资源被拒绝了。没有获得服务器的访问权限,IP被禁止等。
12. 404:Not Found
表明请求的资源在服务器上找不到。当然也可以在服务器拒绝请求且不想说明理由时使用。
13. 408:Request Timeout
表示客户端请求超时,就是在客户端和服务器建立连接后服务器在一定时间内没有收到客户端的请求。
14. 500:Internal Server Error
表明服务器端在执行请求时发生了错误,很有可能是服务端程序的Bug或者临时故障。
15. 503:Service Unavailable
表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After字段再返回给客户端。
16. 504:Getaway Timeout
网关超时,是代理服务器等待应用服务器响应时的超时,和408 Request Timeout的却别就是504是服务器的原因而不是客户端的原因
更加详细的状态码请参考:http://tool.oschina.net/commons?type=5