Browsed by
月度归档: 2014年5月

TCP 的那些事儿(下)

TCP 的那些事儿(下)

这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP的协议头、状态机、数据重传中的东西。但是TCP要解决一个很大的事,那就是要在一个网络根据不同的情况来动态调整自己的发包的速度,小则让自己的连接更稳定,大则让整个网络更稳定。在你阅读下篇之前,你需要做好准备,本篇文章有好些算法和策略,可能会引发你的各种思考,让你的大脑分配很多内存和计算资源,所以,不适合在厕所中阅读。

TCP的RTT算法

从前面的TCP重传机制我们知道Timeout的设置对于重传非常重要。

  • 设长了,重发就慢,丢了老半天才重发,没有效率,性能差;
  • 设短了,会导致可能并没有丢就重发。于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。

而且,这个超时时间在不同的网络的情况下,根本没有办法设置一个死的值。只能动态地设置。 为了动态地设置,TCP引入了RTT——Round Trip Time,也就是一个数据包从发出去到回来的时间。这样发送端就大约知道需要多少的时间,从而可以方便地设置Timeout——RTO(Retransmission TimeOut),以让我们的重传机制更高效。 听起来似乎很简单,好像就是在发送端发包时记下t0,然后接收端再把这个ack回来时再记一个t1,于是RTT = t1 – t0。没那么简单,这只是一个采样,不能代表普遍情况。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (105 人打了分,平均分: 4.70 )
Loading...
TCP 的那些事儿(上)

TCP 的那些事儿(上)

TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,我还是推荐你去看W.Richard Stevens的《TCP/IP 详解 卷1:协议》(当然,你也可以去读一下RFC793以及后面N多的RFC)。另外,本文我会使用英文术语,这样方便你通过这些英文关键词来查找相关的技术文档。

之所以想写这篇文章,目的有三个,

  • 一个是想锻炼一下自己是否可以用简单的篇幅把这么复杂的TCP协议描清楚的能力。
  • 另一个是觉得现在的好多程序员基本上不会认认真真地读本书,喜欢快餐文化,所以,希望这篇快餐文章可以让你对TCP这个古典技术有所了解,并能体会到软件设计中的种种难处。并且你可以从中有一些软件设计上的收获。
  • 最重要的希望这些基础知识可以让你搞清很多以前一些似是而非的东西,并且你能意识到基础的重要。

所以,本文不会面面俱到,只是对TCP协议、算法和原理的科普。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (133 人打了分,平均分: 4.80 )
Loading...
「我只是认真」聊聊工匠情怀

「我只是认真」聊聊工匠情怀

(感谢网友 @Hesey小纯纯 投稿  博客 | 原文链接

老罗的Smartisan T1手机发布会很多人应该都看了,发布会的最后老罗凝视着自己的工匠自画像,半晌没说话,随后转过身,慢慢离开舞台,屏幕下方只留下一句话:

我不是为了输赢,我就是认真。

这一瞬间让我想起93年「狮城舌战」的主角蒋昌建,在「人性本善还是人性本恶」的总结陈词最后,以顾城的名句,「黑夜给了我黑色的眼睛,我却用它寻找光明」,把整个辩论赛的氛围推向高潮。

而老罗的这句话,和这句话背后的工匠背景,却以另外一种无声的却震人心魄的力量,敲打着每一个在场的,或是观看着整个发布会的观众的心绪。

「工匠情怀」,我深有体会,就像我在 面向GC的Java编程 一文中所提到的:

优秀程序员的价值,不在于其所掌握的几招屠龙之术,而是在细节中见真著。

如果我们可以一次把事情做对,并且做好,在允许的范围内尽可能追求卓越,为什么不去做呢?

追求卓越,追求完美,追求细节的极致。小时候看到那些修表匠,握着一个小螺丝刀,或是看着电工,用烙铁沾着锡和松香,在那一小寸的世界里,把坏了的地方修好,那种专注的眼神,觉得很厉害。

现在再去回想那些工匠工作的场景,越发觉得钦佩。在我老家有一家刻章的店,在我上幼儿园的时候就已经在那开了很多年了。前段时间需要刻一个章,发现那家店还在,于是走进去,门口坐着一个老人,我确实记不得当年是不是他,不过看这岁数八九不离十。我以前在别的地方刻的章,都是在电脑里设计完图案后,激光刻蚀。但那次老人却是用的手刻,我着实惊呆了。只看他拿出一块红色的印底,右手持着刻刀,开始一下一下地刻着。虽然老人连话都不怎么说得清了,但是工作时那专注的神情,和精湛的手艺,以及最后成品那比机器更完美的效果,着实让我心里非常动容。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (82 人打了分,平均分: 4.32 )
Loading...
面向GC的Java编程

面向GC的Java编程

(感谢网友 @Hesey小纯纯 投稿  博客 | 原文链接

Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题。以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,就交给GC来做吧!甚至有人说,如果在编程过程中频繁考虑内存问题,是一种退化,这些事情应该交给编译器,交给虚拟机来解决。

这话其实也没有太大问题,的确,大部分场景下关心内存、GC的问题,显得有点“杞人忧天”了,高老爷说过:

过早优化是万恶之源。

但另一方面,什么才是“过早优化”?

If we could do things right for the first time, why not?

事实上JVM的内存模型( JMM )理应是Java程序员的基础知识,处理过几次JVM线上内存问题之后就会很明显感受到,很多系统问题,都是内存问题。

对JVM内存结构感兴趣的同学可以看下 浅析Java虚拟机结构与机制 这篇文章,本文就不再赘述了,本文也并不关注具体的GC算法,相关的文章汗牛充栋,随时可查。

另外,不要指望GC优化的这些技巧,可以对应用性能有成倍的提高,特别是对I/O密集型的应用,或是实际落在YoungGC上的优化,可能效果只是帮你减少那么一点YoungGC的频率。

但我认为,优秀程序员的价值,不在于其所掌握的几招屠龙之术,而是在细节中见真著,就像前面说的,如果我们可以一次把事情做对,并且做好,在允许的范围内尽可能追求卓越,为什么不去做呢?

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (43 人打了分,平均分: 4.02 )
Loading...