Android开发Android开发经验谈

Android 网络基础之 HTTP

2019-05-19  本文已影响4人  kevenZheng

读前思考

学习一门技术或者看一篇文章最好的方式就是带着问题去学习,这样才能在过程中有茅塞顿开、灯火阑珊的感觉,记忆也会更深刻。

  1. 了解哪些响应状态码?
  2. get 和 post 的区别?
  3. HTTP 和 HTTPS 的区别?

概述

HTTP 全称是 HyperText Transfer Protocal ,即:超文本传输协议,从 1990 年开始就在 WWW 上广泛应用,是现今在 WWW 上应用最多的协议,HTTP 是应用层协议,当你上网浏览网页的时候,浏览器和 web 服务器之间就会通过 HTTP 在 Internet 上进行数据的发送和接收。HTTP 是一个基于请求/响应模式的、无状态的协议。即我们通常所说的 Request/Response。

HTTP 请求过程

首先看一张图

image

如果对网络协议还不太熟悉的同学,建议看一下上一篇文章
Android 网络基础之网络协议篇

HTTP 报文

请求报文

请求行   <method> <request-url> <version>
请求头   <headers>
请求体   <entity-body>

响应报文

响应状态行 <version> <status> <reason-phrase>
响应头     <headers>
响应体     <entity-body>

解释一下各个标签:

<method> 指请求方法,常用的主要是 Get、 Post、Head 还有其他一些我们这里就不说了,有兴趣的可以自己查阅一下

<version> 指协议版本,现在通常都是Http/1.1了

<request-url> 请求地址

<status> 指响应状态码, 我们熟悉的200、404等等

<reason-phrase> 原因短语,200 OK 、404 Not Found 这种后面的描述就是原因短语,通常不必太关注。

请求方法(method)

列举几个比较常用的

方法名 功能
GET 向指定的资源发出“显示”请求,使用 GET 方法应该只用在读取数据上,而不应该用于产生“副作用”的操作中
POST 指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或者修改现有资源,或两者皆有。
PUT 向指定资源位置上传其最新内容
DELETE 请求服务器删除 Request-URI 所标识的资源
Post 和 Get 的区别

常见状态码

2XX 成功
3XX 重定向
4XX 客户端错误
5XX 服务器错误

请求和响应常见通用的 Header

指请求报文和响应报文都可以使用的字段

  1. no-cache 指客户端不缓存过期资源
  2. no-store 指不进行缓存
  3. max-age 指缓存资源的缓存时间比指定的值小,那么客户端就接受缓存资源,且缓存服务器不对资源有效性进行再次确认
  1. 指控制不再转发给代理的首部字段(Hop-by-hop),管理持久连接
  2. close 指服务器像明确断开连接
  3. Keep-Alive 指保存持久连接,HTTP/1.1前默认连接是非持久性的,如需要保存持久连接,需要增加此字段

常见的请求 Header

HTTPS

Http 与 Https 的区别

Http + 加密 + 认证 + 完整性保护 = Https

传统的 Http 协议是一种应用层的传输协议,Http 直接与 TCP 协议通信。其本身存在一些缺点:

Http 协议使用明文传输,容易遭到窃听。

Http 对于通信双方都没有进行身份验证,通信的双方无法确认对方是否是伪装的客户端或者服务端。

Http 对于传输内容的完整性没有确认的办法,往往容易在传输过程中被劫持篡改。

因此,在一些需要保证安全性的场景下,比如涉及到银行账户的请求时,Http 无法抵御这些攻击。

Https 则可以通过增加的 SSL\TLS,支持对于通信内容的加密,以及对通信双方的身份进行验证。

Https 的加密

近代密码学中加密的方式主要有两类:

对称秘钥加密是指加密与解密过程使用同一把秘钥。这种方式的优点是处理速度快,但是如何安全的从一方将秘钥传递到通信的另一方是一个问题。

非对称秘钥加密是指加密与解密使用两把不同的秘钥。这两把秘钥,一把叫公开秘钥,可以随意对外公开。一把叫私有秘钥,只用于本身持有。得到公开秘钥的客户端可以使用公开秘钥对传输内容进行加密,而只有私有秘钥持有者本身可以对公开秘钥加密的内容进行解密。这种方式克服了秘钥交换的问题,但是相对于对称秘钥加密的方式,处理速度较慢。

SSL\TLS 的加密方式则是结合了两种加密方式的优点。首先采用非对称秘钥加密,将一个对称秘钥使用公开秘钥加密后传输到对方。对方使用私有秘钥解密,得到传输的对称秘钥。之后双方再使用对称秘钥进行通信。这样即解决了对称秘钥加密的秘钥传输问题,又利用了对称秘钥的高效率来进行通信内容的加密与解密。

Https的认证

SSL\TLS 采用的混合加密的方式还是存在一个问题,即怎么样确保用于加密的公开秘钥确实是所期望的服务器所分发的呢?也许在收到公开秘钥时,这个公开秘钥已经被别人篡改了。因此,我们还需要对这个秘钥进行认证的能力,以确保我们通信的对方是我们所期望的对象。

目前的做法是使用由数字证书认证机构颁发的公开秘钥证书。服务器的运营人员可以向认证机构提出公开秘钥申请。认证机构在审核之后,会将公开秘钥与共钥证书绑定。服务器就可以将这个共钥证书下发给客户端,客户端在收到证书后,使用认证机构的公开秘钥进行验证。一旦验证成功,即可知道这个秘钥是可以信任的秘钥。

上一篇 下一篇

猜你喜欢

热点阅读