16.网络基础
1. HttpClient和HttpConnection的区别?
Http Client适用于web浏览器,拥有大量灵活的API,实现起来比较稳定,且其功能比较丰富,提供了很多工具,封装了http的请求头,参数,内容体,响应,还有一些高级功能,代理、COOKIE、鉴权、压缩、连接池的处理。 但是,正因此,在不破坏兼容性的前提下,其庞大的API也使人难以改进,因此Android团队对于修改优化Apache Http Client并不积极。(并在Android 6.0中抛弃了Http Client,替换成OkHttp)
HttpURLConnection对于大部分功能都进行了包装,Http Client的高级功能代码会较复杂,另外,HttpURLConnection在Android 2.3中增加了一些Https方面的改进(包括Http Client,两者都支持https)。且在Android 4.0中增加了response cache。当缓存被安装后(调用HttpResponseCache的install()方法),所有的HTTP请求都会满足以下三种情况:
- 所有的缓存响应都由本地存储来提供。因为没有必要去发起任务的网络连接请求,所有的响应都可以立刻获取到。
- 视情况而定的缓存响应必须要有服务器来进行更新检查。比如说客户端发起了一条类似于 "如果/foo.png这张图片发生了改变,就将它发送给我" 这样的请求,服务器需要将更新后的数据进行返回,或者返回一个304 Not Modified状态。如果请求的内容没有发生,客户端就不会下载任何数据。
- 没有缓存的响应都是由服务器直接提供的。这部分响应会在稍后存储到响应缓存中。
在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。 而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中Android官方也会将更多的时间放在优化HttpURLConnection上面。
2. socket 判断 http 请求或 http 响应的传输结束?
【参考】:先把 header 直到\r\n\r\n 整个地址记录下来
-
1、如果是短连接,没有启用 keepalive,则可以通过是否关闭了连接来判断是否传输结束,即在读取时可判断 read() != -1。传输完毕就关闭 connection,即 recv 收到 0 个字节。
-
2、如果时长连接,那么一个 socket(tcp)可能发送和接收多次请求,那么如何判断每次的响应已经接收?
2-1、先读请求头,一直到\r\n\r\n 说明请求头结束,然后解析 http 头,如果 Content-Length=x存在,则知道 http 响应的长度为 x。从头的末尾直接读取 x 字节就是响应内容。
2-2、如果 Content-Length=x 不存在,那么头类型为 Transfer-Encoding: chunked 说明响应的长度不固定,则在响应头结束后标记第一段流的长度,即直到流里有\r\n0\r\n\r\n 结束
2-3.、如果 recv 返回 SOCKET_ERROR 时,说明对方已经断开连接,但是可能是非正常断开(断网或者客户端进程结束).
3. TCP 可靠性的保证机制总结
【参考】
1、检验和
2、序列号
3、确认应答机制(ACK)
4、超时重传机制
5、连接管理机制
6、流量控制
7、拥塞控制
4. Http 1.0 和 Http 2.0 区别?
【参考】
-
HTTP1.0
无状态、无连接
-
HTTP1.1
持久连接
请求管道化
增加缓存处理(新的字段如 cache-control)
增加 Host 字段、支持断点传输等(把文件分成几部分)
-
HTTP2.0
二进制分帧
多路复用(或连接共享)
头部压缩
5. http 和 https 的区别?
【参考】
-
https 通信过程
1、在使用 HTTPS 是需要保证服务端配置正确了对应的安全证书
2、客户端发送请求到服务端
3、服务端返回公钥和证书到客户端
4、客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密, 发送到服务端
5、服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随
机数当做私钥对需要发送的数据进行对称加密
6、客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户
7、SSL 加密建立
-
HTTPS 和 HTTP 的区别主要如下:
1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。