热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

App网络基础知识概括

前言网络模块是App应用最基础最核心的模块,稳定高效的网络处理是良好用户体验的基本保障。本文介绍日常开发中常用的网络协议以及使用方法。目录http协议http的问题以及优化策略安全
前言

网络模块是 App 应用最基础最核心的模块, 稳定高效的网络处理是良好用户体验的基本保障。 本文介绍日常开发中常用的网络协议以及使用方法。

目录

  • http 协议
  • http 的问题以及优化策略
  • 安全处理策略
  • WebSocket 协议解析
  • Http2 协议简介

Http 协议

先看一下网络请求传输的过程:

《App网络基础知识概括》

核心步骤主要是以下几步:

  1. DNS 解析, 获取服务器的 ip 地址列表
  2. TCP/IP 链接到服务器
  3. 在 TCP/IP 上构建协议规则
  4. 服务器收到请求,通过通道返回响应
  5. Client 收到响应后关闭通道

Http 协议分为 Request, Response 两部分。 客户端发起一个 Request; 服务器处理后,返回一个 Response。

Request

看一下 Request 的构成:

《App网络基础知识概括》

上半部分为请求头, 下半部分为请求体。

第一行描述请求的方式,请求的路径, http 的协议版本。 之后每一行描述一个请求头字段。 请求头和请求体之间以两个换行分割。

常用的请求头字段:

  • Content-Type: 表示请求内容的类型。 一般 api 请求主要使用

application/json
application/x-www-form-urlencoded
multipart/form-data

  • Content-Length: 请求体大小。 服务器根据这个值才能获取完整的请求数据
  • User-Agent: 客户端可以随意设置的一个值, 用来描述客户端的信息
  • Connection: 链接类型。 上图中 Keep-Alive 表示服务器收到请求号保持链接不要关闭。
  • Accept-Encoding: gzip 表示当前客户端接受 gzip 编码的响应内容

Response

《App网络基础知识概括》

Response 同样分为

两部分。

响应码: 请求是否成功根据响应码判断。 每种响应码都对应各自的含义。详细参考 wiki

常用的响应头:

  • Connection: keep-alive. 表示响应未关闭, 客户端实现上同样需要保持链接未关闭
  • Cache-Control: 协议的缓存策略
  • Content-Encoding: gzip 表示当前返回的内容采用的 gzip 编码。 解析数据时使用 gzip 解码
  • Content-Type:返回数据的内容格式

COOKIE

COOKIE 是随着 Response 返回的键值对数据, 保存在本地。 下次再访问同一个域时, 将 COOKIE 的 kvs 随着 Request 带到 Server。 后台开发人员可以根据业务的需求设置对应的 COOKIE。

Http 的问题

对于 App 的场景来说, 使用 http 协议处理网络请求是一种最简单, 但不是最高效的方式(个人观点)

  1. 最大的问题, 延迟。 App 的请求都很分散, 大部分发起的请求都需要重新构建整个链接, 延迟问题很严重。
  2. 无效数据重复提交。 每次请求都会将同样的 headers 提交到服务器。
  3. 单向数据通道。 服务器属于被动响应模式, 无法做到主动推送数据。

Http 优化策略

《App网络基础知识概括》 Http耗时

如上图, Http 请求的耗时主要由四部分组成。 围绕这四部分分析优化策略。

1. Cache

最快的请求是不发起请求。 不仅在协议层处理网络的缓存, 还需要在业务层处理数据的缓存。 在不必要的情况下, 尽量不发起网络请求, 直接使用缓存中的数据。

2. DNS

系统都有 Dns 解析的实现。 默认情况下直接调用系统 API 执行 Dns 查询操作。

  • Dns 优化策略一
    实现 Dns 二级缓存。 当执行请求时,需要调用 Dns 查询。 将 ips 结果缓存起来, 下次再请求同样的域名时,直接从缓存内取出结果, 而不需要再次调用系统查询

  • Dns 优化策略二
    使用第三方 HttpDns 服务。 系统默认的 dns 服务在不同的设备不同的 os 上实现、速度、缓存策略可能都不太一样。可以使用第三方的 HttpDns 服务查询 IPs, 绕开系统层的实现。 然后自己实现结果缓存策略。 例如, 使用腾讯的 DnsPod 查询百度的 IPs:
    http://119.29.29.29/d?dn=www.baidu.com

3. 链接复用

http 1.1 默认是设置 Connection:Keep-Alive。 就是表示请求完成后并不马上关闭, 后续相同的请求通过链路的复用, 节省 tcp 链接建立的耗时。

4. 请求

