一、定义
The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborative, hypermedia information systems. HTTP is the foundation of data communication for the World Wide Web. Hypertext is structured text that uses logical links (hyperlinks) between nodes containing text. HTTP is the protocol to exchange or transfer hypertext. -- wikipedia
从HTTP的定义可以看出,HTTP协议是互联网上进行数据通信的基础协议,用来交换或传输超文本。超文本是一种结构化的文本,在包含文本的节点之间使用逻辑链接(也叫超链接)。
二、概述
HTTP是基于TCP/IP协议的应用层协议。HTTP允许进行客户端和服务器之间的通信。通过HTTP或HTTPS请求的资源由URI(统一资源标识符)或URL(统一资源定位符)来标识。
在客户端-服务器的模式中,HTTP扮演着请求-响应协议的角色。客户端(通常是浏览器)提交HTTP请求消息给服务器。服务器可以提供HTML文件或其他类型的资源,或者代表客户端执行操作,返回响应消息给客户端。响应包含关于请求的完整状态信息。
三、历史
1、HTTP/0.9
该版本于1991年发布。
- 只接受GET一种请求方法,没有指定版本号,且不支持请求头。
- 服务器只能返回HTML格式的字符串。
2、HTTP/1.0
该版本于1996年发布。
- 除了GET方法,还新增了POST和HEAD。任何格式的内容都可以发送。
- 请求和响应的格式,除了数据部分,还包括头信息,用来描述元数据。
- 新增了状态码、多字符集支持、权限、缓存、内容编码等功能。
3、HTTP/1.1
该版本于1997年发布。对1.0版本进行了修订和完善,并一直沿用至今。
- 新增了PUT、PATCH、OPTIONS、DELETE等方法。
- 客户端请求的头信息新增了Host字段,用来指定服务器的域名,这样就可以将请求发往同一台服务器的不同网站。
- 新增了持久连接,可以被多个请求多次使用。
- 新增了管道机制,在同一个TCP连接里,客户端可以同时发送多个请求,但服务器还是按照顺序进行响应。
- 使用Content-Length声明本次响应的数据长度,以区分多个响应。
4、HTTP/2
该版本于2015年发布。
- 头信息和数据都是二进制,统称为帧。对头信息进行了压缩。
- 在一个TCP连接中,客户端可以同时发送多个请求或接收响应,不需要按照顺序一一对应。
- 将每个请求或响应的所有数据包称为一个数据流,在发送数据包的时候必须标记属于哪个数据流。
- 允许服务器主动向客户端推送,发送资源。
四、格式
每个HTTP请求和响应都遵循相同的格式,包含请求行/状态行、消息头(Header)和消息体(Body),其中消息体是可选的。
- 消息头包含若干属性,但要保证一行只有一个属性,并且必须以\r\n(回车换行)结尾。
- 当遇到空行时,后面的数据全属于消息体。
五、HTTP请求
1、请求行
GET / HTTP/1.1
其中,GET表示请求方法;/表示请求资源的路径;HTTP/1.1表示协议版本。
2、请求方法
用来表明对指定资源的操作方式。常用的请求方法有:
- OPTIONS,返回服务器针对特定资源所支持的HTTP请求方法。
- HEAD,与GET请求一致,只不过不会返回响应体。
- GET,请求指定的资源。
- POST,向指定资源提交数据进行处理请求,数据包含在请求体中,可能会导致新资源的创建或已有资源的修改。
- PUT,向指定资源位置上传最新内容。
- DELETE,请求服务器删除所标识的资源。
GET和POST方法的主要区别:
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连。POST把提交的数据放在Body中。
- GET提交的数据大小最多1024字节。POST提交的数据大小没有限制。
- GET提交数据时,会出现在URL上。POST则不会出现在URL上。
3、请求头
是对请求的一种限定,包含很多属性。常用的属性有:
- Accept,客户端可以接受的MIME类型。
- Accept-Encoding,客户端可以接受的数据压缩格式。
- Accept-Charset,客户端可以接受的字符集编码。
- Accept-Language,客户端可以接受的语言。
- User-Agent,客户端的一些基本信息,如使用的操作系统和浏览器的名称和版本等。
- Content-Type,表示请求中的媒体类型信息。
- Content-Length,表示请求消息体的长度。
- Connection,指定是否继续保持连接。
- Host,指定要访问的虚拟主机名和端口号。
- Cookie,将cookie值发送给服务器。
- If-Modified-Since,缓存资源的最后获取时间。
六、HTTP响应
1、状态行
HTTP/1.1 200 OK
其中,HTTP/1.1表示协议版本;200表示状态码;OK是状态说明。
2、状态码
根据响应结果的类型,大致分为以下几类:
2.1 1XX(信息类)
该类型状态码表示接收到请求并且继续处理。
- 100,客户端必须继续发出请求。
- 101,客户端要求服务器根据请求转换HTTP协议版本。
2.2 2XX(响应成功)
该类型状态码表示动作被成功接收、理解和接受。
- 200,表明该请求被成功地完成,所请求的资源发送到客户端。
- 201,提示知道新文件的URL。
- 202,接受并处理,但处理未完成。
- 203,返回信息不确定或不完整。
- 204,收到请求,但返回信息为空。
- 205,服务器完成了请求,用户必须复位当前已经浏览过的文件。
- 206,服务器已经完成了部分用户的GET请求。
2.3 3XX(重定向类)
该类型状态码表示为了完成指定的动作,必须接受进一步处理。
- 300,请求的资源可在多处获得。
- 301,本网页被永久性转移到另一个URL。
- 302,请求的网页被重定向到新的地址。
- 303,建议用户访问其他URL或访问方式。
- 304,自从上次请求后,请求的网页未修改过。
- 305,请求的资源必须从服务器指定的地址获得。
- 306,前一版本HTTP中使用的代码,现已不再使用。
- 307,声明请求的资源临时性删除。
2.4 4XX(客户端错误类)
该类型状态码表示请求包含错误语法或不能正确执行。
- 400,客户端请求有语法错误。
- 401,请求未经授权。
- 402,保留有效ChargeTo头响应。
- 403,禁止访问,服务器收到请求,但拒绝提供服务。
- 404,可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。
- 405,用户在Request-Line字段定义的方法不被允许。
- 406,根据用户发送的Accept,请求资源不可访问。
- 407,类似401,用户必须首先在代理服务器上取得授权。
- 408,客户端没有在用户指定的时间内完成请求。
- 409,对当前资源状态,请求不能完成。
- 410,服务器上不再有此资源。
- 411,服务器拒绝用户定义的Content-Length属性请求。
- 412,一个或多个请求头字段在当前请求中错误。
- 413,请求的资源大于服务器允许的大小。
- 414,请求的资源URL长于服务器允许的长度。
- 415,请求资源不支持请求项目格式。
- 416,请求中包含Range请求头字段,在当前请求资源范围内没有range指示值。
- 417,服务器不满足请求Expect头字段指定的期望值。
2.5 5XX(服务器错误类)
该类型状态码表示服务器或网关错误。
- 500,服务器错误。
- 501,服务器不支持请求的功能。
- 502,网关错误。
- 503,无法获得服务。
- 504,网关超时。
- 505,不支持的http版本。
3、响应头
是对响应的一种限定,包含很多属性。常用的属性有:
- Location,实现请求重定向。
- Server,服务器的基本信息。
- Content-Encoding,服务器发送数据时使用的压缩格式。
- Content-Language,发送的数据所用的语言。
- Content-Type,所发送的数据的类型。
- Content-Length,发送数据的大小。
- Set-Cookie,把cookie发送到客户端。
- Last-Modified,指示资源的最后修改日期和时间。