HTTP协议学习随笔
简介
HTTP(Hyper Text Transfer Protocol),超文本传输协议,是一种建立在TCP上的无状态连接。一次完整的传输过程的基本流程如下:
- 客户端向服务端发送一个HTTP请求,说明客户端想访问的资源及操作
- 服务端接受到请求,根据请求进行相应的操作
- 服务端向客户端发送一个HTTP响应,把响应结果返回给客户端
一个请求的开始到一个响应的结束称为一个事务,。当一个事务结束后,服务端需要添加一条相应的日志记录。
HTTP请求
HTTP请求是客户端向服务端发送的报文 ,告知服务站自己的需求。
HTTP请求的报文分为三部分:
状态行 |
包含3部分:请求方式(Method)、资源路径(URL)、协议版本(Version) |
请求头 |
包含关于请求的细节信息 |
请求正文 |
对请求操作的进一步补充,通常为空 |
举个例子,使用Charles抓包工具抓包的结果:
HTTP请求报文的格式入下图:
每个部分使用\r\n分隔,其中状态行的三个部分使用空格分隔。请求正文请求头间,又一组\r\n分隔。
状态行的Method部分,在HTTP 1.0定义了三种方式:GET、POST、HEAD。在HTTP 1.1又新增了五种方式:OPTIONS、PUT、DELETE、TRACE、CONNECT。最常用的为GET和POST。详细可以参考《HTTP请求方法对照表》。
状态行的URL部分,只保存分级路径部分,不保存服务器名。
状态行的Version部分,保存HTTP协议版本,目前主流是HTTP/1.1。
请求头部分,有多组头域组成,每个头域由一个域名,冒号(:)和域值三部分组成。下文《HTTP头域》小结会详细描述。
HTTP请求报文的主体部分,通常不使用。
HTTP响应
服务端接受客户端的HTTP请求后,服务端会根据请求完成具体操作,之后将结果通过HTTP响应,返回给客户端。
HTTP响应的报文分也为三部分:
状态行 |
包含3部分:版本(Version)、状态码(Status-Code)、短语(Phrase) |
响应头 |
包含关于响应结果的细节信息 |
响应正文 |
请求的结果 |
举个例子,使用Charles抓包工具抓包的结果:
HTTP响应的报文格式如下:
结构与HTTP请求的报文格式基本相同。
状态行的Version部分,保存HTTP协议版本。
状态行的Status-code部分,为一个3位数的整数,表示对请求的处理状态,常见的状态码有:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
状态码的第一个数字,定义的状态码的类型,状态码共分为5类:
1xx |
表示HTTP请求已经接受,继续处理请求 |
2xx |
表示HTTP请求已经处理完成 |
3xx |
表示把请求访问的URL重定向到其他目录 |
4xx |
表示客户端出现错误 |
5xx |
表示服务端出现错误 |
状态行的Phrase部分,是对状态码的简单描述。
对状态码的详细描述,可以参考《HTTP状态码对照表》。
响应头部分与请求头部分相同,同样有头域组成,是对响应结果的描述。通常会包含Content-Type头域,描述返回内容的MIME类型。HTTP协议支持的MIME类型可以参考《HTTP Content-type 对照表》
响应正文就服务端向客户端返回的内容,可以是文本、图片、音频等各种类型的二进制数据,类型由响应头的Content-Type头域描述。
HTTP头域
HTTP请求头(响应头)提供了关于请求,响应或者其他的发送实体的信息。HTTP的头信息包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。
- 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
- 请求头标:允许客户端传递关于自身的信息和希望的响应形式。
- 响应头标:服务器和于传递自身信息的响应。
- 实体头标:定义被传送资源的信息。即可用于请求,也可用于响应。
常用的有:
- Accept,指定客户端能够接受的内容格式
- User-Agent,用户代理,向服务器说明自己的操作系统、浏览器等信息
- Connection,是否开启持久连接
- Host,服务器域名
- Content-Type,返回内容的MIME类型
其他跟多的请求头头域,可以参考《HTTP Request Header》、《HTTP头信息总结》
HTTP版本
HTTP发展至今,经历的多个版本的更替,虽然已经提出了HTTP/2.0版本,但目前主流依然是HTTP/1.1版本。
HTTP/0.9 |
仅支持GET方法,仅能访问HTML格式的资源 |
HTTP/1.0 |
添加了POST和HEAD方法; 可以根据Content-Type,传输多种MIME类型的资源; 支持cache。 |
HTTP/1.1 |
添加了OPTIONS, PUT, DELETE, TRACE 和 CONNECT方法; 加入了持久连接(keepalive),一个TCP连接可以允许多个HTTP请求; 加入了管道机制,一个TCP连接同时允许多个请求同时发送。 |
HTTP/2.0 |
增加双工模式; 使用索引号访问头域信息,并以压缩的方式传输。 |
进阶
想深入学习HTTP协议,可以参考以下两本书籍:
《图解HTTP》
《HTTP权威指南》
参考
http://blog.51cto.com/13570193/2108347