HTTP协议概述
URI(Uniform Resource Identifier)
用来标识网络上特定的服务器资源,URI有两种形式,分别为URL和URN:
URL(Uniform Resource Locator)
URL是目前被最广泛使用的一种形式,URL描述了一台特定服务器上某资源的特定位置。这里的资源可以只一个文件,页面,图片等。
标准URL格式定义如下:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
scheme | 使用的协议(例如http(s), ftp, rtsp) | URI.Scheme |
user | 某些协议需要的用户名(例如ftp协议) | URI.UserInfo |
password | 用户名所对应的密码 | URI.UserInfo |
host | 服务器的主机名或者IP地址 | URI.Host |
port | 服务器监听端口号(http默认为80,https默认为443) | URI.Port |
path | 服务器上资源的本地名,也称相对路径 | URI.AbsolutePath |
params | 某些协议的输入参数,如包含多个用;分隔 | URI.AbsolutePath |
query | 某些协议的查询参数,http协议一般用&分隔多个参数 | URI.Query |
frag |
某页面内部特定资源的引用,一般用来指定特定段落。 用于客户端使用,服务器端会忽略这个字段 |
URI.Fargment |
常见协议URL:
http://cnblogs.com/qlluo/default.html#URL
ftp://qlluo:psd@ftp.cnblogs.com/resource/info.txt
协议标准请参考:rfc1738
URN(Uniform Resource Name)
URN与URL的最大区别在于,URN无需指定资源的具体位置,她标识网络上某一特定内容。该协议比较超前,目前几乎没有被使用,这里不做具体介绍。
HTTP报文
上图描述了最常见的HTTP报文流向,由客户端发往服务器端的报文称为请求(request)报文,由服务器会发给客户端的报文称为相应(response)报文。
习惯上定义报文的流向为从上游(upstream)流向下游(downstream),在讲到代理服务器时会使用该术语。
ps: 客户端和服务器端没有绝对严谨的定义,一般称主动发送请求的一方为客户端,监听某一特定端口等待连接的一方为服务器端。
请求(Request)
HTTP请求报文由起始行,首部,实体主体三部分组成:
<method> <request-URL> <version> //起始行 <headers> //首部 <entity-body> //实体主体
起始行
起始行包括方法,请求URL和版本号三部分:
1. 方法:表示客户端希望服务器执行的操作类型,常见的有GET, POST, DELETE等。
2. 请求URL:表示客户端需要请求的资源,一般为绝对URL。
3. 版本号:表示报文使用的HTTP版本,格式为HTTP/<major>.<minor>,当前主流版本为HTTP/1.1
GET http://www.cnblogs.com/ HTTP/1.1
首部
首部包括一些特定的键值对,对请求报文的一些属性做解释。
首部有零行或多行组成,每行之间使用CRLF( )分隔。每行由冒号分隔名字和值,冒号后面可以跟一个可选的空格。
首部是由一个空行结束的。
Content-Type: text/plain
Content-Length: 50
HTTP协议预定义了很多首部,用于实现协议的基础和扩展功能。一般来讲,有效的HTTP请求报文都会包含多个首部。
实体主体
实体主体可以包含一个由任意文本数据块,对于某些特定的方法(GET, HEAD)也可能不包含实体主体。
实体主体的格式由上层协议决定,并受Content-Type, Content-Length, Content-Encoding约束。
下面是一个访问园子首页的请求报文,其中忽略掉了一些不常见的首部。
GET http://www.cnblogs.com/ HTTP/1.1 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8
相应(Response)
HTTP相应报文由起始行,首部,实体主体三部分组成:
<version> <status> <reason-phrase> <headers>
<entity-body>
起始行
起始行包括版本号,状态码和原因短语三部分组成:
1. 版本号:表示报文使用的HTTP版本,格式为HTTP/<major>.<minor>,当前主流版本为HTTP/1.1,与请求报文的版本号格式一致。
2. 状态码:用一个三位数字描述相应报文的状态(成功,出错等),下表简述了状态码的分类,后续会逐个介绍常见的状态码。
状态码范围 | 预定义范围 | 分类 | 解释 |
100-199 | 100-101 | 信息提示 | |
200-299 | 200-206 | 成功 | 最常见的成功状态码是200,表示请求成功 |
300-399 | 300-307 | 重定向 |
一般配合一个Location首部使用,表示资源被永久或暂时移动到了Location指定的URL处。 常见的重定向状态码有301,304,307 |
400-499 | 400-417 | 客户端错误 |
表示客户端向服务器发送的请求有错误。 常见的有400(Bad Request), 401(Unauthorized), 403(Forbidden), 404(Not Found) |
500-599 | 500-505 | 服务器端错误 |
表示服务器端在处理请求的过程中发生错误。 常见的有500(Internal Server Error), 503(Services Unavailable) |
3. 原因短语:描述#2中状态码的一句短语,起解释作用,是状态码的可读版本。
HTTP/1.1 200 OK
首部
格式与HTTP请求报文的首部一致,但包含的首部内容不同
实体主体
格式与HTTP请求报文的实体主体一致,用来承载响应的内容。
常见的响应实体主体包括:页面,js,css,图片,文件,json或xml文本等。
下面是访问园子首页的响应报文,其中省略掉了大部分实体主体内容。
HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Connection: keep-alive Last-Modified: Wed, 25 Jan 2017 05:06:04 GMT Content-Length: 45005 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>博客园 - 开发者的网上家园</title> ... </html>
本文主要介绍了HTTP协议最基本,最常用的协议和报文部分。续集会深入介绍HTTP的首部,状态码,连接机制,代理,缓存以及认证相关的内容。