社区
通信技术
帖子详情
问题: 关于tcp的重传定时器?
sky_horse
2003-09-08 04:48:56
tcp的重传定时器在第一次发送时被设置,然后再发送新的数据包时,此时因为重传定时器已经启动,所以不再处理,直到收到包含第一个包的ack后,重传定时器重置。再发送数据包时,再设置新的重传定时器。过程是这样的吗?
如果按上述过程处理,那如果的第一个包发送后,在正常收到ack之前,发送的第二个包丢掉了,同时发送端并没有新的数据包需要传递。那对于第二个包,发送端怎么知道要重传呢?
...全文
364
12
打赏
收藏
问题: 关于tcp的重传定时器?
tcp的重传定时器在第一次发送时被设置,然后再发送新的数据包时,此时因为重传定时器已经启动,所以不再处理,直到收到包含第一个包的ack后,重传定时器重置。再发送数据包时,再设置新的重传定时器。过程是这样的吗? 如果按上述过程处理,那如果的第一个包发送后,在正常收到ack之前,发送的第二个包丢掉了,同时发送端并没有新的数据包需要传递。那对于第二个包,发送端怎么知道要重传呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jefflin
2003-09-10
打赏
举报
回复
并不是重置重传定时器.
你有一个误区,就是好像进了TIMER后,所有的事情都应该处理,其实在TIMER里,每个处理都是有条件的,只有满足了它的条件它才会处理.就好像if(...){}, else if(...){},else{},
sky_horse
2003-09-10
打赏
举报
回复
现在假设的就是第二个包丢了,那么接收方的延时ack定时器会超时,接收方就会发送第一个包的ack给发送方。发送方在接收到第一个包的ack后,就重置了重传定时器。那第二个包如何知道要重传呢?
jefflin
2003-09-10
打赏
举报
回复
接收方一般都会延迟发送ACK,就是为与数据一起发送出去,计时器中有一个对ACK delay的处理,像你所说的,只接收到两个包时,由计时器去处理.
sky_horse
2003-09-10
打赏
举报
回复
呵呵,所以我才会提问啊。
不过大多数时候,发送的包不止两个,假设发送了第三个包了,此时接收方会发送一个重复的ack(第一个包的ack),发送方在接收到三次重复ack时(需要继续发送第四,第五个包),就会重传第二个包(快速重传算法)。
我的问题就是假设只发送两个包的时候,怎么办?
jefflin
2003-09-10
打赏
举报
回复
楼主所说的好像并不是每个TCP segment都要计时,如是那样的话,TCP怎么能保持它的可靠性呢,这好像违背了TCP协议.
sky_horse
2003-09-10
打赏
举报
回复
谢谢楼上的参与讨论。
不过tcp的定时器并不是象以上所说的,在定时器到时以后,去查找队列中的每个包是否超时,具体去参考tcp协议详解。
实际上tcp协议栈里面只有两个定时器,一个500ms的慢定时器,一个200ms的快定时器,所谓每个tcp连接总共有7个定时器,它是计数器而已。定时器到时,它就遍历所有的tcp连接控制块,然后给相关的定时器减一个计数,结果为零就触发该定时器事件。
如果那样查找每个包是否超时,那样协议栈的速度一定很慢。
计时不是为了超时用的,是为了计算rtt值。只有设置重传定时器的那个包才会计时。
jefflin
2003-09-10
打赏
举报
回复
每一发送的数据包会记录在一个队列中,等到接收到ACK后就会从队列中删除,这是滑动窗口协议.
每一个包都有记录了发送的时间,虽然TCP只有一个定时器,但它是查找在队列中的每个数据包是否超时,所以没必要每个包都对应一个定时器.
sky_horse
2003-09-10
打赏
举报
回复
怎么会不重置呢?这个定时器是标识第一个包的,第一个包的ack已经收到了。
重置重传定时器只是让它等于零,以便以后再发送包的时候,就又可以使用了。
smart790225
2003-09-09
打赏
举报
回复
TCP重传定时(RTO)是根据发送方和接收方的往返时延(RTT)衡量的(在[PA00]中有说明)。为了防止有时候数据段的发送只是延迟了以下,而并未丢失所造成的无意义的重发,RTO保守地定为最小1秒。因此,在网路空闲时,它可以保证网络不需要过长的超时就可以尽可能地发现数据段的丢失。然而,如果没有足够的应答数据段(ACK)从接收端返回,快速重传算法就不会启动,这种情况发生在拥塞控制窗口太小或者在一个窗口内丢失了很多的数据段。例如,假设有一个大小为3的拥塞控制窗口(cwnd)。如果一个数据段被网络丢弃,那么在发送端最多返回两个应答数据段。由于需要三个重复的应答数据段,快速恢复算法才能被触发运行,所以将会发生超时,重发丢失的数据段。
sky_horse
2003-09-09
打赏
举报
回复
多谢楼上的答复!
但是我的问题是这样的:
对于每个tcp连接,协议栈是只有一个重传定时器的,具体可见tcp协议详解卷二。在发送第一个包的时候,重传定时器被设置,在发送第二个包时,因为已经设置了,所以第二个包怎么做超时重传呢?在收到第一个包的ack时,重传定时器会重置,在发第三个包时,此时会再设置重传定时器。但如果我没有第三个包发送呢?第二个包又丢掉呢?那发送端怎么知道丢了,如果有别的包继续发送,那么因为第二个包丢了,会导致对端传送重复的ack回来,三次重复ack后快速重传。但如果没有新的数据发送呢?
smart790225
2003-09-09
打赏
举报
回复
假设主机A和主机B之间有一个TCP连接,当主机A发送一个包含数据的消息段时,它启动一个定时器后就等待主机B对这个消息段的响应。主机A在发送消息段之后期待在一定的时间范围里接收到B的响应,这个期待的时间称为传输等待时间(timeout)。如果在等待时间之内没有接收到确认消息段,主机A就重发包含数据的消息段。当主机B接收到一个消息段时,延迟若干分之一秒(通常200 ms)之后就回送一个确认消息段。如果主机B接收到的消息段是无顺序的,TCP执行软件会重新整理使数据流符合主机A的发送顺序,它也会去掉重复的消息段。
sky_horse
2003-09-09
打赏
举报
回复
重传定时器的时延是根据RTT动态变化的,我不太明白的是使用定时器的方法,不牵涉到快速重传算法。书上说的是,第一次发包的时候,设置了重传定时器,发第二个包的时候,假设此时第一个包的ack还没有回来,因为重传定时器已经启动,所以第二个包是不会计时的。我想知道的是,假设我只发两个包,第二个包丢了,tcp用什么方式保证重传。后面没有更多的包,所以不存在依靠三次重复ack,引发快速恢复,而第二个包也没有重传定时器来保证它超时重传,因为定时器被第一个包使用用了,在第一个包的ack回来后,就重置了,要等到第三个包发送的时候才会再设置。
TCP
四种
定时器
(
重传
定时器
,坚持计时器,保活
定时器
,时间等待计时器)
主要介绍了
TCP
四种
定时器
,
重传
定时器
,坚持计时器,保活
定时器
,时间等待计时器的相关资料,需要的朋友可以参考下
Qt编写网络调试助手(
TCP
客户端+
TCP
服务端+UDP服务端)终极版
时隔半年,对网络调试助手工具进行所有代码重写,这次目录结果整齐的一逼,代码整齐的一逼,非常完善了,打死也不再改版了。这次真的打死也不再改版了。 旧版本1:http://www.qtcn.org/bbs/read-htm-tid-55540.html 旧版本2:http://www.qtcn.org/bbs/read-htm-tid-62636.html 基本功能: 1:16进制数据和ASCII数据收发。 2:
定时器
自动发送。 3:自动从配置文件加载最后一次的界面设置。 4:自动从配置文件加载数据发送下拉框的数据。可以将经常使用的数据填写在send.txt中。 5:可启用设备模拟回复,当收到某个数据时,模拟设备自动回复数据。对应数据格式填写在device.txt中。 6:可对单个在线连接发送数据,也可勾选全部进行发送。 7:支持多个客户端连接并发。 8:采用单线程。 9:四种模式,
tcp
服务器、
tcp
客户端、udp服务器、udp客户端。
TCP
的
定时器
系列 — 超时
重传
定时器
主要内容:
TCP
定时器
开篇,超时
重传
定时器
、ER延迟
定时器
、PTO
定时器
的实现。 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd Q:一条
TCP
连接会使用多少个
定时器
呢? A:目前的答案是9个: 超时
重传
定时器
,持续
定时器
,ER延迟
定时器
,PTO
定时器
,ACK延迟
定时器
, SYNACK
定时器
,保活
定时器
,FIN_WAIT2
定时器
,CL
TCP
定时器
之超时
重传
定时器
每条
TCP
连接都会维护一个超时
重传
定时器
,该
定时器
是
TCP
保证可靠性的一个非常重要的手段,一旦该
定时器
超时,那么就会
重传
还未收到ACK的报文。这篇笔记就来看看该
定时器
相关的代码实现。 1. 相关数据结构 struct inet_connection_sock { ... //icsk_retransmit_timer的超时时刻,jiffies超过该值时
定时器
超时 unsigned long ...
TCP
重传
定时器
//本文主要介绍linux内核中
TCP
的
重传
定时器
机制:用到的源代码是2.6.38 //一个
tcp
连接中,如果一方过了rto时间内都没收到对方的ACK,会触发
重传
并调用
tcp
_write_timer
定时器
处理函数 //其中RTO表示
重传
时间,RTO是动态计算的,需要考虑到当前的
重传
次数。 //
tcp
_write_timer调用
tcp
_retransmit_timer
重传
处理函数,后者会调用t
通信技术
4,356
社区成员
28,926
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章