Android--HTTP相关知识整理

235 阅读13分钟

一、HTTP是如何定义的?

1、超文本传输协议

超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。

2、HTTP在网络中和分层

最开始的网络分层是分了有七层,如下;

OSI模型:

image.png

后来由于最上面三层(应用层、表示层和会话层)在TCP/IP组中是一个应用层,就合并到应用层了;

TCP/IP组模型:

image.png

HTTP在网络分层中是属于应用层的协议

二、HTTP是怎样工作的?

http的工作方式通常是由客户端和服务端协同完成的;

通常,由客户端发起一个请求,创建一个到服务器指定端口(默认是80)的TCP链接,服务器则在这个端口监听客户端的请求,当接收到请求后,会根据客户端的请求,返回对应的内容,比如html文本,图片之类的,并且返回对应的状态码来告诉客户端请求的状态是否成功

三、报文是什么?

1、HTTP的报文是什么

HTTP报文是在HTTP应用程序之间发送的数据块。

将http比喻成快递,那么http报文就是包裹的快递单,包含来姓名,地址,邮政编码,表示我这个快递要寄到哪里去,而快递中心收到这个快递后,就会通过这个快递单,来判断这个包裹要寄送到哪里去,而这个信息就是通过快递单来获取的;

那么同样http报文也是类似的道理,客户端发送一个请求,带上报文,服务端接收到请求后,解析这个报文,就知道客户端需要获取什么东西来;

而服务端想客户端返回内容时,也会带上报文,表示我返回的内容是什么,方便客户端通过报文来解析数据,并处理的流程;

2、HTTP报文的格式

HTTP报文分为请求报文和响应报文;

  • 请求报文:客户端向服务器发送的报文;
  • 响应报文:服务端向客户端发送的报文;

请求报文的格式:由请求行,请求头,空行,请求数据这四部分组成

image.png

举例:请求百度的地址,打开浏览器的调试功能,查看请求报文;

image.png

响应报文的格式:由状态行,请求头,空行,请求数据这四部分组成

image.png 举例:同样通过浏览器查看百度页面的响应报文;

image.png

四、URL是什么?

1、URL是如何定义的?

URL,全称:Uniform Resource Locator 译名:统一资源定位符,用于准确描述Internet上某一资源的地址;

我们访问的网页都是有地址的,而地址通常指向某个服务器上的资源;

2、URL的格式是怎样的?

URL的格式是由协议类型(http,https等),服务器地址(host),端口号(port),路径(path)这几部分组成的;

比如百度的地址:www.baidu.com/;

格式如下:http://host[:port][/path]

  • 协议类型:表示使用哪种网络协议来进行网络请求,比如HTTP,HTTPS;
  • 服务器地址:表示主机,或者域名,或者IP地址;
  • 端口号:如果没有指定的话,默认为80;
  • 路径:表示指定请求资源的URL,默认会带上“/”,一般都是浏览器给我们加上的;

五、RequestMethod请求方法有哪些?

1、请求方法

HTTP请求的方法有很多,如下:

  • GET:使用GET的请求用于从服务器获取数据;

  • HEAD:和GET请求相似,但是没有响应体;

  • POST:用于将内容提交到服务器,通常用于修改或者删除服务器上的资源;

  • PUT:通常用于修改服务器上的数据;

  • DELETE:删除服务器指定的资源;

  • CONNECT:建立一个到由目标资源标识的服务器的隧道,用于代理服务器;

  • OPTIONS:用于描述目标资源的通信选项,通常用于跨域请求;

  • TRACE:沿着到目标资源的路径执行一个消息环回测试,用于追踪请求;

2、GET和POST请求的区别

来看看w3school列举的差异点:

image.png

①安全性:

GET的请求在浏览器上是可以看到请求的参数的,基本上来说没有安全性可言;

而POST请求在浏览器上看不到请求参数,是不是表示就是安全的呢?并不是,别人可以通过抓包的方式来获取到你的请求参数,所以并不是安全的,要想安全的传输只能通过有加密方式的HTTPS请求

②POST方法是否会产生两个TCP数据包?

