TCP重传定时器的疑问?

wh593296781 2011-03-13 12:06:15
大家好啊,TCP的重传机制要求每个TCP连接都会维持一个 重传定时器,我有一个疑问就是,假如在一个窗口中,在t1时刻发送0,1,2三个报文段,发送0的时候启动重传定时器,在T2时刻,我收到了0的ACK,但是还没有收到1,2的ACK,此时是否要重置定时器,如果不重置,怎么来判断1,2报文的超时呢?谢谢了
...全文
281 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh593296781 2011-03-15
  • 打赏
  • 举报
回复
如果窗口允许发送,会发送的把
jwybobo2007 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wh593296781 的回复:]
昨天又看了一下linux下TCP的實現,其中关键有一个函数:如下
C/C++ code
static void tcp_event_new_data_sent(struct sock *sk, struct sk_buff *skb)
{
struct tcp_sock *tp = tcp_sk(sk);
unsigned int prior_packets = tp->packets_out……
[/Quote]
楼主研究比较深入
不同操作系统实现可能都有所不同,我没研究过实现代码

有2个报文段没被确认掉,应该不会再发下一个
wh593296781 2011-03-15
  • 打赏
  • 举报
回复
昨天又看了一下linux下TCP的實現,其中关键有一个函数:如下
static void tcp_event_new_data_sent(struct sock *sk, struct sk_buff *skb)
{
struct tcp_sock *tp = tcp_sk(sk);
unsigned int prior_packets = tp->packets_out;
tcp_advance_send_head(sk, skb);
tp->snd_nxt = TCP_SKB_CB(skb)->end_seq;
/* Don't override Nagle indefinately with F-RTO */
if (tp->frto_counter == 2)
tp->frto_counter = 3;
//关键在这里tp->packets_out += tcp_skb_pcount(skb);
if (!prior_packets)
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
}
可以看到只有当prior_packets为0时才会重启定时器,而prior_packets则是发送未确认的段的个数,也就是说如果
发送了很多段,如果前面的段没有确认,那么后面发送的时候不会重启这个定时器.
如果这样的话 在t0时刻启动定时器,发送0,1,2三个报文段,t1时刻收到了对0的ACK,此时我们可以向网络中增加一个报文段3,因为1.2还没有被确认所以根据上面的情况,不会重启定时器,此时定时器的RTO不变,那么怎么来判断3的超时呢,因为定时器从启动到现在已经经过了t1-t0的时间,所以再经过RTO-(t1-t0)就会超时,如果经过RTO-(t1-t0)超时了,那么3算不算超时呢?
wh593296781 2011-03-14
  • 打赏
  • 举报
回复
Nagle 好像是只能有一个小的分段啊
jwybobo2007 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wh593296781 的回复:]
Nagle 好像是只能有一个小的分段啊
[/Quote]

小的分段指的就是分组报文
arong1234 2011-03-13
  • 打赏
  • 举报
回复
感觉它是双重机制,一是每次接收报文重置定时器,通过定时器来判断,二是在发送时看过去有多少个报文没接收到ack,如果超过在过去的报文中如果前面第n个没收到回执,就重发,这个n可能是个范围

不过具体怎么做,估计要看具体代码,不同的系统的实现都可能稍微不同
jwybobo2007 2011-03-13
  • 打赏
  • 举报
回复
应该是会重置定时器,定时器是用在希望接收到ACK的时候,你另外两个报文还没得到ACK,那应该是重置才对,而且根据Nagle算法,只允许一个分组未被确认,也就是说在两个报文没有得到ACK的时候,它也不会再发送新的报文了

另外超时定时器其实用的是同一个,它每间隔200,500ms(好像是这个时间)触发一次,所以所有的定时都是靠这个定时器来进行计数的
wh593296781 2011-03-13
  • 打赏
  • 举报
回复
补充一下,查了一下资料,有看了一些网友的回答,似乎是有这样一个描述,就是TCP的定时器是对一个窗口中所有数据来说的,就是说必须等到一个窗口中所有的数据都确认了才会重置定时器,不知道这样描述是否可以?谢谢

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