TCP定时器

来源:互联网 发布:sql server 基础语法 编辑:程序博客网 时间:2024/06/06 01:55

tcp定时器
TCP是一个面向连接的,可靠的、流式传输的协议;
为了维护安全和可靠,所以TCP使用了四种定时器;

一、重传定时器:Retransmission Timer
对于TCP发送的数据包,需要等待对端发送ACK才能从内存里面删除,那么如果对端没有发送ACK
怎么办啊?重传呗,在发送数据的同时,再设置一个超时时间(一般设置成2*RRT的时间),如果在
这个超时时间内还没有收到ACK,那么就重传刚才发送的数据;

二、坚持定时器:Persistent Timer
专门为对付零窗口通知而设立的,
坚持定时器在接收到receive window为0的时候启动的,
比如最后一个ACK丢失了的话,那么发送端永远认为接收端的窗口是0,那么就发不了数据了,这个时候
就需要坚持定时器,每隔一段时间(第一个探测包是在收到窗口为0的消息的5秒后)发送一个字节的探测包
给服务端,如果服务端窗口不是0,那么会在ACK里边更新窗口的大小。

三、保活计时器:Keeplive Timer
如果客户端和服务器端长时间没有数据交互,那么需要保活计时器来判断对方是否活着,但是这个很不
实用,因为默认是2个小时没有进行数据交互才探测,时间实在是太长了。若发送了十个探测报文段,
(每75秒发送一个)还没收到响应的话,则终止连接。

四、时间等待计时器:Time_Wait Timer
在连接终止期使用,当TCP关闭连接时,并不认为这个连接就真正关闭了,在时间等待期间,连接还处于
一种中间过度状态,这样就可以使重复的FIN报文段,在到达重点后被丢弃;这个计时器的值通常设置为
一格报文段寿命值期望的两倍;

Time_Wait是主动关闭连接的一端最后进入的状态,而不是直接变成CLOSED的状态,为什么呢?
第一个原因是万一最后一个ACK丢失了,对端会重传的,这个超时之前的重新收到FIN也可以回ACK,
而不是RST;

另一个原因是防止老连接的包在新的连接中出现,影响了新的连接,有这个2MSL,可以在2个MSL
时间内不会建立同样的四元组(源IP,源端口,目的IP,目的端口)的连接,也就是不会出现老的包
影响新的包的问题。

原创粉丝点击