什么是TCP的混合型自时钟

任何事情都需要一定的节拍来驱动,最典型的就是时钟,它规定了什么时间要干什么事。在古代没有精确的机械时钟时,人们使用太阳,月亮来计时,因此就像年,四季,月,日,时辰,都是时钟的体现,另外像生肖,星座也一样,其实,任何时钟都是一系列的周期轮回组成的。在农业民族看来,时钟始终都是精确的,这也就是为什么中国人总结出了二十四节气的原因,古代的中国是没有12月的,这个是古罗马的历法,也叫凯撒历法,翻译为儒略历,中国人更近一步,一共24个节气,这些节气规定了x的时候要播种,y的时候要收割,z的时候要除草...

        上面说的这些可能在程序员们看来不是很直观反而觉得很抽象(你每天的三点一线也是时钟驱动的),然而这些和操作系统里面的时钟中断没有什么本质的区别。但是,上面我们说的这些,不管是儒略历,二十四节气,还是操作系统的时钟中断,都是外部时钟,比如太阳,地球运行轨道,主板上的时钟源等等,还有一种时钟是自时钟,也就是说不需要外部时钟源,完全靠内部的激励机制来推进事件的进展。
        说到内部时钟,我还是禁不住提一下海洋民族,像古代的腓尼基人,希腊人这样的,一旦航行于大海(虽然只是地中海,但在那个年代就是大海了),便丢失了太阳这个最大的时钟源,因为海上世界变幻莫测,不像陆地上那般固定,海上没有“太阳黄经位于...”这种,海上基本随机地在风暴和静谧之间切换,因此没有外部的时钟可以依靠,必须靠自己的判断来决定下一步做什么!这就是自时钟!
        下面说点程序员们懂的东西,TCP作为一个端到端额协议,对中间的网络完全不知情,因此便和海洋民族一样(海洋民族不知道风暴的规律,不晓得气压和热辐射的关系,不懂副热带高压,热带气旋的生成规律,但是他们可以就这些现象做出恰当的反应,最终创造了现代的我们生活其中的文明!),被动的受制于拥塞和通畅,因此它也不得不靠自时钟来推进数据段的发送。
        TCP在设计之初就是一个端到端的协议,后来加入的ECN我感觉是个错误。因此TCP的发送基本上依靠ACK,以ACK来驱动发送,然而并不是全部。即便是海洋民族靠海吃海,有时候也得看看天,不是吗?

我们知道TCP数据的发送时机,基本分为两大类:
1.应用程序有数据要发(调用send函数),且窗口允许的时候;
2.ACK到来,发送队列有数据待发送,且发送窗口仍有空余。

因此,要想保持TCP流的源源不断发送,就一定要保证有源源不断的ACK流,如果没有ACK流,上述的第1点也是无法保证的,因为总会耗尽窗口,能让窗口滑动的只有ACK!但是你能保证ACK流吗?谁都不能!因为ACK流完全不受控,对端可能不发,缓发,也可能发了ACK但丢失,甚至,你发的数据都丢了,无法触发对端的ACK发送...因此仅仅靠自时钟是不够的,必须有一个外部时钟!这也就是说,要想保证TCP流被发送,必须有一个外部时钟,在大多数的实现中,这就是RTO定时器!这是绝对少不了的,你可以改变RTO的行为,比如不让它将窗口降低,不重启慢启动,但是必须有这么一个定时器,并且你必须在这个定时器里面做点什么!
        以上就是TCP混合型自时钟的概念,它靠ACK自时钟驱动数据的发送,但是仍然需要一个外部的超时时钟。

关于游戏《祖玛》和双边加速
玩过《祖玛》吗?很简单的一个游戏,很多人不屑玩它,但是却可以在里面找到一个TCP双边加速的方案。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值