任何事情都需要一定的节拍来驱动,最典型的就是时钟,它规定了什么时间要干什么事。在古代没有精确的机械时钟时,人们使用太阳,月亮来计时,因此就像年,四季,月,日,时辰,都是时钟的体现,另外像生肖,星座也一样,其实,任何时钟都是一系列的周期轮回组成的。在农业民族看来,时钟始终都是精确的,这也就是为什么中国人总结出了二十四节气的原因,古代的中国是没有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双边加速的方案。
上面说的这些可能在程序员们看来不是很直观反而觉得很抽象(你每天的三点一线也是时钟驱动的),然而这些和操作系统里面的时钟中断没有什么本质的区别。但是,上面我们说的这些,不管是儒略历,二十四节气,还是操作系统的时钟中断,都是外部时钟,比如太阳,地球运行轨道,主板上的时钟源等等,还有一种时钟是自时钟,也就是说不需要外部时钟源,完全靠内部的激励机制来推进事件的进展。
说到内部时钟,我还是禁不住提一下海洋民族,像古代的腓尼基人,希腊人这样的,一旦航行于大海(虽然只是地中海,但在那个年代就是大海了),便丢失了太阳这个最大的时钟源,因为海上世界变幻莫测,不像陆地上那般固定,海上没有“太阳黄经位于...”这种,海上基本随机地在风暴和静谧之间切换,因此没有外部的时钟可以依靠,必须靠自己的判断来决定下一步做什么!这就是自时钟!
下面说点程序员们懂的东西,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双边加速的方案。