一,定义
HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
HTTP
是一种无状态 (stateless) 协议, HTTP
协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。
二,详解
1,URL
HTTP URL
包含了用于查找某个资源的详细信息, 格式如下:
http://host[":"port][abs_path]
2,HTTP请求
由上图可以看到,http请求由请求行,消息报头,请求正文三部分构成。
HTTP请求状态行
请求行由请求Method
, URL
字段和HTTP Version
三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本例如:
GET /example.html HTTP/1.1 (CRLF)
HTTP协议的方法有: GET
: 请求获取Request-URI所标识的资源 POST
: 在Request-URI所标识的资源后增加新的数据 HEAD
: 请求获取由Request-URI所标识的资源的响应消息报头 PUT
: 请求服务器存储或修改一个资源,并用Request-URI作为其标识 DELETE
: 请求服务器删除Request-URI所标识的资源 TRACE
: 请求服务器回送收到的请求信息,主要用于测试或诊断 CONNECT
: 保留将来使用 OPTIONS
: 请求查询服务器的性能,或者查询与资源相关的选项和需求
HTTP请求头
消息报头由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息
HTTP请求正文
只有在发送POST
请求时才会有请求正文,GET
方法并没有请求正文。
3,HTTP响应
HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。
HTTP响应状态行
状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:
HTTP/1.1 200 OK (CRLF)
HTTP响应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: 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 - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
三,HTTP的五大特点
- 支持客户/服务器模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。 - 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由
Content-Type
加以标记。 - 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过
Connection: Keep-Alive
实现长连接 - 无状态:
HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
四,非持久连接和持久连接
在实际的应用中,客户端往往会发出一系列请求,接着服务器端对每个请求进行响应。对于这些请求|响应,如果每次都经过一个单独的TCP连接发送,称为非持久连接。反之,如果每次都经过相同的TCP连接进行发送,称为持久连接。
非持久连接在每次请求|响应之后都要断开连接,下次再建立新的TCP连接,这样就造成了大量的通信开销。例如前面提到的往返时间(RTT)
就是在建立TCP连接的过程中的代价。
非持久连接给服务器带来了沉重的负担,每台服务器可能同时面对数以百计甚至更多的请求。持久连接就是为了解决这些问题,其特点是一直保持TCP连接状态,直到遇到明确的中断要求之后再中断连接。持久连接减少了通信开销,节省了通信量。
五,HTTP的不足
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
这些需要通过HTTPS(HTTP+SSL)来解决