cronet 的简单学习
官方的解释 “Cronet is the networking stack of Chromium put into a library for use on mobile. This is the same networking stack that is used in the Chrome browser by over a billion people. It offers an easy-to-use, high performance, standards-compliant, and secure way to perform HTTP requests. Cronet has support for both Android and iOS. On Android, Cronet offers its own Java asynchronous API as well as support for the java.net.HttpURLConnection API. This document gives a brief introduction to using these two Java APIs.“
参考:https://chromium.googlesource.com/chromium/src/+/master/components/cronet/README.md?autodive=0%2F%2F
可以概况为下面几个方面:
- Cronet 是一个对 Chromium 的网络模块的封装库
- 支持 android/iOS 移动平台(目前在 windows 平台也有使用)
- 可以无缝对接到各个平台的常见网络库同时也拥有自己的 API
- 支持 HTTP 协议,同时支持 QUIC 协议
Chromium 网络模块
Chromium 网络协议栈提供了几个优势来改善页面加载时间。
每次主机建立连接时,都要进行各种活动,比如 DNS 解析和握手。Chromium 协议栈使用 Socket Late Binding 机制来解决这个问题。
Socket Late Binding:网络请求总是当 Socket 准备好发送数据时才与一个 TCP 连接关连起来,所以首先有机会做到对请求有效分级(prioritization),比如,在 socket 连接过程中可能会到达一个更高优先级的请求。同时也可以有更好的吞吐率(throughput),比如,在连接打开过程中,去复用一个刚好可用的 socket, 就可以使用到一个完全可用的 TCP 连接。其实传统的 TCP pre-connect(预连接)及其它大量的优化方法也是这个效果。
现代页面需要大量的资源,而资源优先级是浏览器的一个难题。Chromium 协议栈使用了资源优先级,所有的请求都会以优先级标记发送给服务器,让服务器按照适当的优先级顺序进行响应。
Chromium 还提供了一个磁盘缓存来缓存网络资源。
其他 cronet 功能
在读写数据时,Cronet 使用 JAVA NIO ByteBuffers,为 I/O 功能提供了更好的性能。
作为 Chromium 网络栈,Cronet 也允许设置请求的优先级。
支持 HTTP/2 和 QUIC
使用 Cronet 的优势之一是支持 HTTP/2 和 QUIC。
HTTP/2 通过进化标准,解决了目前 HTTP 的许多弊端。相对于其前身,HTTP/2。
- 是二进制的,而不是文本的
- 是完全多路复用的,而不是有序的和阻塞的:这允许使用一个连接做并行请求
- 使用头压缩来减少开销
- 允许服务器主动将响应 "推送 "到客户端缓存中。
QUIC 协议(Quick UDP Internet Connections)是谷歌在 2012 年宣布的,旨在用 UDP 代替 TCP 取代 HTTP/2。
QUIC 允许以更低的延迟创建连接,是一个没有线头阻塞的多路复用协议。这意味着它解决了数据包丢失的问题,只阻断单个数据流,而不是所有的数据流。
桌面和 Android Chrome 浏览器上的所有主要 Google 网站以及许多 Android 应用程序都使用了 QUIC。
性能测试报告显示,网页加载时间快了 5%,网页搜索速度快了1 秒,达到 99%。YouTube 是使用 QUIC 的地方之一,它报告说,通过减少 30% 的重音(视频暂停)数量,提高了体验质量。
使用 cronet 的原因可以简单的总结为,
- 是对 Chromium 网络堆栈的封装,对 Android 来说,无疑是最佳选择(Chrome 浏览器每天都在使用这个栈)
- cronet 利用多种技术来减少延迟并提高应用正常运行所需的网络请求吞吐量。
- cronet 支持 HTTPS/SPDY/QUIC 等协议,尤其是 QUIC,QUIC 现已提为 HTTP/3,而 QUIC 也是谷歌出品的,使用全家桶无疑稳定性得到了保证
也有更深层次的讨论,
比如,.
- 支持比较全面的网络状态监控,包括 http/tcp rtt、吞吐量、信号强度、系统网络状态变化。
- 基本支持上述的终端优化。
终端优化
- DNS 优化。包括接入大厂的 HTTP(S)DNS,访问最近的 DNS 服务器;内置 DNS 服务 IP 列表;缓存 DNS;依次并发多 DNS 请求,取最快的一个(腾讯 mars 复合连接策略)。
- 预连接/连接复用。包括 Http/TCP 的 keep-alive,减少 Http/TCP 建立连接的耗时。
- 多级缓存。Http Cache、应用层 Cache。
- 请求优先级。合理调度并发数量。
- HTTPS SSL session 持久化以及复用。减少 SSL 握手时间。
参考:https://zhuanlan.zhihu.com/p/93406051
相关文章:
待研究:
cronet 的简单学习的更多相关文章
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- shiro简单学习的简单总结
权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...
- CentOS 简单学习 firewalld的使用
1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...
- Windows 下 Docker 的简单学习使用过程之一 dockertoolbox
1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...
- 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习
嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...
- Linux——帮助命令简单学习笔记
Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- mongodb,redis简单学习
2.mongodb安装配置简单学习 配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作 ...
- html css的简单学习(三)
html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...
- html css的简单学习(二)
html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...
随机推荐
- [转帖]tiup cluster scale-in
https://docs.pingcap.com/zh/tidb/stable/tiup-component-cluster-scale-in tiup cluster scale-in 命令用于集群 ...
- [转帖]tidb之旅——tidb架构选择
https://zhuanlan.zhihu.com/p/641650168 前言 从4月份开始利用tidb改造了我们公司bi系统.这个过程中,我感觉到了tidb的强大.也打算记录一下整个改造过程.我 ...
- [转帖]kubelet 原理解析四:probeManager
https://segmentfault.com/a/1190000022163835 概述 在Kubernetes 中,系统和应用程序的健康检查任务是由 kubelet 来完成的,本文主要讨论kub ...
- css3文字阴影和盒子阴影
文字阴影 文字阴影的语法格式: text-shadow:水平向右的偏移值 向下的偏移值 迷糊度 阴影的颜色,水平向右的偏移值 向下的偏移值 迷糊度 阴影的颜色; 可以有多个阴影,但是在实际的项目中最多 ...
- Vue中is属性的用法 可以动态切换组件
is 是组件的一个属性,用来展示组件的名称 is和component联用哈 vue提供了component来展示对应的组件名称 compont是一个占位符,is这个属性,用来展示对应的组件名称 三个子 ...
- Flask闪现
目录 九.闪现 9.1 什么是闪现? 九.闪现 9.1 什么是闪现? -设置:flash('aaa') -取值:get_flashed_message() - -假设在a页面操作出错,跳转到b页面,在 ...
- windows幻灯片壁纸
设置为10秒 win+r输入regedit 查找路径 HKEY_CURRENT_USER\Control Panel\Personalization\Desktop Slideshow 修改inter ...
- 独立安装VS的C++编译器build tools
Microsoft C++ 生成工具 Microsoft C++ 生成工具 - Visual Studio Microsoft C++ 生成工具通过可编写脚本的独立安装程序提供 MSVC 工具集,无需 ...
- 7.2 通过API创建新进程
创建新的进程是Windows程序开发的重要部分,它可以用于实现许多功能,例如进程间通信.并行处理等.其中,常用的三种创建进程的方式分别是WinExec().ShellExecute()和CreateP ...
- C/C++ Qt 命令行版网络通信
通常情况下Qt如果需要建立网络通信则必须依附于图形界面,但如果是新手入门,图形界面则显得太过于繁琐不利于学习原理,如下本人实现了命令行版本的网络通信案例,能够让读者更好的理解Qt是如何创建网络通信套接 ...