现在所有市面上的APP都是有网络请求的 , 只要涉及到网络请求也就是会涉及到http协议 , 对于网络协议我们有必要在这里深入的研究一下HTTP协议.
基本概念
- 协议
指计算机通信网络中两台计算机进行通信必须遵守的规定和规则
- HTTP协议
是一种超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。它允许讲超文本标记语言从服务器传输到客户端的浏览器。
HTTP协议
URL和URI的区别
1) URI
URI是一种统一资源标识符 , 用来唯一的标识资源。
例1.1 : file:// a:8080/a/b/c/d.txt
URI的三个组成部分,对应于于以上例子中路径的如下:
- 访问资源的命名机制 file://
- 存放资源的主机名 a:8080
- 资源自身的名称,由路径标识,着重强调于资源 a/b/c/d.txt
2)URL
URL是统一资源定位符,是一种具体的URI,意思就是可以用来表示一个资源,并且还指明了 locate 这个资源。
例 1.2 : http://www.yangzheandroid.com:8086/a/b.php
URL的三个组成部分,对应着 1.2 例子中的各个部分如下:
- 协议 http:// 或者https://
- 存有该资源的具体IP地址 www.yangzheandroid.com:8086
- 主机资源的具体地址 a/b.php
总结一下俩者的相同点,URL相当于URI的一个子集,两者都由三部分组成,但是URL更具体,URI强调的是资源,URL强调的是路径。
Http协议的特点
- 简单快速
1)客户向服务器请求服务时,只需传送请求方法和路径。
2)请求方法常用的有GET、HEAD、POST
3)每种方法规定了客户与服务器联系的类型不同。
4)HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 无连接
1)无连接的含义是限制每次连接只处理一个请求。
2)服务器处理完客户的请求,并收到客户的应答后,即断开连接。
3)采用这种方式可以节省传输时间。
- 无状态
1)无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
- 灵活
1)HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
Http协议易混淆的点
Http协议中有许多知识我们这里总结一下需要注意的地方。
Request和Response的区别
首先我们在谷歌浏览器中打开一个爱奇艺的网址 http://www.yangzheandroid.com ,然后按 F12 打开开发者工具我们从他的NetWork中得到以下信息。
Rquest Headers
// 可以接收的类型,一般都是 */*
Accept:text/css,*/*;q=0.1
//编码、压缩机制
Accept-Encoding:gzip, deflate, sdch
//接受的语言
Accept-Language:zh-CN,zh;q=0.8
//缓存机制
Cache-Control:max-age=0
//保持连接
Connection:keep-alive
//主机名
Host:112.74.188.201
//是否修改的凭证
If-Modified-Since:Wed, 29 Mar 2017 17:27:05 GMT
//和ETag配合
If-None-Match:"34a-54be1e299f4f2"
//从哪个网页跳转过来
Referer:http://www.yangzheandroid.com/
//客户端浏览器的配置
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0
Response Headers
Connection:Keep-Alive
Date:Thu, 06 Jul 2017 07:34:53 GMT
ETag:"34a-54be1e299f4f2"
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.6 (CentOS) PHP/5.4.16
我们重点解析 If-Modified-Since 和 If-None-Match/ETag 这两个都是可以决定是否返回304,从而客户端从缓存中取数据。
1) If-Modified-Since
If-Modified-Since和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,可以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
2) If-None-Match/ETag
ETags 和 If-None-Match 的工作原理是在 HTTP Response中 添加 ETags 信息。当客户端再次请求该资源时,将在 HTTP Request 中加入 If-None-Match 信息(ETags的值)。如果服务器验证资源的 ETags 没有改变(该资源没有改变),将返回一个 304 状态;否则,服务器将返回 200 状态,并返回该资源和新的ETags。
ETag如何帮助提升性能?
聪明的服务器开发者会把 ETags 和 GET 请求的“If-None-Match”头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。其过程如下:
客户端请求一个页面(A)。
服务器返回页面A,并在给A加上一个ETag。
客户端展现该页面,并将页面连同ETag一起缓存。
客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。
服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。
3) If-Modified-Since 和 If-None-Match/ETag 的区别
If-None-Match,它和ETags(HTTP协议规格说明定义ETag为“被请求变量的实体值”,或者是一个可以与Web资源关联的记号)常用来判断当前请求资源是否改变。类似于 Last-Modified 和 If-Modified-Since。但是有所不同的是 Last-Modified 和 If-Modified-Since 只判断资源的最后修改时间,而 ETags 和 If-None-Match 可以是资源任何的任何属性,比如资源的 MD5 值等。
http1.0和http1.1的比较
1)http1.0 协议的产生背景、
超文本传输协议伴随着计算机网络和浏览器诞生,http1.0页随之而来,处于计算机的应用层。
2)现阶段http1.1、https 针对 http1.0所做的优化
带宽:现阶段我们网络发达,带宽问题已经解决
延迟: 1. 浏览器阻塞:浏览器对统一个域名,同时只能由四个连接
延迟: 2. DNS查询:浏览器需要知道目标服务器的IP才能进行连接
延迟:3. TCP/IP 的三次握手(如果对三次握手和四次挥手不熟悉可以参考 HTTP协议 & TCP协议 & 三次握手 & 四次挥手)
3)http1.0 和 http1.1 的区别
缓存的处理:http1.0 用的是If-Modified-Since,http1.1 用的是 If-None-Match/ETag,前者只能比较时间,后者可以比较多属性。
带宽优化和网络和网络连接的使用:http1.0 在如果每次请求都会全量返回,http1.1 可以通过 range 属性来部分返回
Host头的处理:可以对应多个ip地址,因为现如今服务器都有虚拟机的存在,这方面http1.1 做出了优化。
长连接: http1.1 可以可以保持连接,不是每次连接后就会中断掉,避免下次还需要重新连接
4) http1.0 和 http1.1 仍然存在的问题
- http1.x 每次传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间
- http1.x 在传输数据的时,所有传输的内容都是明文,客户端和服务器都无法验证对方的身份,从而存在安全性上的问题
- http1.x 在使用的时候,header中携带的内容过大,在一定程度上增加了传输的成本。
- http1.x 支持keep-alive 属性,弥补多次连接带来的延迟,连接不会连接后就中断掉,这也导致服务器的压力变大
Get和Post的区别
提交的数据的区别: Get是一般是获得数据,Post一般是用来提交数据
提交数据的大小有限制: Get的参数一般都是在 URL 中拼接,Post是放到 Header 中,Get URL的长度是有限制的,不同的浏览器对于 URL 的长度也是不一致的,我们只需要知道 Get 请求 有限制即可。
服务器取到请求的参数有区别,可以类比上一条,两者提交参数的位置不同,获得参数的方法也是不同。
安全问题: 如果是登录操作,如果把密码和账号都放到 URL 中,这会导致安全问题。
Cookie和Session的比较
- 存储位置不同: Cookie 存储在客户端,Session 存储在 服务器中。
- 存取方式不同:Cookie 是将服务器传送过来的字符串保存到本地,然后请求的时候带上。而Session 是将服务器生成的 Session ID 传送到服务器。
- 安全性不同: 放到服务器比较安全,放到客户端就容易被恶意篡改
- 有效期不同:Cookie 一般是设置过期时间来决定有效期,而 Session 是根据 Session ID 来确定,如果关掉浏览器,Session ID 就会消失。
- 对服务器造成的压力不同: 因为Session 实在服务器生成的,如果高并发的时候会生成很多Session,从而对服务器造成压力
参考: