TCP定时器】的更多相关文章

TCP 定时器管理  重传定时器(retransmission timer,Positive ackn. with retransmit) 最重要的定时器 TCP 定时器管理  持续定时器(persistence timer),用来避免如下的死锁( deadlock )发生 接收方发送了一个窗口数为零的确认(窗口更新),告诉发送方等待. 稍后,接收方空出了缓冲,发送更新窗口的数据段,但是,很不幸,该分组丢失啦! 现在,收发双方都在等待对方发送数据段过来,但永远等不到! 死锁产生. 怎样防止死…
http://network.51cto.com/art/201412/459352.htm TCP 是提供可靠的传输层,它使用的方法之一就是确认从另一端收到的数据.但是数据和确认都可能会丢失.TCP 通过在发送时设置一个定时器来解决这个问题.如果当定时器溢出时还没收到确认,它就会重传该数据.关键在于超时和重传策略,即怎样决定超时的时间间隔和如何确定重传的频率. 对于每个连接,TCP 管理着四个不同的定时器:重传定时器.坚持定时器.保活定时器 以及 2MSL 定时器. 重传定时器(2*RT) 为…
前言 在有关TCP的章节中,介绍了四种定时器,它们体现了TCP的可靠性,其中最重要的 就是重传定时器了,剩下的定时器都是为了解决TCP的理解上的一些问题而设置的. 四种定时器: 2MSL定时器,出现在 TCP连接的建立与终止. 重传定时器,出现在 TCP的超时与重传. 坚持定时器. 保活定时器. 相关随笔: TCP连接的建立与终止 TCP的超时与重传 TCP的坚持定时器 TCP的保活定时器 2MSL定时器 出现:TCP连接的建立与终止 教材P183 四次挥手客户端一共有三次状态:应用程序关闭,发…
当TCP主动关闭一端调用了close()来执行连接的完全关闭时会执行以下流程,本端发送FIN给对端,对端回复ACK,本端进入FIN_WAIT_2状态,此时只有对端发送了FIN,本端才会进入TIME_WAIT状态,为了防止对端不发送关闭连接的FIN包给本端,将会在进入FIN_WAIT_2状态时,设置一个FIN_WAIT_2定时器,如果该连接超过一定时限,则进入CLOSE状态: 注意:上述是针对close调用完全关闭连接的情况,shutdown执行半关闭不会启动FIN_WAIT_2定时器: 启动定时…
在用户进程启用了保活定时器的情况下,如果连接超过空闲时间没有数据交互,则保活定时器超时,向对端发送保活探测包,若(1)收到回复则说明对端工作正常,重置定时器等下下次达到空闲时间:(2) 收到其他回复,则确定对端已重启,关闭连接:(3) 超过探测次数仍未得到回复,则认为对端主机已经崩溃,关闭连接: 启动定时器: 用户进程可以通过socket的SO_KEEPALIVE选项来开启或关闭保活定时器探测,TCP最终会调用tcp_set_keepalive来实现保活定期的开启与关闭: int sock_se…
坚持定时器在接收方通告接收窗口为0,阻止发送端继续发送数据时设定. 由于连接接收端的发送窗口通告不可靠(只有数据才会确认,ACK不会确认),如果一个确认丢失了,双方就有可能因为等待对方而使连接终止:接收放等待接收数据(因为它已经向发送方通过了一个非0窗口),而发送方在等待允许它继续发送数据的窗口更新. 为了防止上面的情况,发送方在接收到0窗口通告后,启动一个坚持定时器来周期的发送1字节的数据,以便发现接收方窗口是否已经增大.这些从发送方发出的报文段称为窗口探测: 下面来分析坚持定时器的实现代码:…
TCP在收到数据段但是无需马上确认时设定,如果在超时时间之内有数据要发送到对端,则确认会随着数据一起发送,即捎带ACK,如果达到超时时间则执行定时器回调立即发送ack: 启动定时器: 延迟确认定时器调用inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, xx, xxx)函数进行启动,启动时间点包含以下三个: 1. 建立连接时,客户端的第三次握手可能会被延迟确认,如果有数据要输出.设置了TCP_DEFER_ACCEPT选项或者不在快速确认模式下,则启动延迟确…
注:这部分还没有完全分析透彻,先在此记录,后面回顾的时候再进行补充: 启动定时器: (1) 之前发送的数据段已经得到确认,新发出一个数据段之后设定: (2) 新建连接发送syn之后设定: (3) PMTU探测失败之后设定: (4) 接收方丢弃SACK部分接收的段时设定: 定时器回调函数: 重传定时器超时回调,根据连接控制块中不同的事件类型来分别调用不同的函数进行处理,这里我们只关心ICSK_TIME_RETRANS类型(重传类型),重传细节会继续调用函数tcp_retransmit_timer进…
创建socket时会创建传输控制块,之后调用初始化函数对控制块进行初始化,其中包括对定时器的初始化,tcp会调用tcp_init_xmit_timers函数来初始化这些定时器,本文将详细分析tcp_init_xmit_timers函数: 下面为这种情况的函数调用关系: /** * inet_create * |-->sk->sk_prot->init * |-->tcp_v4_init_sock * |-->tcp_init_sock * |-->tcp_init_xm…
概述 在FIN_WAIT_2收到对端发来的FIN,并回复ACK之后,会进入TIME_WAIT状态,此时添加定时器,定时器超时会将tw控制块从ehash和bhash中删除,并且释放tw控制块: 启动定时器 TIME_WAIT定时器主要通过inet_twsk_schedule函数进行启动: tcp_rcv_state_process函数中,在FIN_WAIT_2状态下,收到对端发来的FIN,并且向对端回复了ACK之后,会调用tcp_time_wait函数进入真正的TIME_WAIT状态,此时会创建T…