一、概念
特性
-
HTTP协议用于客户端和服务端之间的通信
-
通过请求和响应的交互达成通信 : HTTP协议规定,请求从客户端发出,最后服务器端响应请求并返回,也就是说,肯定是从客户端开始建立通信的,服务器端在没有接受到请求之前不会发送响应。
-
HTTP 是不保存状态的协议 : HTTP协议不对请求和响应之间的通信状态进行保存,也就是说该协议对发送过的请求和响应都不做持久化处理。但是在一些购物类网站(或者其他类型网站)需要保存一些登录状态或者其他状态信息。为了实现期望的保持状态的功能,引入了Cookie技术。有了Cookie后再使用HTTP协议通信,就可以管理状态了。
-
HTTP使用请求URI来定位资源
HTTP 方法
HTTP 方法用来告知服务器意图。下面介绍一下在HTTP/1.1中我们可以使用的方法:
GET:获取资源 — 一般用来请求已被URI识别的资源,指定的资源经服务器端解析后返回响应内容。
POST:传输实体主体 — 用来传输实体的主题,此方法设计的主要目的并不是获取响应的主体内容。
PUT:传输文件 — 用来传输文件,要求请求报文的主体内容包含文件内容,然后保存到请求URI指定的位置。(一般不开放使用)
HEAD:获取报文头部 — 服务器端不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等。
DELETE:删除文件 — 和PUT方法相反,要求指定URI删除指定的资源。(一般不开放使用)。
OPTIONS:询问支持的方法 — 用来查询针对请求URI的指定资源支持的方法。
TRACE:追踪路径 — 让服务器将之前的请求通信环回给客户端的方法(不常用,或者基本不会使用,容易引发攻击)
CONNECT:要求用隧道协议连接代理 — 要求代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后通过网络隧道传输。
HTTP持久连接
HTTP的初始版本中,每进行一次HTTP请求都会断开一次TCP连接,当时因为传输的都是容量很小的文本,所以问题不大。但是,随着HTTP的普及,文档中包含大量图片的情况越来越多。也就是说,在访问页面资源的同时也会请求大量的其他资源。这样的话,每次的请求都会造成无谓的TCP连接的建立和断开,增加通信开销。为了解决上述问题,HTTP持久连接(HTTP keep-alive)技术产生了。持久连接的特点是,只要没有任意端提出断开连接,则保持TCP连接。
持久连接的好处:1.减少了TCP连接的重复建立和断开造成的额外开销 2.降低了服务器的负载 3.提高页面显示的速度。
在HTTP/1.1 中,所有的连接默认都是持久连接
持久连接也是的管线化形式进行请求成为可能。管线化形式出现,不需要等待响应就可以直接发送下一个请求,这样能够做到并行发送多个请求,这样也再次加快了页面的显示速度。
使用Cookie进行状态管理
HTTP协议是无状态协议,不会去保存请求和响应的状态。无状态协议的有点是:减少服务器的资源消耗、降低协议的复杂性,所以现在的HTTP才被应用到各种场景里面。
但是确实我们又需要解决无状态造成的问题,于是引入了Cookie技术。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会从服务器端发送的响应报文里内的Set-Cookie的首部字段信息,通知客户端保存Cookie。下次发送请求的时候,客户端会自动在请求报文里面加入Cookie值后发送出去。服务器端发现客户端发送过来的Cookie后,检查是哪个客户端的请求,对比服务器上的记录,得到之前的状态信息
二、报文和状态码
HTTP报文
HTTP通信过程包括从客户端发往服务器端的请求以及服务器端返回客户端的响应。下面我们来了解一下请求和响应的运作流程。
用于HTTP协议交互的信息被称为HTTP报文。请求端的称为请求报文,服务端的称为服务报文。HTTP报文是由多行数据构成的字符串文本。
HTTP报文可以分为报文首部和报文主体两块两者由最初出现的空行来划分。其中报文主体不是一定要有的。
下图是报文的结构示意图:
细化到请求报文和响应报文,结构方面又有一些差别,如下图:
HTTP报文学习后可以了解的相关知识点:可以使用HTTP范围请求来指定下载的实体范围。首部字段为Range。如果服务器不能响应范围请求,则返回状态码200和完整的实体内容;能响应范围请求则返回206响应报文。
HTTP状态码
HTTP状态码负责客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。通过获取状态码,我们可以得知服务器端返回的请求结果。
状态码以3位数字和原因短语组成。其中数字中的第一位指定了响应的类别,后两位无分类。响应类型有以下5种:
下面我们来了解一下比较常用的,具有代表性的14个状态码。
2XX 成功
2xx表明请求被正常处理了。
a) 200 OK
从客户端发来的请求在服务器端被正常处理了。
在响应报文内,随状态码返回的信息会因方法的不同而发生改变。比如使用GET方法,对应请求资源的实体会作为响应返回,但是使用HEAD方法,对应的请求资源实体不会随报文作为响应返回(即在响应报文中只有实体的首部,不返回实体)。
b) 204 No Content
该状态码表示服务器接受的请求被成功处理,但在返回的响应报文中不含实体的主体部分。另外也不允许返回任何实体的主体。
比如,从浏览器发出的请求处理后,返回204响应,那么浏览器的页面不发生更新。一般此状态码在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
c) 206 Partial Content
该状态码表示客户端进行非范围请求,而服务器端成功执行了这部分的GET请求。
响应报文中包含由Content-Range指定范围的实体内容。
3XX 重定向
3XX表明浏览器需要执行某些特定的处理以正确处理请求
a) 301 Moved Permanently
永久重定向。该状态码表示请求的资源已被分配给了新的URI,以后应使用现在资源所指向的URI。
b) 302 Found
临时重定向。该状态码表示请求的资源已被分配新的URI,希望用户(本次)能使用新的URI访问。
c)303 See Other
表示请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。302和303很相似,但是303明确的指出来必须要采用的方法必须为GET。
d) 304 Not Modified
该状态码表示客户端发送附带条件的请求时,服务器允许访问资源,但是却不满足附带条件。 304状态返回的时候,不包含任何响应的主体部分。虽然304被分在这组里面,但是和重定向没有关系。
e) 307 Temporary Redirect
临时重定向,和302有相同的含义。
4XX 客户端错误
4xx 表明客户端是发生错误的原因所在
a) 400 Bad Request
表示请求报文中存在语法错误,需要修改请求的内容后,再次发送请求
b) 401 Unauthorized
表示发送的请求需要有通过HTTP认证的认证信息。若之前进行过一次请求,则表示用户认证失败。返回的401的响应必须有一个适用于被请求资源的WWW-authenticate首部用以质询用户信息。当浏览器初次接受401响应,会弹出认证用的对话窗口。
c) 403 Forbidden
表明请求的资源访问被服务器拒绝了。
d) 404 Not Found
表明服务器上无法找到请求的资源。
5XX 服务器错误
5xx 表明服务器本身发生错误
a) 500 Internal Server Error
表明服务器端在执行的时候发生了错误。也有可能是Web应用存在的bug或者某些临时性的故障。
b) 503 Service Unavailable
表明服务器暂时处于超负载或者正在进行停机维护,现在无法处理请求。
三、HTTP首部
HTTP协议的请求和响应报文中必定包含HTTP首部,下面介绍首部的结构,以及各个字段的用法。
HTTP的请求报文和响应报文在之前的HTTP学习之进阶篇进行了介绍,在这里就不多赘述。
1.1 首部字段
首部字段是构成首部报文的要素之一。在客户端和服务器通信中,用来传递额外的重要信息。
首部字段的四种类型
1). 通用首部字段 — 请求报文和响应报文都会使用的首部
2). 请求首部字段 — 发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容优先级等信息
3). 响应首部字段 — 发送响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
4). 实体首部字段 — 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
四、HTTPS
HTTP的缺点
HTTP有相当优秀的一面,但是它也是有不足之处的。HTTP主要有这些不足,例举如下:
a. 使用明文通信,没有对内容进行加密,内容可能会被窃听 — HTTP不具备加密的功能
b. 不验证通信方的身份,因此可能遭遇伪装 — HTTP协议中不会对通信方身份进行验证
c. 无法证明报文的完整性,所有有可能已被篡改 — 不能判断信息是否准确
HTTP+加密+认证+完整性保护=HTTPS
简单的来说,添加了加密及认证机制的HTTP称为HTTPS。HTTPS不是一种新协议,只是将HTTP通信接口部分用SSL和TLS协议代替而已。通常HTTP直接和TCP通信。当使用SSL的时候,则变为先和SSL通信,然后再由SSL和TCP进行通信。SO,所谓的HTTPS其实就是身披SSL协议这层外壳的HTTP。
SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可以配合SSL协议使用。SSL是世界上应用最广的网络安全技术。
但是为什么不是所有的网站都一直使用HTTPS? 因为加密解密会消耗更多的资源,使得服务器处理的请求减少,因此非敏感信息使用HTTP通信,只有在包含个人信息等敏感数据的时候才利用HTTPS加密通信。除此之外,节约购买证书的开销也是原因之一。