·HTTP是整个Web的基础,是客户端和服务器端协同工作的基石。要想了解Web的工作原理,优化Web应用,就要完全理解http协议。
1、HTTP协议详解
简单来说,HTTP就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范——HTTP协议。HTTP协议从WWW服务器传输超文本到本地浏览器,可以让浏览器更加高效。HTTP协议不仅保证计算机正确快速地传输超文本文档,还能确定传输文档中的哪一个部分,以及哪部分内容首先显示(如文本或图形)等。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS协议(安全传输层协议)或SSL(安全套接层协议)之上,这时候,就成了常说的HTTPS。默认HTTP协议的端口号为80,HTTPS的端口号为443。
HTTP协议的模型就是客户端发起请求,服务器回送相应。这种设计属于典型的问答式交互,客户端和服务器端一问一答,使HTTP协议模型格外简单。这种设计也存在问题,比如服务器端不会主动向客户端PUSH,一问一答的轮询方式也会使TCP链接频繁建立和断开,导致其交互效率不高。基于以上缺点,SPDY协议应运而生。
SPDY优化了浏览器和服务器之间的通信,支持流复用,具备优先级的请求、主动发起请求,强制SSL安全传输等先进的特性。
HTTP协议如何工作
HTTP除了应用在Web端,也可以应用在其他方面,只要通信的双方都遵守HTTP协议即可。如迅雷,腾讯QQ等。
HTTP协议是如何工作的呢?
首先,客户端发送一个请求给服务器,服务器在接受到这个请求后将生成一个相应返回给客户端。一次HTTP操作称为一个事务,其工作过程可分为四步:
1、客户机与服务器建立连接。单击某个超链接,HTTP协议的工作开始。
2、建立连接后,客户机发送一个请求给服务器。格式为:前面是URL,中间是协议版本号,后面是MIME信息
3、服务器接收到请求后,给予相应的响应信息。格式为:首先是一个状态行,(包括信息的协议版本号,一个成功或者错误的代码),然后是MIME信息。
4、客户端接收服务器返回的信息并且显示在用户的显示屏上,然后客户机与服务器断开连接。
如果以上的某一部出现错误,产生错误的信息将返回到客户端,由显示屏输出。对于用户来说,这些过程是由HTTP协议自己完成是,用户只要用鼠标单击,等待信息显示就可以了。
请求
HTTP请求由三部分组成:请求行、消息报头、请求正文。请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
Method Request -URI HTTP -Version CRLF
上述格式中各个参数说明如下:
Method:请求方法。
Request-URI:一个统一资源标识符。
HTTP-Version:请求的HTTP协议版本。
CRLF:回车和换行
请求方法有多种:
GET:请求获取Request-URI所标识的资源。
POST:在Request-URI所标识的资源后附加新的数据。
HEAD:请求获取由Request-URI所标识的资源的响应消息报头。
PUT:请求服务器存储一个资源,并用Request-URI作为其标识。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:请求服务器回送收到的请求信息,用于测试或者诊断。
CONNECT:保留以备将来使用。
响应
在接收和解释请求消息后,服务器返回一个HTTP响应消息。HTTP响应也是由三个部分组成,分别是:状态行、消息报头和响应正文。状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version 表示服务器 HTTP 协议的版本
Status-Code 表示服务器发回的响应代码
Reason-Phrase 表示状态代码的文本描述
CRLF 表示回车换行。例如:
HTTP/1.1 200 OK (CRLF)
状态代码与状态描述
状态代码由 3 位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有 5 种取值,如下所示。
1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——请求有语法错误或请求无法实现
5xx:服务器端错误——服务器未能实现合法的请求。
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常