网络基本功: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)如果发现某一时刻出现了两个相同的数据包,包括数据的长度,序列号甚至应用数据一样,则说明,该数据包是
重传数据包。
检测丢失片段并对之重传的方法概念是很简单的:每次发送一个片段,就开启一个重传计时器。计时器有一个初始值,并随时间递减。如果在片段接收到确认之前计时器超时,就重传片段。
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)如果发现某一时刻出现了两个相同的数据包,包括数据的长度,序列号甚至应用数据一样,则说明,该数据包是
重传数据包。
相关文章推荐
- HttpClient——Get请求
- HttpClient——Post请求
- C#网络编程之---TCP协议的同步通信(二)
- C#网络编程之--TCP协议(一)
- tcp 状态以及三次握手
- HttpURLConnection请求
- 如何使用gson解析泛型形参并返回相对应的类
- HttpClient 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete
- TCP SYN洪泛攻击的原理及防御方法
- Okhttp使用
- android网络通信之WIFI教程实例汇总
- git使用ssh密钥和https两种认证方式汇总(转)
- 机器学习之神经网络模型-下(Neural Networks: Representation)
- 机器学习之神经网络模型-上(Neural Networks: Representation)
- Android开发本地及网络Mp3音乐播放器(十一)使用Jsoup组件请求网络,并解析音乐数据
- Android开发本地及网络Mp3音乐播放器(十一)使用Jsoup组件请求网络,并解析音乐数据
- 安卓APP测试之使用Burp Suite实现HTTPS抓包方法
- java发送http的get,post请求【学习记录】(转)
- [置顶] linux TCP 和 socket 参数设置
- Android 网络请求方法