这篇文章原本是我一年前看《图解HTTP》作的笔记,但记完后放在文件夹的某个角落一直没管。前段时间撸项目练手的时候,在状态码上碰到了问题,所以又拿了出来翻了翻,同时又在原有的基础上作了些修改,补上了HTTPs的一些东西。这篇文章主要是对HTTP相对重要的知识的一些归纳,想要好好学习HTTP仍是须要看《图解HTTP》或者《HTTP权威指南》,才能构建较为完整的知识体系。最后,你没有猜错,我就是传说中的标题党,但但愿这篇文章对你有用,哪怕是一丁点,2333。html
超文本传输协议(HTTP)是用于传输诸如HTML的超媒体文档的应用层协议。它被设计用于Web浏览器和Web服务器之间的通讯,但它也能够用于其余目的。 HTTP遵循经典的客户端-服务端模型,客户端打开一个链接以发出请求,而后等待它收到服务器端响应。 HTTP是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。虽然一般基于TCP / IP层,但能够在任何可靠的传输层上使用.web
咱们常常会接触到URL(统一资源定位符),它就是咱们用于访问web的一个字符串地址.而URI对咱们来说就相对比较陌生了,它的名字叫作统一资源标识符(URI)。咱们来看看它们具体的区别吧:浏览器
(咱们平时所说的相对地址,其实只是相对于另外一个绝对地址而言的)安全
URL的基本格式以下:bash
schema://host[:port#]/path/.../[?query-string][#anchor]
复制代码
格式 | 意义 |
---|---|
scheme | 指定低层使用的协议(例如:http, https, ftp)。 |
host | HTTP服务器的IP地址或者域名。 |
port# | HTTP服务器的默认端口是80,这种状况下端口号能够省略。若是使用了别的端口,必须指明。 |
path | 访问资源的路径。 |
query-string | 发送给http服务器的数据。 |
anchor- | 锚 |
HTTP的报文格式主要分为报文首部和报文主体:服务器
其中的空行用于区分报文首部和报文主体内容,是由一个回车符和一个换行符组成的。cookie
不管是请求报文仍是响应报文都须要有报文首部,而报文主体有些请求报文是没有的。而请求报文的通常格式以下:网络
而响应报文的格式是这样的:session
下面是谷歌浏览器的HTTP报文内容,其中request headers描述了请求报文头部的内容,response headers描述了响应报文头部的内容:并发
其中最多见的属性以下:
接下来就聊一聊这些属性的做用
发送HTTP的方式有不少,但最经常使用的仍是POST和GET。
GET:GET方法能够用来请求访问已经被URL识别的资源。指定的资源通过服务端解析后返回响应的内容。简单来讲,就是请求的资源是文本的话,那么就保持原样返回.
POST:POST方法能够用来传输实体的主体。
这二者的区别主要以下:
POST与GET都用于获取信息,可是GET方式仅仅是查询,并不对服务器上的内容产生任何做用结果;每次GET的内容都是相同的。POST则经常使用于发送必定的内容进行某些修改操做。
因为不一样的浏览器对URL的长度大小有必定的字符限制,所以因为GET方式放在URL的首部中,天然也跟着首先,可是具体的大小要依浏览器而定。POST方式则是把内容放在报文内容中,所以只要报文的内容没有限制,它的大小就没有限制。
上面也说了GET是直接添加到URL后面的,直接就能够在URL中看到内容。而POST是放在报文内部的,用户没法直接看到。
总的来讲,GET用于获取某个内容,POST用于提交某种数据请求,从使用场景来看,通常用户注册的内容是私密的,应该使用POST方式来保持私密,而当须要查询某个内容时,须要快速响应,则使用GET。
状态码一般就是服务器端对客户端说的话,分类以下:
状态码 | 含义 |
---|---|
1** | 服务器收到请求,须要请求者继续执行操做 |
2** | 成功,操做被成功接收并处理 |
3** | 从新定向,须要进一步的操做以完成请求 |
4** | 客户端错误,请求包含语法错误或没法完成请求 |
5** | 服务器错误,服务器在处理请求的过程当中发生了错误 |
常见的状态码:
GET:请求的对应资源会做为响应返回。响应将包含描述或操做的结果。 POST:返回处理对应请求的结果。
表示服务器接收到的请求已经处理完毕,可是服务器不须要返回响应。好比,客户端是浏览器的话,那么浏览器显示的页面不会发生更新。
成功处理了部分GET请求
请求的网页已永久移动到新位置,永久性重定向
网站临时性重定向,暂时不能访问(备案、被查)
该状态码表示因为请求对应的资源存在另外一个URI,并指定必须使用GET方法定向获取请求的资源。和302不一样的是,302是不会改变上次的请求方法
访问不了,并返回和上次同样的话,表示资源未被修改过,仍是和上次访问时同样。
临时重定向,和30二、303相似,不一样的是,不会指定客户端要用什么样的方法请求,
表示客户端中存在语法错误,致使服务器没法理解该请求。客户端须要修改请求的内容后再次发送请求。
即用户没有必要的凭据。该状态码表示当前请求须要用户验证。
服务器已经理解请求,可是拒绝执行它。
服务器找不到请求的网页。
服务器遇到错误,没法完成请求。
因为临时的服务器维护或者过载,服务器当前没法处理请求。这个情况是暂时的.
因为有些报文的内容会过大,为了减小传输时间,HTTP会采起一些压缩的措施,例如上面的报文信息中,Accept-Encoding就定义了内容编码的格式gzip。
总的来讲内容编码的格式有如下几种:
正常发送HTTP时,咱们须要创建TCP的链接,而后再发送报文:
若是每次都要发送HTTP报文都须要经历上面的拿过过程,无疑将会耗费不少时间在创建和断开链接的过程当中,所以HTTP使用了connection属性,用于指定链接的方式,当当设置成keep-alive时,就会创建一条持久化的链接。这样就不须要每次都创建链接在中断链接:
(HTTP1.1中connection默认开启keep-alive)
因为HTTP是一种无状态的协议,这是因为Web服务器要面对不少浏览器的并发访问,为了提升Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息,从而减轻服务器端的负载,同时无状态也减少了HTTP请求的开销。
但当有些场景须要时刻记住用户的信息时,无状态很明显不能知足需求,所以HTTP提供了cookie来解决这个问题,cookie技术经过在请求和相应报文中写入cookie信息来控制客户端的状态。cookie会根据从服务端发送的相应报文内的一个叫作set-cookie的首部字段信息,通知客户端保存cookie。当下次客户端再往服务器发送请求的时候,客户端会自动在请求头加入cookie值后发送出去。在没有cookie状态下的请求:
当存有cookie后的请求:
简单来讲Cookie是一种由服务器端肯定,并保存在客户端浏览器中的内容。这样就与每次都去添加用户的信息,请求会自动添加cookie中对应的内容。
(关于浏览器端的数据存储感兴趣的能够看下这篇文章::聊一聊常见的浏览器端数据存储方案)
在一些场景下,咱们在使用HTTP报文请求一些很大的图片时,加载过程每每会很慢。(好比一些摄影网站)这时候咱们就会发现一些图片是一块一块加载的。这是应为设置了HTTP请求的长度,从而分块的加载资源。在请求报文中使用Range属性,在响应报文中使用Content-Type属性均可以进行指定必定本身的HTTP请求。
(图转自:http://www.cnblogs.com/xing901022/p/4311987.html)
HTTP 支持几种不一样的请求命令,这些命令被称为 HTTP 方法(HTTP method)。每 条 HTTP 请求报文都包含一个方法。这个方法会告诉服务器要执行什么动做(获取 一个 Web 页面、运行一个网关程序、删除一个文件等)。下表是一些常见的HTTP方法:
HTTP方法 | 描述 |
---|---|
GET | 从服务器向客户端发送命名资源 |
PUT | 未来自客户端的数据存储到一个命名的服务器资源中去 |
DELETE | 从服务器中删除命名资源 |
POST | 将客户端数据发送到一个服务器网关应用程序 |
HEAD | 仅发送命名资源响应中的 HTTP 首部 |
(GET和POST已在上面讨论过了,这里就不在讨论了)
PUT方法用于传输文件,就像FTP协议的翁建上传同样,要求在请求报文的主题中包含文件内容,而后保存到请求URI指定的位置。因为PUT方法不带验证机制,任何人均可以任何人均可以上传文件,存在安全性问题,所以通常的web网站不适用该方法。
DELETE方法用来删除文件,是与put相反的方法,DELETE方法按照请求url删除指定的资源。其本质和PUT方法同样不带验证机制,因此建议少用DELETE方法。
HEAD和GET方法同样,只是不返回报文主体部分,一般用于确认url的有效性及资源更新的日期时间等。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单来讲就是是HTTP的安全版本,即在HTTP下加入SSL层,HTTPS的安全基石是SSL,所以加密的详细内容就须要SSL。 它如今已经被普遍应用,好比GitHub,支付宝,掘金等。
这是因为HTTP有这么几个缺点:
正是因为以上这些缺点,HTTPS做出了如下一些改变:
能够说HTTPS相对于HTTP就是套上了黄金甲的圣斗士,变了身的奥特曼,沉睡了的毛利小五郎,不只仅提高了安全,还提高了逼格。但HTTPS也有一些缺陷:
有一些网站须要用户的登陆从而获取用户的我的信息来进行接下来的操做,所以须要随时知道这些消息,可是确定不能每次都让用户输入用户密码,这样会让用户感受很不爽,所以HTTP也自带了认证的功能,认证方式主要以下:
其中BASIC认证是最简单的认证,大体过程以下:
但它有如下缺陷:
正是因为BASIC认证存在弱点,所以从HTTP/1.1起就有了DIGEST认证,DIGEST认证一样使用质询/响应的方式,但不会像BASIC认证那样直接明文发送密码。
SSL客户端认证是借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登陆的客户端。
SSL客户端认证的步骤:
像支付宝,网银之类对安全要求很高的网站,在登陆时,都须要下载一个数字认证,这个数字认证就属于一种SSL客户端的验证。但它的缺点也很明显,须要手动下载,对于如今愈来愈懒的网民们来说会感受很麻烦(包括我)
最后一种认证方式是最多见的,咱们能够经过cookie或session来进行认证。
我前面提到过,HTTP是无状态协议,没法实现状态管理,所以有了cookie。咱们就可使用Cookie来管理Session(会话),以弥补HTTP协议中不存在的状态管理功能。
认证步骤:
参考资料: