TCP重传定时器

本文深入探讨了TCP协议中的重传机制,通过分析Linux内核源代码,了解当TCP连接出现异常时,如何决定关闭连接或是执行数据包的重传操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍linux内核中TCP的重传定时器机制:用到的源代码是2.6.38
在一个tcp连接中,如果一方过了rto时间内都没收到对方的ACK,会触发重传并调用tcp_write_timer定时器处理函数
其中RTO表示重传时间,RTO是动态计算的,需要考虑到当前的重传次数。
tcp_write_timer调用tcp_retransmit_timer重传处理函数,后者会调用tcp_write_timeout判断重传次数是否超过最大次数(默认12次,约9分钟)

是的话关闭当前连接,否则重传一个skb,代码如下

static void tcp_write_timer(unsigned long data)
{
	struct sock *sk = (struct sock *)data;
	struct inet_connection_sock *icsk = inet_csk(sk);
	int event;

	bh_lock_sock(sk);				//加锁,防止其他下部分任务同时执行
	if (sock_owned_by_user(sk)) {	//sock结构被用户进程锁住,暂时放弃并重设定时器(HZ / 20)秒后再执行:HZ是时钟中断每秒发生的次数
		/* Try again later */
		sk_reset_timer(sk, &icsk->icsk_retransmit_timer, jiffies + (HZ / 20));
		goto out_unlock;
	}

	if (sk->sk_state == TCP_CLOSE || !icsk->icsk_pending)	//关闭了或者定时器处理函数还没初始化
		goto out;

	if (time_after(icsk->icsk_timeout, jiffies)) {			//还没到时间呢
		sk_reset_timer(sk, &icsk->icsk_retransmit_timer, icsk->icsk_timeout);
		goto out;
	}

	event = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值