0.麻烦

操作系统提供的网络接口都会令人不爽,要么太接近底层而使用不便,要么层次过高又不提供底层点的接口供设置参数。但是我们不能期望系统API做得很高级,因为没有绝对合适的网络库,必须定制化从而达到适合某业务下的最佳性能。

1.需求

移动app使用网络框架的场景不外乎三个:

  1. 和自家(CS架构的)服务器通信
  2. 下载文件
  3. Web浏览

从方便和可扩展性出发,不少app会选择通信协议为HTTP(S),数据协议则为自定义。为了保护隐私,如果不使用HTTPS,数据都该自行加密。一般而言,除非在TCP上使用自定义的通信协议,自有的功能或业务代码都不会写到网络库内部,而是写在上层。这也要求网络库本身有足够的接口来适应业务需求。这些非协议标准的需求可能有:

  • 自动填充一些必须的header,例如host、accept等。
  • 在关键的流程节点有回调通知,可以在这些时机打Log、记录与统计。或者由网络框架内部记录性能数据,通过别的接口输出给上层。
  • 下载:分段,断点续传,FTP支持,多连接下载。
  • 同步&异步,线程池,在合适的线程做回调。
  • 出错自动重试。
  • 预先建立连接,有连接池。
  • 不同网络类型、质量下使用不同的通信策略。
  • 清理缓存
  • 可以流式读写
  • 程序进入后台的处理,按需要可断网、降低优先级、限速等。
  • 组合请求:多个请求都正确返回才一起回调

2.内部设计

流程:

  1. 产生URL和可选的post body,来自业务模块
  2. 构建请求
  • method
  • header(User-Agent, Cookie,Accept……)
  • post body,文件分段上传(需自动填充标准要求的header)
  1. 正式发起
  • 回调:willSend,最后修改请求的机会
  • 根据scheme创建任务(一般只有HTTP和FTP)
  • 调度:线程(进程)、队列、优先级
  1. 读取缓存或使用代理
  • 若命中规则,尝试读取缓存,如有则返回缓存数据
  • 代理出错的回退
  1. DNS
  • 结果缓存,读取
  • DNS结果优选
  • 回调通知结果
  • (optional)允许设置本地的域名映射表
  1. 连接
  • 连接池(Socket Pool)
  • 长连接(Keep-Alive)
  • 握手和协商,更多协议支持:HTTP/2,QUIC
  • SSL,证书管理
  • 出错或超时,重试
  • 回调通知结果
  1. 发送
  • 加密
  • 回调通知:进度,流量
  1. 接收
  • (optional)限速,限量
  • 解密
  • 解析header
  • 缓存:映射表,容量管理、淘汰策略……
  • 解压,解码
  • 构建响应
  • 回调通知:流量
  1. 结束
  • 回调通知:OK或ERROR(错误码或描述)
  1. 工具
  • 解码
  • URL:parser(得到scheme、port、query、host等), encode & decode
  • base64
  • 网络状态监控:连通性,网络类型,弱网(网络质量评级)
  • 日志输出,打点
  • 下载文件的保存文件名推荐(根据URL、mime type等)
  • 网络(适配器)连接信息获取,含WiFi、蜂窝网络等
  • (optional)Server
  • UDP
  • 枚举所有的状态码和reason、常见的header name……

特殊场景的优化:

  1. 证书缓存
  2. 机器学习,智能预测:例如初始化后,对常访问的域名主动预解析、预连接,预加载
  3. 自家服务器压缩,或支持新的压缩格式
  4. 私有协议优化

运维的因素:

  1. 下发DNS,上传统计数据
  2. 下发指定域名或IP使用某种策略
  3. CDN SDK,迅雷SDK
  4. 模块可选,定制化编译与发布

3.接口设计

核心类:

  1. Request, Callback
  2. Response
  3. Manager, Callback
  4. Utility
  5. Parser、证书、log……

五种风格,差别在于拿哪个类来Start:

  1. URL,java.net库
  2. Request,Chromium网络库
  3. 事务:Transaction(WebKit) ; Connection(iOS)
  4. 管理器:Controller / Manager
  5. enqueue到任务队列(okhttp)

请求的设置和操作(可以是单个或全局,全局的应在Manager设置):

  1. method,header,body(upload file path),Auth
  2. 连接超时
  3. 获取数据超时
  4. DNS
  5. 跳转策略
  6. 是否(强制)使用或不使用缓存
  7. 是否(强制)使用或不使用代理
  8. 重试次数
  9. 自定义(伪造)响应
  10. 数据保存位置选择(内存或磁盘路径)
  11. 优先级
  12. Cancel

Manager设置与操作:

  1. Debug,包括打印log和其它。可以由外部传入Logger
  2. 清理指定缓存,可以具体到URL或host的DNS、HTTP缓存
  3. 设置缓存路径,容量
  4. 各种功能的开关
  5. 获取整体的负荷(任务数、占内存、缓存量等)

