一、可靠数据传输
网络层服务(IP服务)是不可靠的。IP不保证数据报的交付,不保证数据报的按序交付,也不保证数据报中数据的完整性。
TCP则是在IP服务上创建了一种可靠数据传输服务
TCP的可靠数据传输服务确保一个进程从其接收缓存中读出的数据流是无损坏、无间隔、无冗余、按序的数据流。即该字节流与连接的另一端发出的字节流是完全相同的。
作为TCP接收方,有三个与发送和重传有关的主要事件
1、从上层应用数据接收数据
将数据封装到一个报文段中,并把报文段交付给IP。每个报文段都包含一个序号Seq,即该报文段第一个数据字节的字节流编号。如果定时器还没有为其他报文段而运行,则启动定时器(即不是每条报文段都会启动一个定时器,而是一共只启动一个定时器),定时器的过期间隔是TimeoutInterval
是由EstimatedRTT和DevRTT计算得来的:TCP的往返时间的估计与超时
2、超时
TCP通过重传引起超时的报文段来响应超时事件,然后重启定时器。
而发送端超时有两种情况:发送数据超时,接收端发送ACK超时。这两种情况都会导致发送端在TimeoutInterval
内接收不到ACK确认报文段。
- 1、如果是发送数据超时,直接重传即可。
- 2、而如果是接收端发送ACK超时,这种情况接收端实际上已经接收到发送端的数据了。那么当发送端超时重传时,接收端会丢弃重传的数据,同时再次发送ACK。
而如果在TimeoutInterval
后接收到了ACK,会收下ACK,但不做任何处理
- TCP不会为没有数据的ACK超时重传
以下两种情况:
- 1、如果在发送两条或多条数据报文段都超时,那么只会重传序号最小的那个,并重启定时器。只要其余报文段的ACK在新重启的定时器超时前到达,就不会重传。
- 2、如果发送序号为
100
和120
的两条数据报文段,序号100
的ACK丢失,但收到了序号120
的ACK,由于累积确认机制,可以得出接收方已经接收到了序号100
的报文段,这种情况也不会去重传。
3、接收到ACK
用TCP状态变量SendBase
指最早未被确认的字节的序号。则SendBase - 1
指接收方已正确按序接收到的数据的最后一个字节的序号。
当收到ACK确认报文段后,会将ACK的值Y与SendBase
比较。TCP采用累计确认的方法,所以Y
确认来字节编号在Y之前的所有字节都已经收到。如果Y
比SendBase
小,不用理会;而如果Y
比SendBase
大,则该ACK是在确认一个或多个先前未被确认的报文段,因此要更新SendBase
变量,如果当前还有未被确认的报文段,TCP还要重启定时