问题: 关于tcp的重传定时器?

sky_horse 2003-09-08 04:48:56
tcp的重传定时器在第一次发送时被设置,然后再发送新的数据包时,此时因为重传定时器已经启动,所以不再处理,直到收到包含第一个包的ack后,重传定时器重置。再发送数据包时,再设置新的重传定时器。过程是这样的吗?
如果按上述过程处理,那如果的第一个包发送后,在正常收到ack之前,发送的第二个包丢掉了,同时发送端并没有新的数据包需要传递。那对于第二个包,发送端怎么知道要重传呢?
...全文
364 12 打赏 收藏 转发到动态 举报
写回复
用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回来后,就重置了,要等到第三个包发送的时候才会再设置。

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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