IP层是不可靠的,所以TCP的任务就是在IP层上提供一种可靠的数据传输服务。TCP提供的可靠数据传输服务保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样,使用以下四种机制来达到此目的
一:序号
序号:用于保证数据能有序提交给应用层。TCP会将数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。TCP连接传送的数据流中的每个字节都编上一个序号。序号字段的值是指本报文段所发送的数据的第一个字节的序号
如下图,假设
A
A
A和
B
B
B之间建立了一条TCP连接,
A
A
A的发送缓存区中共有10B,序号从0开始标号,第一个报文包含第0~2个字节,则该TCP报文段的序号是0,第二个报文段的序号是3
二:确认
确认:TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号
如下图,发送方先发送【123】给接收方
- 为防止丢失,在确认【123】到达之前接收方要一直保存
接收方在收到【123】后返回确认给发送方,由于收到序号为3,下一个要收到的应该是4,所以该确认报文确认号字段为4
- 有时它会把该报文结合在一起一并发送给发送方(捎带确认)
发送方在收到确认报文4后,获悉接收方已经正确接收,所以在其缓存中删除【123】
发送继续发送【456】和【78】,【78】正确接收,但【456】报文由于种种原因未能及时送达
此时TCP会采用累计确认机制,虽然【78】已经接收,但这里确认号字段仍然为4
接着发送方就会继续重传【456】,【456】正确到达后,下一个确认号字段将会填9
三:重传
重传:有两种事件会触发TCP重传机制
(1)超时重传
超时重传:TCP每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就重传这一报文段
- RTTs:为计算超时计时器的重传时间,TCP采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间(RTT)。 TCP保留了RTT的一个加权平均往返时间RTTs,它会随新测量RTT样本值的变化而变化。显然,超时计时器设置的超时重传时间( RTO) 应略大于RTTs
TCP会采用以下公式计算RTO
(2)冗余ACK(快速重传)
- 超时触发重传存在的一个问题是超时周期往往太长。所幸的是,发送方通常可在超时事件发生之前通过注意所谓的冗余ACK来较好地检测丢包情况
冗余ACK:冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认
如下图所示
- 第一份
Seq1 先送到了,于是就Ack 返回2 - 结果
Seq2 因为某些原因没收到,Seq3 到达了,于是还是Ack 返回2 - 后面的
Seq4 和Seq5 都到了,但还是Ack 返回2,因为Seq2 还是没有收到 - 发送端收到了三个
Ack = 2 的确认,知道了Seq2 还没有收到,就会在定时器过期之前,重传丢失的Seq2 - 最后,收到了
Seq2 ,此时因为Seq3 、Seq4 、Seq5 都收到了,于是Ack 返回6
|