tcp/ip 19 经受时延的确认。。

来源:互联网 发布:mysql 默认开启事件 编辑:程序博客网 时间:2024/05/21 08:10

原话:通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将 ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带 ACK)。绝大多数实现采用的时延为 200 ms,也就是说, TCP将以最大200 ms 的时延等待是否有数据一起发送。

TCP使用了一个 200 ms的定时器,该定时器以相对于内核引导的 200 ms固定时间溢出。由于将要确认的数据是随机到达的(在时刻 16.4, 474.3, 831.1等), TCP在内核的 200 ms定时器的下一次溢出时得到通知。这有可能是将来1~200 ms中的任何一刻。

意思是:tcp不可能这样子干活,比如一个包接收到了,好,那从接收到这个包开始计时200ms,然后若期间有数据传回去,则立刻携带ack一起发送,如果到了200ms还没有,那就只能传送一个不携带数据的ack了,也称经受时延的ack。因为数据传过来的时间是随机的,如果为每一个包都搞一个计时器,那工作量就太大了。

所以,tcp会在内核搞一个定时器,200ms的。数据包收到之后,如果下一个定时器溢出(计算到200ms)的时候,还没有什么数据要跟着ack一起传过去的话,那就只能单独发送一个ack了(书上也称其为一个经受时延的ack,说实话,这个翻译感觉一般)

配图

原话:如果观察s v r 4为产生所收到的每个字符的回显所使用的时间,则这些时间分别为 1 6 . 5、1 6 . 3、 1 6 . 5、 1 6 . 4和17.3 ms。由于这个时间小于 200 ms,因此我们在另一端从来没有观察到一个经受时延的A C K。在经受时延的定时器溢出前总是有数据需要发送(如果有一个约为 16 ms等待时间越过了内核的 200 ms时钟滴答的边界,则仍可以看到一个经受时延的 A C K。在本例中我们一个也没有看到)。

那么这个图中svr4为啥没经受时延的ack就好理解了,说明在接收到bsdi发送的包,到svr4有数据发送的这段时间中,svr4的200ms定时器没有溢出,因为这段时间理论上小于16ms。要让200ms的定时器恰好在这段时间触发(刚好数到200ms),几率还是有点低的。

那要如何才能让svr4发送一个确认时延的ack呢?就是svr4收到包,等着有数据捎带ack一起传到bsdi的时候,刚好!数据还没来,定时器200ms来了!这时候就会单独发给bsdi一个ack,这个包里没有什么数据,只有tcp首部带一个ack确认位。

解释完毕,这本书有些翻译看着还挺难懂。

1 0