HTTP 基本架构
下面我们用一张简单的流程图来展示 HTTP 协议基本架构,以便大家先有个基本的了解
Web Client 可以是浏览器、搜索引擎、机器人等等一切基于HTTP 协议发起 http 请求的工具。Web Server 可以是任何的能解析 HTTP 请求,并返回给Web Client 可识别的响应的服务,常见的有 apache、nginx、IIS 等等 web 服务器浓缩就是精华,看下最简洁的 HTTP 交互图:
HTTP 报文结构
请求报文:HTTP 请求报文由请求行、请求头、空行和请求内容 4 个部分构成。如下图所示:
下面对上图进行简单的分析:请求行:由请求方法字段、URL 字段、协议版本字段三部分构成,它们之间由空格隔开。常用的请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。请求头:请求头由 key/value 对组成,每行为一对,key 和 value 之间通过冒号(:)分割。请求头的作用主要用于通知服务端有关于客户端的请求信息。
典型的请求头有:
- User-Agent:生成请求的浏览器类型
- Accept:客户端可识别的响应内容类型列表;星号* 用于按范围将类型分组。*/*表示可接受全部类型,type/*表示可接受 type 类型的所有子类型。
- Accept-Language: 客户端可接受的自然语言
- Accept-Encoding: 客户端可接受的编码压缩格式
- Accept-Charset: 可接受的字符集
- Host: 请求的主机名,允许多个域名绑定同一 IP 地址
- connection:连接方式(close 或 keeplive)
- Cookie: 存储在客户端的扩展字段
空行:最后一个请求头之后就是空行,用于告诉服务端以下内容不再是请求头的内容了。
请求内容:请求内容主要用于 POST 请求,与 POST 请求方法配套的请求头一般有 Content-Type(标识请求内容的类型)和 Content-Length(标识请求内容的长度)
- 响应报文:HTTP 响应报文由状态行、响应头、空行和响应内容 4 个部分构成。如下图所示:
下面对响应报文格式进行简要的分析说明:状态行:由 HTTP 协议版本、状态码、状态码描述三部分构成,它们之间由空格隔开。状态码:由 3 位数字组成,第一位标识响应的类型,常用的 5 大类状态码如下:
- 1xx:表示服务器已接收了客户端的请求,客户端可以继续发送请求
- 2xx:表示服务器已成功接收到请求并进行处理
- 3xx:表示服务器要求客户端重定向
- 4xx:表示客户端的请求有==非法内容==
- 5xx:标识服务器未能正常处理客户端的请求而出现意外错误
常见状态码说明:
- 200 OK: 表示客户端请求成功
- 400 Bad Request: 表示客户端请求有语法错误,不能被服务器端解析
- 401 Unauthonzed: 表示请求未经授权,该状态码必须与WWW-Authenticate 报文头一起使用
- 404 Not Found:请求的资源不存在,例如输入了错误的 url
- 500 Internal Server Error: 表示服务器发生了不可预期的错误,导致无法完成客户端的请求
- 503 Service Unavailable:表示服务器当前不能处理客户端的请求,在一段时间后服务器可能恢复正常响应头
一般情况下,响应头会包含以下,甚至更多的信息。
- Location:服务器返回给客户端,用于重定向到新的位置
- Server: 包含服务器用来处理请求的软件信息及版本信息Vary:标识不可缓存的请求头列表
- Connection: 连接方式。
对于==请求端==来讲:close 是告诉服务端,断开连接,不用等待后续的求请了。keeplive 则是告诉服务端,在完成本次请求的响应后,保持连接,等待本次连接后的后续请求。对于==响应端==来讲:close 表示连接已经关闭。keeplive 则表示连接保持中,可以继续处理后续请求。Keep-Alive 表示如果请求端保持连接,则该请求头部信息表明期望服务端保持连接多长时间(秒),例如 300 秒,应该这样写 Keep-Alive: 300
空行:最后一个响应头之后就是空行,用于告诉请求端以下内容不再是响应头的内容了。响应内容:服务端返回给请求端的文本信息。
HTTP 报文示例
在这里我们在 Firefox 下用 firebug 随意抓取一个 HTTP 包和上文的报文结构做下一一对应关系图,以便大家了解实际的包和标准报文结构的对应关系。
总结
对于 HTTP 协议的交互过程这里就不再进行说明了,大家可以搜索下相关的资料进行学习,上述的内容请务必熟练掌握、深刻了解。更详细的内容推荐大家学习 RFC 2616(http 协议 1.1 版本,有中文版本)