HTTP协议

1.0 概述

HTTP协议的主要特点可概括如下:

  1. 支持客户/服务器模式。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

2.0 版本

HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本是HTTP/2.0。

HTTP/0.9 --> HTTP/1.0 --> HTTP/1.1 --> HTTP/2.0

3.0 常用的HTTP/1.1

3.1 HTTP报文结构

请求报文响应报文,两者都由三部分组成,分别为(1)开始行;(2)首部行;(3)实体主体。请求报文和响应报文的区别就是开始行不同,请求报文的开始行叫请求行,响应报文的开始行叫状态行

3.2 HTTP请求

以下就是一个HTTP请求的报文

GET / HTTP/1.1  {开始行}
Host: www.baidu.com   {以下首部行}
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=076785A54EE26AC59C5E1829E85D0C3A:FG=0; ...省略%¥&&
  • 第一部分为开始行,三个内容:请求方法 请求资源的URL HTTP版本,三个内容这以空格间隔。结束要回车换行"CRLF"。例子中请求方法是GET方法,URL用了相对URL,因为首部行给出了主机的域名,HTTP版本是1.1。

请求方法汇总:

方法 意义
GET 向服务器发出指定资源的请求
POST 提交
PUT 更新
DELETE 删除
HEAD 向服务器发出指定资源的请求,服务器不传回资源的本文部分
TRACE 用来进行环回测试的请求报文
OPTION 请求一些选项信息
CONNECT 用于代理服务器
  • 第二部分为部首行

有好几行,也可以不使用。每行结束都要回车换行。比如:

Host: www.baidu.com  {给出主机的域名}
Connection: keep-alive  {告诉服务器持久连接,TCP连接不关闭,可以被多个请求复用}
Pragma: no-cache  {用来包含实现特定的指令}
Cache-Control: no-cache   {指定请求和响应遵循的缓存机制:必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。}
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3)  {发出请求的用户信息}
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8  {声明客户端接受的数据格式}
Accept-Encoding: gzip, deflate, sdch, br  {声明浏览器接受的压缩方法}
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6  {声明浏览器接受的文档语言}
Cookie: BAIDUID=076785A54EE26AC59C5E1829E85D0C3A:FG=0; ...省略%¥&& {HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器}
{请求报文的最后还有一个空行}
  • 第三部分为实体主体

请求报文一般不用这个字段。

3.3 HTTP响应

HTTP/1.1 200 OK  {开始行}
Server: bfe/1.0.8.18  {以下首部行}
Date: Thu, 27 Apr 2017 08:44:19 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: private
Cxy_all: baidu+c6a5ef49afa731f08bd67d11b5dadae9
Expires: Thu, 27 Apr 2017 08:43:46 GMT
X-Powered-By: HPHP
X-UA-Compatible: IE=Edge,chrome=1
Strict-Transport-Security: max-age=172800
BDPAGETYPE: 1
BDQID: 0x85b139100007637d
BDUSERID: 0
Set-Cookie: BDSVRTM=0; path=/
Content-Encoding: gzip
  • 第一部分为开始行,三个内容:版本 状态码 短语,三个内容这以空格间隔。如HTTP/1.1 200 OKHTTP/1.1 400 Bad RequestHTTP/1.1 404 Not Found

所有的状态码如下:

状态码 意义
1XX 指示信息,请求已经接收了,继续处理
2XX 成功,处理掉
3XX 重定向 进一步操作
4XX 客户端错误
5XX 服务器端错误

常见状态码

状态码 意义
200 OK
400 客户端请求语法错误,服务器端不能理解
401 请求没有经过授权
403 服务器端接到请求,拒绝服务,可能没有权限
404 请求资源不存在
500 服务器端发生不可预期的错误
503 服务器端当前不能处理请求,可能要过段时间才能恢复正常
  • 第二部分是首部行
Server: bfe/1.0.8.18  {web服务器软件名称}  
Date: Thu, 27 Apr 2017 08:44:19 GMT  {原始服务器消息发出的时间}
Content-Type: text/html; charset=utf-8  {返回数据的格式}
Transfer-Encoding: chunked  {表明回应将由数量未定的数据块组成}
Connection: keep-alive  {连接:持久连接}
Vary: Accept-Encoding  {告诉下游代理是使用缓存响应还是从原始服务器请求}
Cache-Control: private  {告诉所有的缓存机制是否可以缓存及哪种类型:内容只缓存到私有缓存中}
Cxy_all: baidu+c6a5ef49afa731f08bd67d11b5dadae9
Expires: Thu, 27 Apr 2017 08:43:46 GMT  {响应过期的日期和时间}
X-Powered-By: HPHP
X-UA-Compatible: IE=Edge,chrome=1
Strict-Transport-Security: max-age=172800
BDPAGETYPE: 1
BDQID: 0x85b139100007637d
BDUSERID: 0
Set-Cookie: BDSVRTM=0; path=/ {设置Http Cookie}
Content-Encoding: gzip  {数据的压缩方法}
  • 第三部分为实体主体,也就是请求网页的HTML部分。

几个链接,自己有空再深入了解下

vary

cookie&session

(完)

Comments
Write a Comment