分类: 系统运维
2011-03-08 16:24:02
光或者电信号的传输是有固定速度的,即近似每秒30万公里(其实远未达到,光在光缆中的传播速率只有20万公里每秒,电信号在电缆中的传播速率则近似21万公里每秒。基本上是光在真空或者空气中速率的三分之二)。如果两点之间距离为1000公里,那么信号传一个来回(传到对端,然后对端给以ACK应答)所耗费的时间就是1000÷300000×2≈6.6ms。什么概念呢?也就是你想把1bit的数据传输到一千公里之外的地方,那么至少你要耗费6.6ms。那么传输10bit、100bit、1Kb、100Mb,需要多长时间呢?首先想到的是,至少比传1bit要慢。到底需要多长时间?来看这个公式:传输来回时间=(数据量÷链路速率×2)+(传输距离÷光速×2)。数据在传输的时候,是首先会被通过编码电路将数据串行化编码然后放到电路或者光路上传输,这个编码速率,就是链路带宽,100Mb/s的带宽与1000Mb/s的带宽,区别就在于后者在单位时间内可以编码相当于前者10倍量的数据,但是不管链路带宽有多少,数据被编码之后,数据在电路上的传输所耗费的时间对各种速率的链路来讲都是一样的,因为传输的时候已经与链路编码速率(带宽)无关了,传输到对方之后,对方还需要解码(所以编码所耗费的时间也要乘以2),同样也是取决于链路带宽。
所以,当两点之间传输距离很近的时候,比如1千米,那么传输时延≈0.0066ms,基本上可以忽略了。所以那个公式变为:传输时间=(数据量÷链路速率)。所以说,链路速率越大,只代表其编码速度越快,而不代表传输速度越快,传输速度是固定的,都是光速。再打个比喻,有一辆长途车,50个人排队上车,排队上车需要120s,汽车行驶需要60000s,50个人排队下车需要120s。50个人被排队送上车,就好比数据被串行编码放到电路上传输,汽车行驶相当于电路信号从一端传递到另一端,50个人被排队下车,就好比对端的解码过程了,然而到此还没有结束,当汽车抵达目的地之后,司机必须在返回出发点进行报信,这就好比TCP协议在收到数据之后发送给源端的ACK应答一样。可以司机空着车跑回去报信(单独发送ACK应答包),也可以在目的端捎带着一些回程客人返回去报信(TCP可以在反向流量中夹带ACK应答信息以提高效率)。但是在容灾系统中,数据总是从源端流向目的端的,或者在灾难回切的时候从目的端流向源端的,总之只有一个方向有实体数据流动,那么此时回程ACK都是独立的ACK应答包(独立ACK包很小所以其编解码所耗费的时间也忽略掉即可)。
另外,一辆汽车能承载的人数是有限的,也就是说,得一趟一趟的拉,这就好比TCP每次所发送的最大数据长度,也就是TCP的滑动窗口长度,TCP得分批把用户数据传送出去,每次的发送量必须小于TCP滑动窗口的长度,每次传输之后均需要对方发送一个ACK(这里不考虑ACK合并等特殊情况)。每批数据虽然到了底层可能被切分,比如TCP的MSS(Max Segment Size)切片,一般等于底层链路的MTU,底层链路再用MTU的值来切片,但是这些底层的切片在被传输到对端之后,并不需要对端底层协议的应答,只有对端的TCP在完整的收到TCP发送的一批数据之后,才会应答。
那么我们来算算在相隔1000千米的两点之间,每秒到底能够传送多少个来回:1000ms÷6.6ms=151个来回。如果按照TCP的典型滑动窗口即16KB来计算的话(每次发送16KB数据然后就等待应答,不考虑延迟应答或者合并应答等特殊情况),那么每秒吞吐量仅为151×16KB=2416KB,也就是2.4MB每秒。
降低不必要的ACK数量,增加滑动窗口,这些都是广域网加速的技术,对传输速率会有一定程度的提高。但是最终解决办法,还是要尽量缩短两地距离,或者开发专用优化的协议了。
chinaunix网友2011-03-27 18:59:27
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com