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】后返回确认给发送方,由于收到序号为3,下一个要收到的应该是4,所以该确认报文确认号字段为4

发送方在收到确认报文4后,获悉接收方已经正确接收,所以在其缓存中删除【123】

发送继续发送【456】和【78】,【78】正确接收,但【456】报文由于种种原因未能及时送达

此时TCP会采用累计确认机制,虽然【78】已经接收,但这里确认号字段仍然为4

接着发送方就会继续重传【456】,【456】正确到达后,下一个确认号字段将会填9
重传:有两种事件会触发TCP重传机制
超时重传:TCP每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就重传这一报文段

TCP会采用以下公式计算RTO

冗余ACK:冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认
如下图所示
Seq1先送到了,于是就Ack返回2Seq2因为某些原因没收到,Seq3 到达了,于是还是Ack返回2Seq4和Seq5都到了,但还是Ack返回2,因为Seq2还是没有收到Ack = 2的确认,知道了Seq2还没有收到,就会在定时器过期之前,重传丢失的Seq2Seq2,此时因为Seq3、Seq4、Seq5 都收到了,于是Ack返回6