HTTP协议简介:
HTTP协议是一个基于请求与响应模式、无状态、应用层的协议,常基于TCP的连接方式。绝大多数的web项目都是构建在HTTP协议之上的web应用。
HTTP协议的5个主要特点:
1.支持客户/服务器模式。
2.简单快速:当客户向服务器请求服务时,只需要向服务器传递请求方法(GET、HEAD、POST…)和路径即可。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP协议允许传输任意类型的数据对象,由Content-Type指定。
4.无连接:指HTTP协议限定每次连接只能处理一个请求,服务器处理完请求、并收到客户端的应答后,即断开连接。采用这种方式可以节省传输时间。(我也不明白为什么这种无连接的传输方式可以节省传输时间,求指教。)
(注:新的HTTP/1.1协议采用的是持续性连接:它支持一个TCP连接上可以传送多个请求和响应,而且允许客户端不需要等待上一次的请求结果就可以发出下一次请求。但服务器端响应时必须按照接收到的请求的先后顺序依次返回响应结果)
5.无状态:指HTTP协议对于事务的处理没有记忆能力。如果后面的处理需要前面的信息,那么必须重传,这样会导致数据的传输量变大。
HTTP协议的URL(Uniform Resource Locator)
http://host[:port][abs_path]
http:表示要通过HTTP协议来定位网络资源。
host:表示合法的Internet主机或者IP地址(以点分十进制表示,如:127.0.0.1)
port:用于指定一个端口号,拥有被请求资源的服务器主机监听该端口的TCP连接。缺省是80。
abs_path:指定请求资源的URI,如果URL中没有给出abs_path,那么当它作为请求URI时,必须以"/"的形式给出,通常这个工作浏览器会自动帮我们完成。
如:输入www.google.com.hk浏览器会自动补充为:http://www.google.com.hk
HTTP协议的请求:
HTTP请求由三部分组成:请求行,消息报头,请求正文。
1.请求行格式如下:Method Request-URI HTTP-Version CRLF.(以空格分隔)
Method:指请求的方法。(GET、POST…)
Request-URI:统一资源标识符。也就是URL中的abs_path部分。
HTTP-Version:HTTP协议的版本。(现在一般都为HTTP/1.1)
CRLF:表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)
例如:请求www.google.com.hk,那么请求行的内容即为如下所示:
GET / HTTP/1.1
(“GET”为请求方法;“/”为URI,由于URL中没有给出abs_path,浏览器自动帮助补充"/";“HTTP/1.1"为HTTP协议版本)
请求方法(所有方法都为大写)有多种:
GET:请求获取由Request-URI所标识的资源。
POST:在Request-URI所标识的资源后附加新的数据。
HEAD:请求获取由Request-URI所标识的资源的响应消息报送。
PUT:请求服务器存储一个资源,用Request-URI作为其标识。
DELETE:请求服务器删除Request-URI所标识资源。
TRACE:请求服务器回送收到的请求消息。主要用于测试或者诊断。
CONNECT:保留。
OPTIONS:请求查询服务器的性能 ,或者查询与资源相关的选项。
常用的有GET和POST两种方法。
2.消息报头(后述)
3.请求正文(略)
HTTP协议的响应:
HTTP响应也是由三部分组成:状态行,消息报头,响应正文。
1.状态行格式如下:HTTP-Version Status-Code Reason-Phrase CRLF.(以空格分隔)
HTTP-Version:HTTP协议的版本。(现在一般都为HTTP/1.1)
Status-Code:指服务器发回的响应状态代码。
Reason-Phrase:指状态代码的文本描述。
例如:请求www.google.com.hk,那么状态行的内容即为如下所示:
HTTP/1.1 200 OK
"HTTP/1.1"为HTTP协议版本;“200”为响应状态代码。“OK”为响应状态代码的文本描述。
响应状态代码有多种:
1xx:指示信息--表示请已接收,继续处理。
2xx:成功--表示请求已被成功接收,理解,接受。
3xx:重定向--表示要完成请求必须进行进一步操作。
4xx:客户端错误--表示请求有语法错误或者无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
常见的状态代码如下:
200 OK 表示客户端请求成功
400 Bad Request 表示客户端语法有语法错误,不能被服务器所理解
403 Forbidden 表示服务器拒绝提供服务
404 Not Found 表示所请求的资源不存在
500 Internal Server Error 表示服务器发生了不可预期的错误
503 Server Unavailable 表示服务器当前不能处理客户端的请求,一段时间后可能恢复正常
2.消息报头(后述)
3.响应正文就是服务器返回的资源的内容
HTTP协议的消息报头:
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。
HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。
每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。
1.普通报头:在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。(常普通报送:Cache-Control、Date、Connection)
2.请求报头:允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。(常用请求报头:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Host、Uer-Agent)
3.响应报头:允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。(常见响应报头:Location、Server)
4.实体报头:请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。(常见的实体报头:Content-Encoding、Content-Language、Content-Length、Content-Type、Last-Modified、Expires)
如:访问www.google.com.hk的请求报头为:
Host: www.google.com.hk
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: PREF=ID=b38fb978efac77fe:U=ea32f8666ff8e2e0:FF=2:LD=zh-CN:NR=10:NW=1:TM=1383534674:LM=1395650039:C2COFF=1:SG=3:S=ejtjpgRPRAM-P-Iw; NID=67=erlEd3m6GKzsbsLBTWUqFdS2mkhrU-z5RaZs45lW7G0LQhwA-KnpxcMtZMY8ptnS85---5goxc7qg74OhuLUNdnElZS4Jcs59wRIYY1yFToVCbUIfYodpPdgZXvl1wXIw_gphoCnQkvUMxy8gg3W9GoUpQvHPACCHmkf4xS_zBRC5wjdtu76ES_POxq0ZdFvGA
Connection: keep-alive
访问www.google.com.hk的响应报头为:
Date: Mon, 24 Mar 2014 08:34:05 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=b38fb978efac77fe:U=ea32f8666ff8e2e0:FF=2:LD=zh-CN:NR=10:NW=1:TM=1383534674:LM=1395650045:C2COFF=1:SG=3:S=Qcv2BOBez8mHIRaz; expires=Wed, 23-Mar-2016 08:34:05 GMT; path=/; domain=.google.com.hk
Content-Encoding: gzip
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
Alternate-Protocol: 80:quic