HTTP(S)网络框架的设计

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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下载
目录
相关文章
|
7天前
|
存储 SQL 安全
网络安全与信息安全:守护数字世界的坚盾在这个高度数字化的时代,网络安全和信息安全已经成为个人、企业乃至国家安全的重要组成部分。本文将深入探讨网络安全漏洞、加密技术以及安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
随着互联网技术的飞速发展,网络安全问题日益凸显。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全事件层出不穷。本文将从网络安全漏洞的定义与分类入手,探讨常见的网络攻击手段;随后深入解析加密技术的原理及其在保护信息安全中的作用;最后强调提升公众与企业的安全意识的重要性,并提出具体的建议。通过综合运用这些知识点,我们可以更好地构建起一道道坚固的防线,守护我们的数字世界。
|
9天前
|
编解码 分布式计算 网络协议
Netty高性能网络框架(一)
Netty高性能网络框架(一)
|
6天前
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
|
13天前
|
数据采集 JSON API
🎓Python网络请求新手指南:requests库带你轻松玩转HTTP协议
本文介绍Python网络编程中不可或缺的HTTP协议基础,并以requests库为例,详细讲解如何执行GET与POST请求、处理响应及自定义请求头等操作。通过简洁易懂的代码示例,帮助初学者快速掌握网络爬虫与API开发所需的关键技能。无论是安装配置还是会话管理,requests库均提供了强大而直观的接口,助力读者轻松应对各类网络编程任务。
53 3
|
14天前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
28 2
|
15天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
47 3
|
21天前
|
数据采集 网络协议 API
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
47 8
|
25天前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
36 7
完成切换网络+修改网络连接图标提示的代码框架
完成切换网络+修改网络连接图标提示的代码框架
|
15天前
|
Python
HTTP协议不再是迷!Python网络请求实战,带你走进网络世界的奥秘
本文介绍了HTTP协议,它是互联网信息传递的核心。作为客户端与服务器通信的基础,HTTP请求包括请求行、头和体三部分。通过Python的`requests`库,我们可以轻松实现HTTP请求。本文将指导你安装`requests`库,并通过实战示例演示如何发送GET和POST请求。无论你是想获取网页内容还是提交表单数据,都能通过简单的代码实现。希望本文能帮助你在Python网络请求的道路上迈出坚实的一步。
33 0
下一篇
无影云桌面