学习HTTP协议
October 01, 2015
HTTP 是什么
HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是用于从服务器传输超文本到本地浏览器的传送协议。 有了这样的 HTTP 协议,这样服务器才可以分析请求,它还可以使浏览器更加高效,使网络传输减少。 它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示等等。
通常,当我们在浏览器中输入一个地址时,浏览器与互联网是这样交互的:
- 浏览器发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
- 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
- 接收服务器所返回的信息浏览器将其显示在显示屏上,然后断开连接。
HTTP协议永远都是客户端发起请求,服务器回送响应。 这样就限制了使用 HTTP 协议,无法实现在浏览器没有发起请求的时候,服务器将消息推送给浏览器。 HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。
确保 HTTP 安全的 HTTPS
HTTP 协议的实现本是非常简单,不论是谁发送过来的请求都会返回响应, 因此不确认通信方,会存在以下各种隐患。
- 无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器。 有可能是已伪装的 Web 服务器。
- 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
- 无法确定正在通信的对方是否具有访问权限。因为某些 Web 服务器上保存着重要的信息, 只想发给特定用户通信的权限。
- 无法判定请求是来自何方、出自谁手。
- 即时是无意义的请求也会照单全收。无法阻止海量请求下的 DoS 攻击(Denial of Service, 拒绝服务器攻击)。
HTTP + 加密 + 认证 + 完整性包含 = HTTPS
HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用 SSL(Secure Socket Layer) 和 TLS(Transport Layer Security)协议代替而已。
通常, HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披 SSL 协议这层外壳的 HTTP。 所以 HTTPS 又叫 HTTP over SSL, HTTP over TLS
为什么不一直使用 HTTPS 既然 HTTPS 那么安全可靠,那为何所有的 Web 网站不一直使用 HTTPS?
其中一个原因是,因为与纯文本通信相比,加密通信会消耗更多的 CPU 及内存资源。如果每次通信都加密,会消耗 相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。 除此之外,想要节约购买证书的开销也是原因之一。
Request 请求
我们常常用到的 GET 请求和 POST请求,
- GET:从特定的源获取信息
当我们在浏览器地址栏里输入一个地址的时候,就是在发起一个 GET 请求。 让浏览器去取这个地址上的资源,超链接的默认行为也是向一个 URL 发送GET请求。 需要注意使用 GET 请求的时候在大小和安全性上有一些限制的。
- POST:发送新的信息去特定的源
当我们给服务器发送数据的时候,就用到 POST ,浏览器里 POST 通常被用来:对现有资源的解释;向电子公告栏、新闻组、邮件列表或类似讨论组发信息;提交数据块;通过附加操作来扩展数据库 。
Response 响应
- HTTP响应的组成:
response line:包含了HTTP状态代码
header:包含了关于服务器和这个响应的信息
body:响应的内容
-
状态码
1xx: 服务器正在执行你的请求
2xx: 服务器响应成功
3xx: 这类状态码代表需要客户端采取进一步的操作才能完成请求,通常需要重定向
4xx: 客户端错误
5xx: 服务端错误
Cookie 和 Session
Cookie 和 Session都为了用来保存状态信息,都是保存客户端状态的机制, 它们都是为了解决HTTP无状态的问题的。
- Session
Session机制是一种服务器端的机制,当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。
- Cookie
cookie 就是在一个请求/响应周期内,服务器发送给客户端(通常就是浏览器),并存储在客户端的一段数据。服务器在响应消息中用Set-Cookie头将Cookie的内容回送给客户端, 客户端在新的请求中将相同的内容携带在Cookie头中发送给服务器。从而实现会话的保持。
Cookie和Session的不同点
- Cookie将状态保存在客户端,Session将状态保存在服务器端;
- Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
- Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;
- 就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。
AJAX
AJAX 是“异步 javascript 和 XML ”的简称,它的主要特点就是允许浏览器发送请求和处理响应的时候不用刷新整个页面。触发一个 AJAX 请求通常会执行回调函数来处理。回调函数是之前定义好的,可能它会更新内容部分,可能它会弹出有用的信息。