详解TCP协议(三)——可靠传输

一、可靠传输的目的

我们知道IP提供的是不可靠的尽力传输服务,那么TCP如何实现可靠的传输服务呢前面的博客写过,用差错检测,计时器,重传等措施,TCP使用了上述措施,并用滑动窗口协议提供其传输速度(性能)

TCP的可靠传输目的是确保一个进程从其接收缓冲区中读出的数据流是无差错,无缺失,无冗余,无乱序的字节流

二、TCP如何实现可靠传输服务

从发送方角度,分为正常发送及重传两种情况

2.1正常发送

发送方从上层应用程序接收数据,将数据分割成适合TCP发送的数据块(MSS),放入发送窗口。

如果发送窗口已经满了,可以拒绝接收数据,防止发送方发送数据过快,导致较慢主机缓存区溢出(流量控制)。

如果发送窗口不满,按照字节将数据块进行编号,发送方流水线式发送数据,得到接收方确认后,接着发送后面的数据

2.2重传数据

2.2.1接收方收到错误数据

通过检验和,进行差错检测,接收方收到差错数据进行丢失,并发送报文,报文中的确认序号为收到的最后一个序号+1,此时发送方会重传确认序号的数据

2.2.2计时器超时(视为丢失)

在发送方每发送一个数据,都会为其开启一个计时器,在超时时长内没有收到接收方确认信息,被认为丢失。

这种情况分为两种,一种是真丢失,一种是没有丢失超过超时时长,之后又收到数据

第一种:真丢失
详解TCP协议(三)——可靠传输
确认信息丢失,超过超时时长,于是重新发送序号为180的数据

注意:数据丢失与ACK丢失是一样的,报文中包含确认序号及序号对应的数据,TCP中没有很明确的接收方与发送方

第二种:超过超时时长又接收到数据
详解TCP协议(三)——可靠传输
如图所示,确认序号200超过了180的时间间隔,于是重新发送序号180的数据,而不用重发序号200的数据,因为此时基序号为180

2.2.3快速重传

TCP一旦收到3次重复ACK,就算没有超过超时时长也会重新发送数据,如下图
详解TCP协议(三)——可靠传输
主机B希望收到序号200的数据,但丢失了,确认序号200发了四次,到第四次的时候(此时已重复三次)会认为序号200丢失,重新发送序号200数据。

2.3重新排序

TCP报文段封装到IP数据报中传输,IP数据报的到达可能经过不同的路由而乱序,所以有必要的话会对报文段进行重排

2.4冗余数据

由于重传及网络延迟,会有冗余数据所以TCP会将冗余数据丢弃

三、总结

详解TCP协议(三)——可靠传输
通过上述措施就可以实现TCP的可靠传输