OkHttp框架设计(一)
正在整合笔记,近期将会把后续部分上传
文章目录
网络模型
网络分层模型
OSI各层解释
各层对应的设备
各层对应协议
UDP
UDP概要:
- UDP User Datagram Protocol
- TCP/IP协议栈中的两个传输层协议之一
- 技术特征
- 面向消息
- 无连接
- 只是在IP基础上加了一层复用
- 无任何高级、复杂功能,如可靠传输、流量控制、拥塞控制等
UDP首部
- 字段:
- SrcPort,DstPort:辨识应用进程
- Checksum:可选项,基于净荷和伪首部计算
UDP优缺点
-
精细控制何时发送什么数据
- 应用进程一写入数据,UDP即可封装和传出报文段
-
没有连接建立产生的时延
- 无需任何准备,即可传出数据,避免不必要的时延引入
-
没有连接相应的状态
- 无需分配缓存,配置参数等,因此容易同时处理多个活跃客户端
- 首部开销较小 只有8个字节
- 不保证可靠和依序数据发送
-
不能自适应与网络状态
- 可能导致网络过载
- 可能压制自适应流量
采用UDP的应用
- 简单查询协议,例如DNS(Domain Name System)
- 对于承载一条查询消息,单个UDP报文段通常足够
- 连接建立的开销属于过分之举
- 如有需要,由应用来启动重传比较容易
- 多媒体流,如VoIP,视频流
- 偶尔的数据包丢失,可以接受
- 重传丢失或者损坏的数据包,并不值得
- 当数据包重传过来的时候,或许为时已晚
TCP
TCP概要:
- TCP:Transmission Control Protocol
- TCP/IP协议栈中两个传输层协议之一,为多数网络应用所用
- 字节流(byte streaming)
- 不区分上层待传输的消息之间的边界
- 面向连接
- 数据传输之间需要建立连接
- 全双工:一个连接支持并行双向数据传输
- 可靠传输
- 保证依序、无损数据传输
- 流量控制
- 发送方避免接收方过载
- 拥塞控制
- 发送方便网络过载
TCP字节流传输
传输仍然还是以报文段形式,但是TCP并不区分应用进程带传输的消息之间的边界
TCP报文段
-
TCP发送报文段的时机
- 待传数据量达到最大报文段长度(Maximum Segment Size,MSS)
- 应用进程触发,例如应用进程采用推送(push)操作
- 周期式定时
-
MSS的选择
- 使得IP数据包不至于分片
- MSS = MTU - IP首部长度 - TCP首部长度
TCP发送报文段的时机
-
TCP何时发送一个报文段
- 带传数据量达到最大报文段长度(MSS)
- 应用进程触发 ,例如应用进程采用个推送操作
- 定时周期到
-
报文段发送触发定时器 的设计考量
- 提高传输效率 ,例如尽可能发送长报文段,而不是多个短报文段
- 同时不会影响需要实时传输的交互式应用 (如远程登录等,通常传输段字符串)
TCP首部
-
SrcPort, DstPort:用于识别源主机
(发送)、目的地主机(接收)应用进程 -
SequenceNum, Acknowledgement,
Advertisedwindow:用于基于滑动
窗口的流量控制 -
Flags
- SYN, FIN:建立/终止TCP连接
- ACK:当确认字段有效时置1
- URG:表明紧急数据,其中UrgPtr指出非紧急数据起始位置
- PUSH:不用等待报文段填满再发送
- RESET:中断连接
- AdvertisedWindow:用于流量控制
TCP端口
-
类似于UDP, TCP采用端口号识别上层的网络应用
-
服务端被动等候连接,其应用进程采用熟知端口
- 示例: HTTP(Web)服务器 ——80, FTP服务器——21
- 熟知端口号通常范围:1~1023
-
客户端主动连接服务器,其应用进程端口号由主机系统实施分配
- 由于客户端引用进程随时会关闭,持续时间有限,这些端口称为临时端口
- 临时端口号通常范围:1024~5000
-
每个TCP连接可用四元组 <SrclP,SrcPort,DstPort,DstIP> 唯一标识
-
考虑到其他的传输层协议(例如UDP)存在,端到端数据流的标识可以采用五元组 <SrclP,SrcPort,Protocol,DstPort,DstIP>
- 其中Protocol元素表明所用的传输层协议,比如TCP、UDP
- 服务质量(Quality Of Service,QoS)机制可以进行服务区分的流量的最精细颗粒度
-
从主动连接放的角度来看,<DstIP,Protocol,Port> 则意味着Socket API中的socket
TCP连接建立:三次握手
首先发送一个 TCP SYN消息 (可以认为是一个标志),告诉服务端,我要和你建立连接。
服务端收到 TCP SYN消息,回复客户端一个 TCP SYNACK消息
客户端收到TCP SYNACK消息,认为客户端是活跃的在线的,那么再发送给服务端一个对应收到SYNACK 的 ACK,而且这部分可能包含了 客户端发给服务端的数据。
服务端收到这个ACK,确认客户端是活跃的在线的
TCP连接关闭:四次挥手(两轮两次握手)
客户端发送一个FIN,关闭客户到服务器的数据传送
服务器收到FIN,返回一个ACK给服务端
服务器关闭客户端的连接,发送一个FIN给客户端
客户端接收到FIN,返回ACK给服务端
ACK和超时
- 如何确定超时值
-
点对点链路情况下,比较简单
- 传播时延固定,且能预先获知,链路带宽已知
- 因此可以设定固定的超时值
-
但对于TCP链接,比较复杂
-
TCP的超时
-
TCP的超时机制必须在任何时候和任何地方都能正常工作
-
技术方案:超时值正比于RTT
-
为TCP链接确定RTT的挑战所在
- 终端主机之间距离差异很大
- 事先并不知道传播时延
-
排队时延或者丢包随时间变化
- 排队时延还有可能构成RTT的主要成分
- 终端主机之间距离差异很大
-
TCP采用自适应机制确定超时值
HTTP协议
HTTP 1.1
建立在TCP协议之上的“超文本传输协议”(HyperText Transfer Protocol)
历程:0.9 -> 1.0 ->1.1 -> 2.0
HTTPS
HTTP1.x在传输数据的时候,所有传输的内容都是明文,无法保证数据的安全性。
网景在1994年创建了HTTPS,HTTPS就是安全版HTTP
HTTPS在传输数据之前需要进行SSL握手
- 客户端发出:TLS协议版本、支持的加密套件、支持的压缩算法与随机数等
- 服务端传回:TLS版本,根据客户端的支持选择的加密套件,压缩算法,随机数,服务器整数(对称加密算法公钥 如RSA)
- 客户端 校验整数合法性并提取公钥,产生对称加***(如AES),使用证书中的公钥加密AES秘钥,后续通信使用的**与算法,将之前握手参数的hash值等信息使用**加密的数据
- 服务端 根据RSA私钥解密AES**,使用**解密数据并验证,随后同样发送一段AES加密数据
HTTP工作原理(发送请求)
- 客户端与服务端建立连接(三次握手在这里)
- 客户端向服务器提出请求
- 服务器接受请求,并根据请求返回相应的文件作为应答
- 客户端与服务器关闭连接(四次握手)
客户端发送请求到服务器:请求行-- 通用信息头-- 请求头-- 实体头-- 报文主体
服务器响应客户端: 状态行-- 通用信息头-- 响应头-- 实体头-- 报文主体
状态行:1xx信息,2xx成功,3xx重定向,4xx客户端错误,5xx服务器错误