TCP可靠传输
一、TCP可靠传输概览
可靠传输:接收方收到的字节流和发送方发出的字节流是完全一样的
TCP保证可靠传输的机制有如下几种:
- 校验和Checksum
- 序列号和确认应答机制
- 重传机制
- 流量控制(滑动窗口协议)
- 拥塞控制
二、校验和
若校验和有错误,说明TCP的首部和数据在发送端和接收端之间发生了变动,TCP报文段会被直接丢弃
TCP在计算校验和时,需要加上一个12字节的伪首部
12字节伪首部包括:
- 源IP地址
- 目的IP地址
- 保留字节(置0)
- 传输层协议号(TCP是6)
- TCP报文长度(首部 + 数据)
伪首部的目的是为了增加TCP校验和的检错能力:如根据目的IP地址检查这个TCP报文是不是传给我的、根据传输层协议号检查传输层协议是否选对
伪首部只在校验的时候使用
三、序列号和确认应答机制
四、重传机制
重传机制:
1??超时重传
TCP发送方在发送报文的时候,设定一个定时器,如果在规定的时间内没有收到来自接收方发来的ACK确认报文,发送方就会重传这个已经发送的报文段
有两种情况:
进行多长时间进行重传比较好?(RTO超时重传时间)
RTT(Round-Trip Time):往返时延,报文段的往返时间
RTO的时间应略大于RTT的时间
若过大:网络空闲时间增大,降低网络传输效率
若过小:不必要的重传,导致网络负荷增大
若超时重传的数据又超时的话,TCP的策略是重传的超时时间间隔加倍(1s,2s,4s,8s……)
存在问题:超时周期相对较长,有没有方法可以减少超时重传的等待时间呢?快速重传
2??快速重传
快速重传不以时间为驱动,而是以数据驱动进行重传
原理:每当接收方收到比期望序号大的失序报文段到达时,就向发送方发送冗余ACK,指明下一个期待字节的序号
五、滑动窗口协议
1??累积确认
收到上一个报文段的确认报文再发送下一报文段的模式效率低下
引入窗口:无需等待确认应答,可以连续发送数据的最大值
窗口的实现实际上是操作系统开辟的一个内核缓冲区,发送方在等待确认应答报文返回之前,必须在缓冲区中保留已经发送的数据,如果在规定时间间隔内收到确认应答报文,就可以将数据从缓冲区清除
简单说,只要发送方接收到了ACK 600的确认应答,就意味着第600字节之前的所有数据都被接收方收到了,这个模式叫做累积确认或者累积应答
2??发送方的滑动窗口
四部分数据:
- 已发送并收到ACK
- 已发送还没有收到ACK
- 未发送但在接收方处理范围内
- 未发送且超出接收方处理范围
当发送方将数据都发送出去之后,可用窗口大小为0,表明已经耗尽窗口,在没收到ACK确认之前无法继续发送数据
3??接收方的滑动窗口
分为三部分:
- 已经接受并发送确认的数据(只要接收就必须发送确认)
- 未接受但可以接收的数据
- 未接受但不可以接收的数据(超过了接收方窗口大小)
同样的,接收方的滑动窗口在成功接收并确认的数据后,窗口右移
举个例子:
六、流量控制
场景:A一直向B发送数据,不考虑B的接受能力,就会使得B的缓冲区满而无法再接受数据,从而导致大量的数据丢包,引发重传机制。而在重传的过程中,B的缓冲区情况仍未好转,则会将大量的时间浪费在重传数据上,降低传送数据的效率
引入流量控制机制:B告诉A自己接收缓冲区大小,使得A可以控制发送的数据量
流量控制:控制发送方发送速率,保证接收方来得及接收
TCP实现流量控制主要就是通过 滑动窗口协议
七、拥塞控制
1??概念
拥塞:(需求太大)对网络中某一资源的需求超过该资源所能提供的可用部分,使得网络性能变差
出现拥塞:控制发送方的速率
区分流量控制和拥塞控制:
- 流量控制:让接收方能来得及接收
- 拥塞控制:控制发送方的发送速率,防止过多的数据注入到网络中(学生抢课)
为了调节发送方所要发送数据的量,定义了拥塞窗口cwnd的概念,它会根据网络的拥塞程度动态变化:
在引入拥塞窗口之前,发送窗口大小和接收窗口大小基本是相等的关系(接收窗口大小决定),在引入拥塞窗口之后,发送窗口的大小就等于:min(拥塞窗口大小,接收窗口大小)
2??TCP拥塞控制四种算法
四种算法:
1.慢开始
思路:TCP刚建立好连接后,如果立即将大量数据字节注入网络会引起网络阻塞。我们可以一点点的试探,提供数据报发送的数量,由小到大逐渐增大拥塞窗口的数值,cwnd初始设为1,每经过一个传播轮次,cwnd加倍(按指数增长)
设置慢启动轮限ssthresh状态变量:
- 当 cwnd < ssthresh 时,使用慢启动算法
- 当 cwnd > ssthresh 时,使用拥塞避免算法
2.拥塞避免算法
思路:让拥塞窗口cwnd缓慢增大,即每经过一个往返时间 + 1
🐷无论是慢启动算法还是拥塞避免算法,只要出现网络拥塞(触发了超时重传机制),ssthresh和cwnd就会发生改变:
- ssthresh = cwnd / 2
- cwnd = 1
3.快重传和快恢复
这两种算法一般同时使用
快重传
快恢复
ssthresh和cwnd的值发生改变:
- cwnd = cwnd / 2
- ssthresh = cwnd
【参考】计算机基础网站学习 https://cswiki.top/
|