4.指标

(分域名)性能:

  • 总耗时,各阶段耗时
  • 重试次数
  • 最终失败的次数
  • 连接(Keep-Alive和预连接)复用率

空间占用:

  • 事务的整体内存波动
  • 各阶段的模块的内存占用
  • 缓存的淘汰策略,磁盘占用空间

5.如果有钱

  1. 动态网络策略:收集用户的网络使用习惯,并根据当前网络类型、质量来设置各类参数。
  2. 使用中间件进行数据传输
  3. 恶意URL检测
  4. 性能数据收集统计:
    RT,出错次数,出错率,请求次数,来源方……
  5. 针对特定业务优化,如视频
  6. 支持按视频协议下载,支持p2p下载

HTTP(S)网络框架的设计相关推荐

  1. Java EE 架构设计——基于okhttp3 的网络框架设计

    转载请注明出处:http://blog.csdn.net/smartbetter/article/details/77893903 本篇文章带大家设计一套满意业务需求.代码健壮高效(高内聚低耦合)并且 ...

  2. 【 C++ 技术】 C++ 高性能服务器网络框架设计细节

    作者:范蠡  原文:C++ 高性能服务器网络框架设计细节 前言 这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序.需要注意的是一般大型服务器,其复杂程度在于其业务, ...

  3. 基于Django框架的网络云盘设计

    基于Django框架的网络云盘设计 网络云盘设计流程(第一篇) 前言 前期准备与环境搭建 创建一个Django工程,跑一个HelloWorld 网盘设计简介及成果展示 功能1,"登录&quo ...

  4. 网络框架 - 收藏集 - 掘金

    浅谈 Retrofit 封装 - 让框架更加简洁易用 - Android - 掘金 尊重他人的劳动成果,转载请标明出处:http://blog.csdn.net/gengqiqu..., 本文出自:[ ...

  5. 网络系统结构和设计的基本规则(Basic rules for network system architecture and design)

    网络系统结构和设计的基本规则(Basic rules for network system architecture and design) PSTN ( Public Switched Teleph ...

  6. 架构风格与基于网络的软件架构设计

    原文链接 https://blog.csdn.net/on_1y/article/details/60358117 架构风格与基于网络的软件架构设计 如今许多服务都采用了 RESTful API, 而 ...

  7. ECCV 2020,一种灵活高效的权重生成网络框架

    旷视研究院提出一个灵活高效的权重生成网络框架,称为WeightNet. 论文题目: WeightNet: Revisiting the Design Space of Weight Networks ...

  8. Rpc远程调用框架的设计与实现(1)

    Rpc远程调用框架的设计与实现 1   Rpc远程调用框架设计概述 1.1  研究背景 1.1.1传统的Web开发方式 在传统的Web应用程序中,一般都是采取请求→刷新→显示的模式.即每当用户通过单击 ...

  9. mysql 源码设计,java+mysql大学网络社区平台设计+源代码

    摘要如今,信息管理与信息系统的网络平台上,更多的都是一些静态信息的介绍,缺乏老师与老师之间, 老师与同学之间信息的交流的功能. 因此, 需要建立一个从 Web 1.0转换到 Web 2.0 的, 能够 ...

最新文章

  1. ERROR: from PIL import Image ImportError: No module named PIL
  2. 术语1----边界吸收
  3. 线性代数:05 实对称矩阵与二次型
  4. 部署 H3C CAS E0306
  5. mysqldatareader什么意思_MySqlDataReader在Using中使用
  6. cocos2d-x游戏开发(三)无限滚动地图
  7. vue项目引入字体图标iconfont
  8. 前端学习(561):解决margin重叠第二种情况父子
  9. STM32F103定时器输入捕获功能
  10. 【毕业设计】PHP公共课平时成绩查询系统(源代码+论文+答辩PPT)
  11. 算法——贪心算法解0-1背包问题
  12. 基于PHP物流网站信息管理系统
  13. 刚买的win8.1电脑 求常用的软件推荐?
  14. DynamicDNSSVR 动态域名更新服务 免费软件
  15. 如何升级Microsoft Edge浏览器
  16. 转载:F28335 Ecap使用总结
  17. 【liunxptp协议栈详解第一部分】
  18. linux学习shell基础
  19. 从零开始的纪中生活(7.11~7.22)
  20. Android 使用crosswalk实例

热门文章

  1. 十年无爆款,音频平台的困境
  2. (分配问题)你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条
  3. django 开发多语言网站
  4. shell函数定义、函数调用及函数返回值用法
  5. 微课堂V2 v4.6.4
  6. 学习编写Haxe的HelloWorld
  7. 微信小程序如何本地调试
  8. day13【Map、斗地主排序、冒泡排序】
  9. 技嘉X299-WU8,用了不到一个月,主板短路
  10. 寰宇保险代理收购CXA集团的经纪业务,成为新加坡和香港第三大员工福利经纪公司