答案是:不一定;
这个不是必然会产生两个TCP数据包,而是看浏览器是否做了发送两次TCP数据包的处理,如果有做处理的话就会发送两次TCP数据包;

网上已经有文章验证过了,我这里就不再多说了,经验证的结果为:Chrome和Safari浏览器会发送两次TCP数据包,而Firefox浏览器只发送了一次;

③URL过长会导致什么问题?

HTTP协议没有对长度进行任何限制,服务器必须能够处理其任何资源的URI服务,并且应该能够处理长度不受限制的URI。如果判定URI过长,则应返回414(请求URI太长)状态超出服务器的处理能力;

http协议并没有限制URL的长度,对URL长度做限制的是服务器或者浏览器,如果URL过长服务器或者浏览器会报错;

④GET方法可以带Body吗?

答案是:可以的!
GET方法是通过URL来检索服务器上的信息,并没有说不能带上Body;带上Body的GET方法,可能会导致拒绝请求,有可能是服务器拒绝了,也有可能是浏览器或者框架拒绝请求;

六、State Code状态码

image.png

七、Header头部

1、Header是用来干嘛的?

Header其实是一个键值对,是属于元数据,用于告诉服务器,我要取什么样的数据或者我要做什么样的操作;

比如:Accept: text/plain,表示客户端能接受文本数据的返回;

除了现有的一些标准的请求头,我们还可以自定义请求头,比如:user:"张三",表示我要传 "张三"的Header到服务器,服务器再做相应的处理;

2、Header有哪些?

HTTP头字段按照实际用途可以分为四种类型,分别为通用头,请求头,响应头和实体头这四种;

  • 通用头:是客户端和服务器都可以使用的头部,可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能,如Date头部;
  • 请求头:是请求报文特有的,它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据,如Accept头部;
  • 响应头:便于客户端提供信息,比如,客服端在与哪种类型的服务器进行交互,如Server头部;
  • 实体头:指的是用于应对实体主体部分的头部,比如,可以用实体头部来说明实体主体部分的数据类型,如Content-Type头部;

3、常见的Header的类型有哪些?

如下:
Host: 客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号;

Content-Type: 用于指定请求体的类型,主要有四种;
(1)text/html:用于告诉服务器需要响应的类型为文本数据类型;
(2)x-www-form-urlencoded:表单类型,用于web页面纯文本表单提交数据到服务器,比如注册页面数据的提交;
(3)multitype/form-data:用于web页面带二进制文件的表单提交方式,比如修改用户头像,会上传图片到服务器;
(4)application/json , image/jpeg , application/zip ... :提交单项内容到服务器,比如提交json,提交image,提交zip包到服务器;

Content-Length: 用于指定响应体的长度,表示我这次请求需要返回多少字节的内容,多用于分块传输;

User-Agent: 用于向服务端表明身份信息,表示我是来自手机客户端的请求,还是来自某个浏览器的请求;

Range: 表示想从服务器取哪部分的内容,比如byte:start-end;用于多线程下载或者断点续传;

Accept: 告诉服务器客户端能接受什么类型的数据,比如text/html;

Accept-Charset: 告诉服务器客户端能接受的的字符集,比如utf-8;

Accept-Encoding: 告诉服务器客户端能接受的压缩编码类型,如zip;

Content-Encoding: 服务器告诉客户端自己使用了什么压缩方法,如gzip,deflate等;

八、HTTP为什么需要缓存

1,通过网络获取内容,会受速度影响并且开销很大,需要在客户端和服务器之间建立通讯,然后通过传包的方式来进行通讯,受网络速度影响,有可能会响应比较慢,导致前端的展示体验不好;

2,减少开销,如果每一次请求都从服务器取的话,那么服务器将会面临巨大的压力,有可能会挂掉,导致访问不了;

3,使用缓存还可以减少网络带宽的占用,过多的请求会导致网络阻塞,从而响应速度也变慢;

4,减少无意义的重复请求,比如某个页面的数据,运营一天才会去修改一次,但是我每次进来这个页面都去从服务器请求数据,这样是没有意义的,只会导致资源的浪费;

所以使用缓存可以大大的提升响应速度,降低服务器压力,减少带宽的占用,因此HTTP的缓存是至关重要的;

九、HTTP的缓存机制是什么?

