HTTP(S)网络框架的设计

简介: 0.麻烦操作系统提供的网络接口都会令人不爽,要么太接近底层而使用不便,要么层次过高又不提供底层点的接口供设置参数。

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)
  3. 正式发起
    • 回调:willSend,最后修改请求的机会
    • 根据scheme创建任务(一般只有HTTP和FTP)
    • 调度:线程(进程)、队列、优先级
  4. 读取缓存或使用代理
    • 若命中规则,尝试读取缓存,如有则返回缓存数据
    • 代理出错的回退
  5. DNS
    • 结果缓存,读取
    • DNS结果优选
    • 回调通知结果
    • (optional)允许设置本地的域名映射表
  6. 连接
    • 连接池(Socket Pool)
    • 长连接(Keep-Alive)
    • 握手和协商,更多协议支持:HTTP/2,QUIC
    • SSL,证书管理
    • 出错或超时,重试
    • 回调通知结果
  7. 发送
    • 加密
    • 回调通知:进度,流量
  8. 接收
    • (optional)限速,限量
    • 解密
    • 解析header
    • 缓存:映射表,容量管理、淘汰策略……
    • 解压,解码
    • 构建响应
    • 回调通知:流量
  9. 结束
    • 回调通知:OK或ERROR(错误码或描述)
  10. 工具
    • 解码
    • 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下载
相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
5天前
|
设计模式 安全 测试技术
深入理解与应用自动化测试框架 — 以Selenium为例网络防线的构筑者:洞悉网络安全与信息安全的核心要素
【5月更文挑战第29天】 在快速迭代的软件开发过程中,自动化测试已成为提高测试效率、确保软件质量的重要手段。本文将深入探讨自动化测试框架Selenium的核心概念、架构以及实际应用中的关键技巧,旨在为读者提供一篇系统性的分析与实践指南。文章首先概述了自动化测试的必要性和Selenium框架的基本特征;随后详细剖析了Selenium的组件结构,并结合实例讲解如何高效地设计和执行测试用例;最后,讨论了当前自动化测试面临的挑战及未来发展趋势。
|
17天前
|
安全 网络协议 网络安全
OWASP Top 10 网络安全10大漏洞——A01,源码+原理+手写框架
OWASP Top 10 网络安全10大漏洞——A01,源码+原理+手写框架
|
17天前
|
关系型数据库 MySQL 网络安全
Docker部署MySQL,2024网络安全通用流行框架大全
Docker部署MySQL,2024网络安全通用流行框架大全
|
18天前
|
缓存 安全 前端开发
探索HTTP协议:网络通信的基石
探索HTTP协议:网络通信的基石
|
19天前
状态码对于理解HTTP请求和响应的流程,以及调试网络问题非常重要
【5月更文挑战第15天】HTTP状态码由三位数字表示,分为1xx-5xx五类。1xx为信息响应,2xx表示成功,如200(请求成功)、201(创建成功)。3xx是重定向,如301(永久移动)、302(临时重定向)。4xx表示客户端错误,如400(坏请求)、404(未找到)。5xx是服务器错误,包括500(内部服务器错误)和503(服务不可用)。这些状态码用于理解请求响应流程和调试网络问题。
23 1
|
5天前
|
JSON API 定位技术
.NET集成DeveloperSharp实现http网络请求&与其它工具的比较
该内容介绍了一个支持.NET Core 2.0及以上和.NET Framework 4.0及以上的HTTP请求调用方法,主要讨论了POST和GET两种形式。POST请求较为常见,涉及调用地址、发送参数、HTTP请求头和编码格式设置。文中提供了一个使用DeveloperSharp库发送POST请求的C#代码示例,用于发送短信,其中`IU.HttpPost`方法用于执行POST请求。此外,还提到了`HttpPost`方法的参数和返回值说明。最后简要提及了GET请求,通常用于URL带有查询参数的情况,并给出一个简单的GET请求示例。
|
7天前
|
机器学习/深度学习 存储 安全
网络安全与信息安全:防护、检测与教育移动应用开发的未来:跨平台框架与原生系统的融合
【5月更文挑战第27天】在数字化时代,数据成为了新的货币。因此,确保信息的安全性和网络的完整性变得至关重要。本文将探讨网络安全漏洞的概念、加密技术的重要性以及提升安全意识的必要性。通过分析不同类型的安全威胁,我们讨论了如何利用现代加密技术和多层防御策略来保护信息系统。此外,文中还强调了教育和培训在构建坚固的安全防线中的作用。
|
7天前
|
安全 数据管理 测试技术
网络安全与信息安全:防范漏洞、加强加密与提升安全意识深入探索自动化测试框架的设计原则与实践应用化测试解决方案。文章不仅涵盖了框架选择的标准,还详细阐述了如何根据项目需求定制测试流程,以及如何利用持续集成工具实现测试的自动触发和结果反馈。最后,文中还将讨论测试数据管理、测试用例优化及团队协作等关键问题,为读者提供全面的自动化测试框架设计与实施指南。
【5月更文挑战第27天】 在数字化时代,网络安全与信息安全已成为维护国家安全、企业利益和个人隐私的重要环节。本文旨在分享关于网络安全漏洞的识别与防范、加密技术的应用以及提升安全意识的重要性。通过对这些方面的深入探讨,我们希望能为读者提供一些实用的建议和策略,以应对日益严峻的网络安全挑战。 【5月更文挑战第27天】 在软件开发周期中,自动化测试作为保障软件质量的关键步骤,其重要性日益凸显。本文旨在剖析自动化测试框架设计的核心原则,并结合具体案例探讨其在实际应用中的执行策略。通过对比分析不同测试框架的优缺点,我们提出一套高效、可扩展且易于维护的自动
|
12天前
|
JSON 安全 网络协议
【Linux 网络】网络基础(二)(应用层协议:HTTP、HTTPS)-- 详解
【Linux 网络】网络基础(二)(应用层协议:HTTP、HTTPS)-- 详解
|
19天前
|
移动开发 网络协议 网络安全
【网络安全 | 网络协议】一文讲清HTTP协议
【网络安全 | 网络协议】一文讲清HTTP协议
31 0