在带宽固定的情况下, 减少提交的数据包大小, 降低数据传输的耗时。

  • 策略一
    选择合理的数据提交方式。 一般常用的 post 数据提交格式有
  1. JSON Content-Type: application/json
  2. UrlEncode Content-Type:application/x-www-form-urlencoded
  3. formdata Content-Type:application/form-data

相对来说 json 和 urlEncode 的格式占用比较小。 formdata 比较大, 一般是上传文件时使用。

  • 策略二
    对提交的内容进行压缩。 同时设置 Content-Encoding。

5. 响应

原理同上, 减小数据包的大小, 降低数据传输的耗时。

  • 策略一
    服务器返回数据时将数据做压缩处理。
  • 策略二
    使用 webp 格式的图片资源。 app 的流量消耗的大头在于图片, 使用 webp 格式的图片能够减少 40%+ 的流量消耗。

安全

安全处理策略有两个方面。 一种是在使用上增加安全校验, 一种是在协议上使用安全协议,如 Https。

请求防篡改

前后端交互常规做法的一种。 对请求的参数的某些值连在一块, 再通过加盐算 MD5 值生成一个签名。 将签名值附加到请求参数中。 后端收到请求后同样需要验证这个签名, 不一致的话说明请求参数已经被篡改了, 不予通过。

signature = md5(value1+value2+value3+solt);

稍微更严格一点的方式是,对所有请求参数根据 key 值做自然排序, 再用上述方法算一遍签名。

这种方式主要是为了防止参数被篡改, 并不能防止被拦截。

Https

使用 Https 能从协议上解决安全问题。全面升级到 Https 是目前业界的趋势。 下图是 Https 的处理过程简图:

《App网络基础知识概括》

WebSocket 协议

Http 协议是一种被动式的处理消息的方式。 app 很多场景下需要由服务器主动将数据推送到客户端。 使用 WS 协议维持客户端到服务器的长连接是一种很好的解决方案。 目前在 IM 或直播的场景下应用b
比较广泛。

《App网络基础知识概括》 WS 请求
《App网络基础知识概括》 WS 响应

上面两张图为 ws 协议请求和响应。

  1. 客户端发起一个 http 的 get 请求。
  2. 请求头中表示链接方式为升级(Connection: Upgrade) 到 websocket协议(Upgrade: websocket)
  3. Sec-WebSocket-Key: 为客户端生成的随机字符串(掩码值)
  4. Sec-WebSocket-Version: 13 表示使用 ws 1.3 版本。
  5. 响应码 101 表示协议切换成功, 协议升级到 websocket (Upgrade:websocket)

在看一下 ws 协议下的每帧数据组成:

《App网络基础知识概括》

每帧数据都包含 2byte 的头信息。
FIN 表示是否为最后一帧
RSV1/2/3 为扩展字段。客户端与服务器可以通过约定这几个字段的值实现协议上的附加操作, 比如是否开启数据压缩。
OP Code 为每一帧的操作类型。 比如当前帧是操作帧还是数据帧
MASK 0/1 表示是否设置了掩码
LENGTH 为数据包长度

在 2byte 头信息之后带上整个帧的真实数据。

Http2 协议

下一代 http 协议。 解决了诸多 http 下的问题, 被越来越广泛的应用。 我总结的也不太好, 详细参见另一篇博客HTTP 2.0的那些事

App 下的理想网络模型特点

App 的网络场景要比 pc 上复杂很多, 也不稳定的多。 对于 app 来说, 理想的网络模型特点应该要有:

  • 低延时
  • 安全
  • 双向数据通道

在不同的场景下使用不同的工具去解决问题, 重点是要熟悉每种协议的特点,以及如何使用。

广告: 基于 OkHttp 实现的网络工具库BJNetwork


推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 深入浅出解析HTTP协议的核心功能与应用
    前言——协议是指预先设定的通信规则,确保双方能够按照既定标准进行有效沟通,从而实现准确的信息交换。例如,驯兽师通过拍手使动物坐下,这实际上是一种预设的协议。本文将详细探讨HTTP协议的核心功能及其广泛应用,解析其在现代网络通信中的重要作用。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 利用Redis HyperLogLog高效统计微博日活跃和月活跃用户数
    本文探讨了如何利用Redis的HyperLogLog数据结构高效地统计微博平台的日活跃用户(DAU)和月活跃用户(MAU)数量。通过HyperLogLog的高精度和低内存消耗特性,可以实现对大规模用户数据的实时统计与分析,为平台运营提供有力的数据支持。 ... [详细]
  • 在前一篇文章中,我们介绍了如何使用Requests库发送GET请求。本文将深入探讨如何通过Requests库发送POST请求,包括参数格式、请求封装等关键技巧,并通过“历史上的今天”API实例进行详细说明。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
author-avatar
ghost
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有