1、通过ETag验证缓存的响应

①ETag是什么?

ETag 本质上是一个header,也被称为验证令牌,是由服务器根据根据文件生成的hash值或者其他的某个值;

②验证令牌旨在解决什么问题?

假如我们本地的数据是有缓存时效的,当我们从本地取数据的时候,发现缓存时效过期了,这时候就会去服务器那边取数据,但是此时从服务器取回来的数据和本地的数据是一样的,没有什么变化,只是本地的缓存时效过期了,这时候从服务器取回来的数据就没有意义了,还浪费了请求所消耗的资源;

那么验证令牌就是为了解决这类问题而诞生的;

③验证令牌是怎么解决这类问题的?

前面说了,验证令牌本质上是一个header,我们去服务器取数据的时候会带上这个header,比如 ETag:"xxxxxx"; 服务器收到这个header之后,就会去做验证,如果验证对比了令牌后发现,没有变化,则返回“304 Not Modified”响应,告诉浏览器缓存重点数据没有发生什么变化,可以继续使用,那么我们接受到响应后,更新本地的缓存时效,进而继续使用缓存;

借用官方的图:

image.png

2、Cache-Control缓存机制

①Cache-Control是用来干嘛的?

Cache-Control是用来定义缓存策略的,比如定义某个资源在什么场景下,缓存多长的时间,本质上是一个header; Cache-Control是在 HTTP/1.1 规范中定义的;

②Cache-Control怎么定义缓存策略?

Cache-Control通过header定义的缓存指令来实现缓存策略,比如Cache-Control:max-age = 180;

③缓存指令有哪些?

请求指令

  • no-cache:会先通过ETag验证令牌和服务器进行通讯,判断服务器的数据是否有修改过,如果有修改过,则使用服务器返回的新的数据,否则的话就取缓存,使用这个指令会和服务器进行一次通讯;

  • no-store:指令为"no-store"的情况下,一律不进行缓存,都是从服务器取数据,一般用于需要安全的场景或者需要实时刷新的场景;

  • max-age:表示当前请求的响应体的有效时间为多长,超过了这个时效则从服务器取数据;

  • public:表示可以被任何中间者(代理服务器,cdn等)或者浏览器缓存数据,通常情况下,public并不是必须的指令,有其他指令(比如max-age)表示了该请求可以被缓存;

  • private:表示不可以被任何中间者(代理服务器,cdn等)缓存数据,但是浏览器可以缓存该指令的数据;

3、Cache-Control在okhttp中的体现

  final CacheControl.Builder builder = new CacheControl.Builder();
            builder.noCache();//不使用缓存,全部走网络
            builder.noStore();//不使用缓存,也不存储缓存
            builder.maxAge(10, TimeUnit.MILLISECONDS);//指示客户机可以接收生存期不大于指定时间的响应。
            CacheControl cache = builder.build();//cacheControl

十、HTTPS

1、HTTPS简介

HTTPS(安全套接字层超文本传输协议)是以安全为目标的HTTP通道。

2、为什么要使用https?

首先了解一下HTTP的缺点:

  1. 通信使用明文传输
  2. 不验证通信方身份
  3. 无法验证报文的完整性

这时为了解决该缺陷需要使用另一种协议:HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL,http+加密+认证+完整性保护=https。  

3、HTTPS和HTTP的主要区别

  • HTTPS协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  • HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的ssl/tls加密传输协议。
  • HTTP和HTTPS使用的是完全不同的连接方式
  • HTTP端口:80,HTTPS端口:443
  • HTTP的连接无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

4、HTTPS的缺点

HTTPS也并不是没有缺点的:

  1. 虽然HTTPS加了一层安全保护,但并不是绝对安全, 掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击
  2. HTTPS协议握手阶段比较费时,增加耗电和加载时间
  3. HTTPS连接缓存逊色于HTTP,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响
  4. CA证书需要钱,功能越强大的证书费用越高(白嫖党直接哭泣)
  5. SSL通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源非常难以支撑该消耗

参考博客:

本篇内容主要来自Android 你不得不学的HTTP相关知识

HTTP和HTTPS是什么 二者区别是什么

--个人学习笔记