HTTP协议简介

HTTP协议采用了非常简单的请求-响应模式。由浏览器向网站发出请求(称为http request),网站根据请求将相关的资源返回给浏览器(称为http response)。这样周而复始就形成了网络通信。

HTTP协议是无状态的,也就是说同一个客户端的这次请求和上次请求是独立的,对http服务器来说,它并不知道这两个请求来自同一个客户端。为了解决这个问题,在HTTP中通过Session和Cookie机制来维护状态。

HTTP 请求(http request)

消息的结构

HTTP消息可分为三部分,第一部分叫request line(请求行), 第二部分叫http header, 第三部分是body。下面通过一个例子解释

1
2
3
4
5
6
7
8
9
10
# 第一部分:request line
GET http://www.google.com/ HTTP/1.1
# 第二部分:http header
Host: www.google.com
Proxy-Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
...
# 第三部分:body(由于请求方法为get,所以body为空)

从上面的例子可以看到: request line 可分为三部分,分别是请求方法 请求资源 使用的协议,上面的例子中,请求的方法是GET,请求的资源是http://www.google.com/,使用的HTTP协议是1.1版本的,也有1.0版本的HTTP协议,主要区别在于1.1版本允许多个HTTP请求复用一个TCP连接,以加快传输速度

http header 是格式为key:value的一系列kv对,这些kv对主要作用是告知服务器关于浏览器的一些基本信息,如请求的host、使用的终端类型、页面缓存情况等。具体作用要根据具体的kv对分析

body 是发送给服务器的query信息 当使用的是"GET" 方法的时候,body是为空的(GET只能读取服务器上的信息,post能写入)

上面提到的三部分通过换行符\r\n,其中request line永远都是占第一行,接下来每个header一行一个,换行符是\r\n,当遇到连续两个\r\n时,Header部分结束,后面的数据全部是Body

请求的方法

上面提到的request line的最后一个部分为请求的方法,在HTTP中请求的方法最基本的有4种,分别是GET,POST,PUT,DELETE一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE 就对应着对这个资源的查,改,增,删4个操作。

我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息. GET方法和POST方法的区别如下:

  • GET 提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST 方法是把提交的数据放在HTTP包的Body中。

  • GET 提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

  • GET 方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

HTTP 响应(http response)

消息的结构

HTTP也分为三部分,第一部分叫response line, 第二部分叫response header,第三部分是body。下面是对应着上面的请求的一个响应

1
2
3
4
5
6
7
8
9
10
11
12
13
# 第一部分:response line
HTTP/1.1 302 Found
# 第二部分:response header
Location: http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/%3Fgws_rd%3Dcr&ust=1465567219496491&usg=AFQjCNGmfj-b-0AJ0D2coSy_40k76XajIw
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Date: Fri, 10 Jun 2016 13:59:49 GMT
Server: gws
Content-Length: 390
Proxy-Connection: keep-alive

# 第三部分:body
....

从上面的例子可以看到: response line可以分为两部分,分别是使用的HTTP协议,状态码及其含义。在上面的例子中使用的协议版本为1.1,状态码为302,表示重定向,也就是会向response中的location表示的url发出新的请求。

response header也是格式为key:value的一系列kv对,表示服务器的状态和返回的内容的一些信息:如Content-Type表明返回的内容的类型,该类型也决定了body的内容,如果是网页,Body就是文本,如果是图片,Body就是图片的二进制数据;Content-Length表明返回的内容的类型;Content-Encoding表示,Body数据是被压缩的,最常见的压缩方式是gzip,如content-Encoding: gzip,压缩的目的在于减少Body的大小,加快网络传输。

body 则是返回给浏览器的实际内容,由content决定其类型。如上面的例子中返回的类型是text\html,则body的内容是该网页的html代码。如果该html代码中还有其他的资源如图片等,浏览器会发送一个新的http请求来获取这个资源。

状态码

response line中的状态码表示对浏览器的请求的回应状况,状态码由三位数字组成,第一个数字定义了响应的类别其中

  • 1XX 提示信息 - 表示请求已被成功接收,继续处理
  • 2XX 成功 - 表示请求已被成功接收,理解,接受
  • 3XX 重定向 - 要完成请求必须进行更进一步的处理
  • 4XX 客户端错误 - 请求有语法错误或请求无法实现
  • 5XX 服务器端错误 - 服务器未能实现合法的请求

一些常见的状态码及其含义如下所示:

  • 200 OK 请求被成功地完成,所请求的资源发送回客户端
  • 302 Found 重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request
  • 304 Not Modified 文档已经被缓存,直接从缓存调用
  • 400 Bad Request 客户端请求与语法错误,不能被服务器所理解
  • 403 Forbidden 服务器收到请求,但是拒绝提供服务
  • 404 Not Found 请求资源不存在
  • 500 Internal Server Error 服务器发生了不可预期的错误
  • 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

更多状态码详细解释见http://tool.oschina.net/commons?type=5