1、运输层
功能:负责两个进程之间的通信(TCP、UDP);复用、分用 数据单位:报文段(TCP)或用户数据报(UDP) 运输层只存在于分组交换网外面的主机中 地位
- 面向通信部份的最高层
- 用户功能中的最底层
网络层为主机之间提供逻辑通信 运输层为应用进程之间提供端到端的逻辑通信 运输协议
- 面向连接的TCP
| 全双工的可靠通信 - 无连接的UDP
| 不可靠信道 - 对比
2、用户数据报协议 UDP
提供无连接服务
在传送数据之前不需要先建立连接
数据单位:UDP报文或用户数据报
不可靠交付
UDP特点
(1)UDP是无连接的
(2)UDP使用尽最大努力交付
(3)UDP是面向报文的
(4)UDP没有拥塞控制
(5)UDP支持一对一、一对多、多对一和多对多的交互通信
(6)UDP的首部开销小
3、传输控制协议 TCP
提供面向连接的服务
数据单位:TCP报文段
不提供广播或多播服务
提供可靠的、面向连接的运输服务
TCP特点
(1) TCP是面向连接的运输层协议
(2) 每一条TCP连接只能有两个端点(点对点)
(3) TCP提供可靠交付的服务
(4) TCP提供全双工通信
(5) 面向字节流
4、TCP数据报
4.1 格式
首部(最小长度为20字节)
4.2 字段
- 源端口、目的端口:各占2字节
- 序号:4字节,给传送的数据流中的每一个字节都编上一个序号
| 值为本报文段所发送的数据报的第一个字节的序号 - 确认号:4字节,期望收到对方的下一个报文段的数据的第一个字节的序号
- 确认ACK:只有当ACK=1时确认字段才有效
- 数据偏移:4字节,单位为32位字(4字节)
- 保留:6位
- 紧急URG:当URG=1时,表明紧急指针字段有效
- 紧急指针字段:16位,指出本报文段中紧急数据共有多少个字节
- 推送PSH:接收TCP收到PSH=1的报文段,就尽快交付接收应用进程,而不是等整个缓存填满后在交付
- 复位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放来凝结,然后重新建立运输连接
- 同步SYN:当SYN=1,这是一个连接请求或连接接收报文
- 终止FIN:用来释放一个连接,当FIN=1表明此报文段是其发送的最后数据,并要求释放运输连接
- 窗口:2字节,用来让对方设置发送窗口的依据,单位为字节
- 校验和:2字节
- 选项:MSS(TCP报文段中的数据字段的最大长度)
5、TCP发送窗口机制
5.1 以字节为单位
5.2 发送缓存
- 发送应用程序传送给发送方TCP准备发送的数据
- TCP已发送出但尚未收到确认的数据
5.3 接收缓存
- 按序到达的、但尚未被接受应用程序读取的数据
- 不按序到达的数据
- 发送窗口并不总是和接收窗口一样大
- TCP标准没有规定不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程
- TCP要求接收方必须有累计确认的功能,这样可以减小开销
5.4 超时重传
TCP采用了一种自适应算法
- 记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段往返时间RTT
- TCP保留了RTT的一个加权平均往返时间RTTs(平滑的往返时间)
- 第一次测量到RTT样本,RTTs值就取为所测量的RTT样本值。以后每测量到一个新的RTT样本,新的RTTs = (1-a)(旧的RTTs)+a(新的RTT样本)
| 0<=a<1,RFC6298推荐的a值为1/8,即0.125
超时重传时间RTO
- 应略大于加权平均往返时间RTTs
- RTO=RTTs+4*RTTD
| RTTD是RTT偏差的加权平均值 - 第一次测量时,RTTD取RTT样本的一半
- 之后:新的RTTD = (1-β)(旧的RTTD)+β|RTTs-新的RTT样本|
| β是一个小于1的系数,推荐值为1/4,即025
若报文重传
- 新的RTO = γ*(旧的RTO)
| γ经典值为2
6、TCP确认机制
停止等待协议
发送分组后,暂停发送,等待接收端的确认(ACK)。收到确认之后再次开始发送
确认丢失
确认迟到
选择确认SACK(滑动窗口机制中)
只传送缺少的数据,而不重传已经正确到达接受方的数据
接受方收到了和前面的字节流不连续的两个字节块
如果这些字节的序号都在接收窗口之内,那么接受方就先收下这些数据,但要把这些信息准确的告诉发送方,使发送方不再重复发送这些已收到的数据
7、TCP运输连接
7.1 连接建立(三次握手)
三次握手是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误
7.2 数据传送
7.3 连接释放(四报文握手)
A必须等待2MSL时间
- 为了确保A发送的最后一个ACK报文段能够达到B
- 防止“已失效的连接请求报文段”出现在本连接中。
8、TCP的拥塞控制算法及应用
- TCP采用基于窗口的方法进行拥塞控制(闭环控制方法)
- TCP发送方维持一个拥塞窗口CWND
- 慢开始门限ssthresh
| 防止拥塞窗口cwnd增长过大引起网络堵塞
8.1 拥塞控制算法
慢开始(cwnd<ssthresh)
- 从小到大逐渐增大拥塞窗口数值
- 每一轮cwnd的增加量 = min(N, SMSS)
N是原先未被确认,现在被刚收到的确认报文段所确认的字节数
拥塞避免(cwnd>ssthresh)(加法增大)
- cwnd缓慢增大,即每次cwnd加1,拥塞窗口cwnd按线性规律缓慢增长
快重传 快恢复(乘法减小)
- 不执行慢开始,而是执行快恢复
- ssthresh = cwnd/2
- cwnd = ssthresh
- 开始执行拥塞避免算法
8.2 拥塞的判断
重传定时器超时
- ssthresh = max(cwnd/2, 2)
- cwnd=1
- 执行慢开始算法
收到三个相同(重复)的ACK
8.3 拥塞控制流程图
|