一:http
http是建立在TCP协议基础上的应用层面向连接的协议,http协议分为请求行,请求头,请求体。其中请求行包括了请求的方法, 请求的url,请求的协议以及版本,请求头中含有若干个属性,比如:
Accept :Accept”报文头属性告诉服务端 客户端接受什么类型的响应
Cookie : 客户端的Cookie就是通过这个报文头属性传给服务端的,
Cache-Control : 对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的
请求体则就是我们请求服务器需要的数据。
1.2 TCP协议是一种无状态,无连接的传输层面向连接协议,与之对应的是UDP协议,之所以说它是无状态,无连接,是因为它对 上一次处理的事物没有记忆功能,每一次都要重新请求连接,数据传输完后再断开连接。TCP请求连接会经历过3次握手过 程,第一次客户端向服务端发送syn包(seq),告诉服务端端口号,服务端收到后向客户端发送一个syn包,告诉客户端我已 经 收到了,可以发送数据了,客户端收到syn包后向服务端发送一个ACK,这个ACK则是告诉服务端syn包收到,服务器可以 发送数据了,经历过这三次握手后,连接变建立起来了
二:https
https协议是由ssl+http协议构建的可进行数据加密传输和身份认证的网络协议,要比http安全,那么它的安全性是由ssl来完成,利用了对称加密和非对称加密相结合来完成了加密认证过程。服务端向客户端发送证书和非对称加密中的公钥给客户端,客户端利用公钥加密一个在客户端生成的对称加密中密钥,然后把这个用公钥加密过的密钥发送给服务端,服务端用私钥对这个密钥进行解密,拿到客户端的密钥,然后客户端和服务端就可以用这个密钥进行加密数据传输。
/**
* 设置ihttps证书验证
*/
private void setCertificates(Context context) {
try {
//将ca证书导入输入流
InputStream inputStream = context.getResources().openRawResource(R.raw.aaa);
//keystore添加证书内容和密码
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(inputStream, CLIENT_KET_PASSWORD.toCharArray());
//证书工厂类,生成证书
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
//生成证书,添加别名
keyStore.setCertificateEntry("test1", certificateFactory.generateCertificate(inputStream));
//信任管理器工厂
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
//构建一个ssl上下文,加入ca证书格式,与后台保持一致
SSLContext sslContext = SSLContext.getInstance("TLS");
//参数,添加受信任证书和生成随机数
sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
//获得scoket工厂
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
mOkHttpClient.sslSocketFactory(sslSocketFactory);
//设置ip授权认证:如果已经安装该证书,可以不设置,否则需要设置
mOkHttpClient.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}