您的位置:首页 > 理论基础 > 计算机网络

网络基本功:TCP重传

2016-04-30 11:31 453 查看
TCP片段重传:主要用到一个TCP片段重传超时计时器以及重传队列。

           检测丢失片段并对之重传的方法概念是很简单的:每次发送一个片段,就开启一个重传计时器。计时器有一个初始值,并随时间递减。如果在片段接收到确认之前计时器超时,就重传片段。
           tcp使用了这一基本技术,但实现方法稍有不同,原因在于为了提高效率需要一次处理多个未被确认的片段,以保证每一个在恰当的时间重传。

TCP按照以下特定顺序工作:

           放置于重传队列中,计时器开始,包含数据的片段一经发送,片段的一份复制就放在名为重传队列的数据结构中,此时启动重传计时器,因此,在某些时间点,每一个片段都会放在队列里。队列按照重传计时器的剩余时间来排列,因此TCP软件可追踪那几个计时器在最短时间内超时。

确认处理:如果在计时器超时之前收到了确认消息,则该片段从重传队列中删除。

重传超时:如果在计时器超时之前没有收到确认消息,则发生重传超时,片段自动重传。当然,相比于原片段,对于重传片段并没有更多的保护机制。因此,重传之后该片段还是保留在重传队列里。重传计时器被重启,冲洗开始倒计时;

           如果重传之后没有收到确认,则片段会再次重传并重复这个过程。在某次而情况下重传也会失败,我们不想要TCP永远重传下去,因此TCP只会重传一定数量的次数,并判断出现故障终止连接。

tcp是积累确认机制
           但是我们怎么知道一个片段被完全确认呢:重传是基于片段的,而TCP确认该信息是基于序列号积累的。每次当设备A发送片段给设备B时,设备B查看该片段的确认号字段。所有低于该字段的序列号都已经被设备A接收了。因此当片段中所发送的所有字节序列号都比设备A到设备B的最后一个确认号小的时候,一个从设备B发到设备A的片段被认为是确认了。这是通过计算片段中最后一个序列号结合片段的数据字段来实现的。

TCP为什么会重传:

           tcp是一种可靠的协议,在网络交互中,TCP报文是封装在IP协议中的,IP协议的无连接性导致其可能在交互的过程中丢失,在这种情况下,TCP协议如何保障其传输的可靠性呢?TCP通过在发送数据报文时设置一个超时定时器来解决这种问题,如果在定时器溢出时还没有收到来自对端对发送报文的确认,它就重传该数据报。

导致重传的情况:

           1.数据报在传输中丢失,发送端的数据报文在网络传输中,被中间链路或中间设备丢弃,因为IP使用的四个关键技术:服务类型,生存时间,选项和包头校验,其中的生存时间是数据报可以生存的时间上限。他由发送者设置,由经过路由的地方处理,如果未到达时生存时间为0,则抛弃该数据,所以导致该数据丢失。

           2.接收端的ACK确认报文在传输途中途丢失。也就是说发送端发送的数据已经被接收端接收,接收端也针对接收到的报文发送了相应的ACK,但是该ACK确认报文被中间链路或中间设备丢弃了,这时候会导致文件的重传,最后TCP也会对就收到的报文进行整理,抛弃重复的数据;
           3.接收端异常未响应ACK或被接收端丢弃。发送端发送的数据报文到达了接收端,但是,接收端由于种种原因,直接忽略了该数据报文,或者接收到报文但并没有发送针对该报文的ACK确认报文。

报文重传的次数:

TCP报文重传的次数也根据系统设置的不同而有区分,一个报文只会被重传3次,如果重传三次后还未收到该报文的确认,那么就不在尝试重传,直接reset重置该TCP连接。
重传主要保障了业务的可靠性,另一方面也反应了网络的通讯状态;

如何判断一个报文是重传报文:

(1)序列号突然下降,一般是TCP重传,因为重传是基于积累确认机制,当发现某个数据包丢失后,所有其后面的

数据包都不会被确认接收,所以必须重传该数据包,那么它的序列号一定比某些数据包的序列号小。

(2)如果发现某一时刻出现了两个相同的数据包,包括数据的长度,序列号甚至应用数据一样,则说明,该数据包是

重传数据包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: