Android开发学习笔记(4)
终端网络技术
无线网络
无线网络物理层架构(LTE为例)
- LTE于2G、3G相比做了很多精简化操作
- 手机 ==(数据请求)==》无线基站(通过信道(有限)进行数据交互) ==(数据)==》服务网关SGW(负责与无线基站通信,通过移动管理实体MME查询手机归属无线基站)==》分组网关PWG
- 手机与无线基站连接是无线连接(“最后一公里”),其余有线
第三方影响
- 心跳保活(运营商因素)
- 分组网关保存连接信息,运营商每隔一段时间就淘汰一批,为了保活需要每隔一段时间发送一定的数据量使不丢弃
- 不同厂家不同版本物理设备,故障引起连锁反应(非运营商因素)
TCP与无线网络
- TCP设计之初基于带宽延迟相对稳定、丢包小、资源充足(有线),不适合无线
- TCP特点与移动网络应用层相应优化
- 端到端有序可靠传输
- 序号与确认
- 端到端校验和
- 超时重传(超时计时器RTO略大于RTT)
- 应用层应考虑重传算法、数据校验
- 连接超时的选择
- 考量因素:可用性、网络敏感性、用户体验
- android超时重传时间点1、2、4、8…
- 流量控制和拥塞控制
- 滑动窗口协议
- 通告窗口rwnd —— 来自接收端的流量控制
- 拥塞窗口cwnd —— 来自发送端的流量控制
- 滑动窗口 —— 取rwnd与cwnd最小值
- 慢启动
- 移动网络中丢包率高,接收不到不意味着拥塞。
- google提出BBR
- 服务端实践
- 采用WestWood拥塞控制算法
- 增大TCP初始拥塞窗口
- 连接空闲时禁用慢启动
- 启用窗口缩放(RFC1323)
- 客户端实践
- 减少send调用次数
- 就近接入
- 长连接,避免慢启动
- 压缩传输数据
- 写满TCP发送buffer(流式传输而非分块)
- 控制好数据处理线程
- 滑动窗口协议
- 端到端有序可靠传输
网络协议
- TCP
- 语法 约定格式
- 语义 约定的每一部分代表的含义
- 时序 例:三步握手
- 数据编码(语法)表达内容
- 文本编码(空间浪费较多)
- 逗号分隔
- 对顺序有强要求
- 特殊分隔符”,” 转移
- 不能表达结构信息,类型安全…
- key-value(http常用)
- 清晰表达能力
- 顺序无关
- 可扩展性好
- 前后兼容性
- 不能表达相对复杂结构化信息、嵌套信息,不能进行类型安全检查
- 不容易形成较好规范
- XML
- 自描述
- 类型安全检查信息
- 逗号分隔
- 二进制编码
- TLV(Tag-Length-Value)
- Value也可为TLV结构
- 信息表达能力强
- 数据压缩效果不是很好
- Google ProtoBuff
- 开源、跨平台、跨语言
- 自描述实现兼容性
- 数据组织方式有效减少网络传输大小与流量消耗
- 更小、快、简单
- 前后兼容
- 良好的文档、社区、案例支持,使用广泛
- TLV(Tag-Length-Value)
- 其他
- 压缩
- 加密
- 非对称加密(RSA)—— 身份验证、密钥交换
- 对称加密(AES、DES)
- 文本编码(空间浪费较多)
- 语义 —— 业务数据
- 扩展性
- 规模扩展(后台),通常依赖无状态网络协议或带资源标识的有状态
- 功能扩展
- 兼容性
- 版本号
- 自描述
- 并发性
- 错误处理
- 简洁、高效
- 扩展性
- 语义 —— 信令数据
- 分包,区分并发请求划分间隔
- octet-stuffing 特殊分隔符
- octet-counting 计算长度
- connect-blasting 断连接
- 兼容性与扩展性
- 版本号
- 压缩、加密算法
- 并发处理
- 序列号、命令号
- 精简
- 分包,区分并发请求划分间隔
- 时序同步
- 工具 —— 时序图、状态图