HTTP是一个应用层协议,由请求和响应构成,是一个标准的客服端服务器模型。HTTP通常承载于TCP协议之上,有时也承载于TLS或SSL之上,这时候,就成了常说的HTTPS。默认HTTP的端口号是80,HTTPS的默认端口是443。HTTP协议的模型就是客户端发出请求,服务器端回送响应,它是一个无状态的协议,同一个客户端的多次请求之间没有对应关系。
HTTP协议的工作:
首先,客户端发出一个请求(Request)给服务器,服务器在接受这个请求后将生成一个响应(Response)返回给客户端。一次HTTP操作称为一个事务,分为四个过程:
1)客户端与服务器建立连接;
2)客户机发出一个请求给服务器,格式为:统一资源标识符(URL)、协议版本号、MIME信息(包括请求修饰符、客户机信息以及可能的内容);
3)服务器收到请求后,给予相应的响应信息,格式为:状态行(信息的协议版本号、一个错误或成功的代码),然后是MIME信息(包括服务器信息、实体信息以及可能的信息);
4)客户端收到服务端返回的响应信息并显示在用户的显示屏上,然后客户端与服务器断开连接。
我们可以通过查看PFC2616文档或者使用抓包软件来看到HTTP协议,常用的抓包软件主要有IRIS、wirkshark等,专门抓取http包的软件主要有HttpWatch、IE Analyer、Fiddler、Chalrles等。在浏览器中使用filefox的拓展filebug查看http请求。
一、请求
发送请求前,需要先建立连接,连接是一个运输层的实际环流,它建立在两个相互通信的应用程序之间。在HTTP协议中,request和response头中都可能出现一个connection的头,它决定客户端与服务器通信时对于长链接该如何进行处理。如果不希望支持长链接,可以在header中指明connection的值为close;服务器端可同样设置,设为close后,指明当前正在使用的tcp连接在处理完毕后会被断开,客户端下一个请求的时候需要重新连接。
HTTP请求由三部分构成:请求行、消息报头以及请求正文
请求行以一个方法符号开头,以空格空开,后面跟着请求的URL和协议的版本,格式如下:
Method Request-URL HTTP-Version CRLF
参数说明:
Method:请求方法
Request-URL:一个统一资源标识符。
HTTP-Version:请求的HTTP协议版本
CRLF:回车和换行
请求方法有多种,各个方法的解释如下:
GET:请求获取equest-URL所标识的资源
POST:在Request-URL标识的资源中附加新的数据
HEAD:请求获取由Request-URL所标识的资源的响应消息报头
PUT:请求服务器存储一个资源,并用Request-URL作为其标识
DELETE:请求服务器删除Request-URL所标识的资源
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT:保留以备将来使用
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求
二、响应
在接受和接受客户端请求后返回响应信息,也是由三部分构成:状态行、消息报头、响应正文。
状态行代码如下:
HTTP-Version Status-Code Reason-Phrase CRLF
参数说明:
HTTP-Version:HTTP协议版本
Status-Code:服务器发回的响应状态代码
Reason-Phrase:状态代码的文本描述
状态代码由三位数字组成,第一个数字表示响应的类型,有五种可能取值:
1XX:指示信息-请求已接受,继续处理
2XX:成功-请求已被成功接收、理解和接受
3XX:重定向-请求有语法错误或请求无法处理
4XX:客户端错误-请求有错误或者请求无法实现
5XX:服务器端错误-服务器未能实现合法的请求
常见状态代码以及文本描述:
200OK:客户端请求成功
400 Bad Request:客户端请求有语法错误,不能被服务器端所理解
401 Unauthorize:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found :请求资源不存在
500 Internal Server Error:服务器发生不可预期的错误
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
三、报头
HTTP消息报头包括:普通报头、请求报头、响应报头、实体报头。每个报头域组成形式如下:
名字+:+空格+值
1)普通报头中有少数报头域用于所有的请求和响应信息,但并不用于被传输的实体,只用于传输的信息(如缓存控制、连接控制等);
2)请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息(UA以及Accept等);
3)响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URL所标识的资源进行下一步访问的信息(Location);
4)实体报文定义了关于实体正文和请求所标识的资源的元信息。
比较重要的报头如下:
Host:头域指定请求资源的Internet主机和端口号,必须表示请求URL的原始服务器或网关的位置。HTTP1.1请求必须包含主机头域,否则会以400状态吗返回。
User-Agent:简称UA,包含发出请求信息的用户信息。通常UA包括浏览者的信息,主要是浏览器的版本和操作系统。这个UA是判别用户所用设备的重要依据。
Accept:告诉服务器可以接受的文件格式
Cookie:Cookie分两种,一种是客户端发出的,报头为Cookie,另一种是服务器发出的,报头为set-cookie。它们的主要区别是,cookie报头可以有多个value值,而且不需要指定domain等;而set-cookie只能有一个cookie的value值,需要指明domain和path等。
Cache-Control:指定请求和响应遵循的缓存机制。
Referer:头域允许客户端指定请求URL的源资源地址。
Content-Length:内容长度
Content-Range:响应的资源范围。可以在每次请求中标记资源请求的范围。在连接断开重连时,客户端只需要请求未下载的资源部分,实现断点续传。迅雷就是基于这个原理
Accept-Encoding:指定可以接受的编码方式
自定义报头:在HTTP1.1正式规范中没有定义的头字段。