Blog

book:妄想的悖论:人性中自我欺骗的力量

Content #

“结婚前要睁大眼睛——结婚后要睁一只眼闭一只眼。”——本杰明·富兰克林

人们之所以执着于错误的信念,其中一个原因就是自我欺骗有时可以起到帮助作用——它能使我们实现有用的社会、心理及生物学意义上的目标。有着错误的信念并不总是意味着愚昧、病态或是邪恶。

判断心理治疗结果最后是好是坏,不是看医生用了哪种疗法,而是看医生与患者之间是否建立起了信任。

Latency and IOPS

Content #

假定单独的IO请求需要的Latency为10ms,理论上讲1秒钟里磁盘可接受100个IO请求。这么计算的前提是这100个请求是依次发过来的。

在磁盘处理某个请求的过程中,再来新的IO请求,那它只能等待,等待的时间也要算入Latency。现实中应用程序的IO请求会是随机的,因此,即使磁盘能够在 10ms中处理掉单个的IO请求,但从应用程序来看单个IO的Latency会超过10ms。

如果增加Read I/O队列,那么平均Latency会增加,IOPS也会增加。

How is that possible? How can a disk drive suddenly do more random IOPs at the cost of latency? The trick lies in that the storage subsystem can be smart and look at the queue and then order the I/Os in such a way that the actual access pattern to disk will be more serialised. So a disk can serve more IOPS/s at the cost of an increase in average latency. Depending on the achieved latency and the performance requirements of the application layer, this can be acceptable or not.

...

没有任何对恶行的悔改之心

Content #

陀思妥耶夫斯基在鄂木斯克监狱的几年成了他一生的转折点。他在这里每天和最粗鲁最野蛮的普通老百姓面对面,这让他认为自己获得了对俄罗斯灵魂深处的特殊洞见。“不管怎样,这段时间没有白费,”他在1854年写给弟弟的信中说,“我已经认识了俄国,或者至少说认识了她的子民。我可以说,也许没有几个人像我这样了解他们。”陀思妥耶夫斯基从同犯的身上看到人性堕落的程度,这使他摆脱自己过去作为知识分子对人民内心善良与完美的幻想。在这个混杂着强盗与杀人犯的渣滓窝中,他看不到任何人性的尊严——只有贪婪与欺骗、残忍暴力与醉生梦死,以及对他这个绅士的敌意。而这其中最让人绝望的,就像他在《死屋手记》(1862)中所描述的,是这里没有任何对恶行的悔改之心。

我已经说过,几年以来,我不曾在这些人中间看见过丝毫忏悔的迹象,也没有看见他们对自己的罪行有一点点痛心疾首的表示。而他们的大多数人在内心里还认为自己是清白无辜的哩。这是事实。当然,虚荣心、不好的榜样、无法无天、虚伪的羞愧等,在很大程度是成为这一切的原因。从另一方面说,谁能够说他彻底洞察这班堕落的人们的内心世界,并了解了他们隐藏在内心深处为世人所不知的奥秘呢?但是,经过这段漫长的岁月,本来是能够发现、觉察、捕捉到这些人心灵中的某种足以证实他们内心烦恼和悲哀的特征的。但是并没有这样做,根本就没有这样做。是啊,罪行似乎不能单从犯罪构成的事实这一现成的观点来加以理解,犯罪的哲理要比人们所想象的复杂得多一些。

这种人类内心的黑暗面成为陀思妥耶夫斯基的灵感来源,他那些充斥着谋杀与偷盗的后西伯利亚小说,第一部就是《罪与罚》(1866)。

From #

娜塔莎之舞:俄罗斯文化史

俄罗斯套娃跟俄国传统文化毫无关系

Content #

和今天人们普遍抱有的观点相反,俄罗斯套娃跟俄国传统文化毫无关系。这是接到马蒙托夫委托仿制日本嵌套玩偶的订单后,马柳金凭空想象出来的设计。他构思了一个筒形身材红脸蛋的农村姑娘,胳膊里抱着一只鸡。每个更小的娃娃都描绘俄国农村生活的一个方面,而中间最小的部分是一个俄罗斯风格的襁褓包着的娃娃。19世纪90年代这一设计风靡了整个俄国,每年全国出产数以百万计的套娃。从那时候起,套娃开始被人们误认为是俄国传统文化的象征。

From #

娜塔莎之舞:俄罗斯文化史

Nagle算法

Content #

仔细看图1和图2( 延迟确认(Delayed Acknowledgment)),会发现每个SSH Request都是52字节,这表明它只包含了一个加密的字符。虽然在图1的12号到18 号包之间的100毫秒里(还不到一个往返时间),我一共输入了7个字符,但这些字符也被逐个打成小包了。能不能设计一个缓冲机制,把一个往返时间里生成的小数据收集起来,合并成一个大包呢?

Nagle算法就实现了这个功能。这个算法的原理是:在发出去的数据还没有被确认之前,假如又有小数据生成,那就把小数据收集起来,凑满一个MSS或者等收到确认后再发送。

下图是启用Nagle之后的新实验,第一个包把输入的第一个字符发出去了。在收到确认包之前的150毫秒里,又输入6个字符。这6个字符并没有被逐个发送,而是被收集起来,等收到2 号包之后,从3 号包里一起发送。这就是为什么3号包携带的数据长度是312字节。 和延迟确认一样,Nagle 也没有直接提高性能,启用它的作用只是提高传输效率,减轻网络负担。在某些场合,比如和延迟确认一起使用时甚至会降低性能。

From #

Wireshark网络分析就这么简单

延迟确认(Delayed Acknowledgment)

Content #

先在Putty上缓慢地输入3个字符“j”,每次按键的间隔在300毫秒以上,这时候 Wireshark抓到了前9个包。接着我快速敲击键盘,Wireshark又抓了后面的包, Wireshark截屏如图所示。 前3个包的解说如下。客户端:“我想给你发个加密后的字符‘j’。”服务器:“我收到字符‘j’了,你可以把它显示出来。”客户端:“知道了。”接下来的4、5、6号包,以及7、8、9号包也是一样的情况我的客户端10.32.200.43放在上海,而服务器10.32.23.55位于悉尼,它们之间的往返时间大概是150毫秒。由于这些包是在客户端收集的,所以1号包和2号包相差150毫秒是正常现象。奇怪的是客户端收到2号包之后,竟然等待了大约200 毫秒才发出3号包。本来是1毫秒之内可以完成的事,为什么要等这么久呢?再看看5号和6号之间,以及8号和9号之间,也是大概相差200毫秒。

这其实就是TCP处理交互式场景的策略之一,称为延迟确认。该策略的原理是这样的:如果收到一个包之后暂时没什么数据要发给对方,那就延迟一段时间(在 Windows上默认为200毫秒)再确认。假如在这段时间里恰好有数据要发送,那确认信息和数据就可以在一个包里发出去了。第12号包就恰好符合这个策略,客户端收到11号包之后,等了41毫秒左右时我又输入一个字符。结果这个字符和对11 号包的确认信息就一起装在12号包里了。

延迟确认并没有直接提高性能,它只是减少了部分确认包,减轻了网络负担。有时候延迟确认反而会影响性能。微软的 KB 328890 提供了关闭延迟确认的步骤。我在另一台客户端10.32.200.131上实施这些步骤后,结果如图所示,果然不到1 毫秒就发确认了(参见6号包和7号包的时间差)。

From #

Wireshark网络分析就这么简单

DNS放大攻击

Content #

下面是在执行“dig ANY isc.org”(解析isc.org的所有信息)时抓的包,可见 6号包发出去的请求只有25字节(见图底部的Length:25): 而11号包收到的回复却能达到3111字节(见下图底部的Length 3111),竟然放大了124倍。 假如在 6 号包里伪造一个想要攻击的源地址,那该地址就会莫名收到 DNS服务器3111字节的回复。利用这个放大效应,黑客只要控制少量电脑就能把一个大网站拖垮了。

From #

Wireshark网络分析就这么简单

DNS的循环工作(round-robin)模式

Content #

DNS中有两个叫“Isilon-Cluster”的同名 A 记录,分别对应着 IP 地址 10.32.106.51 和10.32.106.52。当连续执行两次“nslookup Isilon-Cluster.nas.com”时,抓到的网络包如图所示。

两次返回的 IP 地址是一样的,但顺序却是相反的。如果执行第三次nslookup,结果又会跟第一次一样,这就是DNS的循环工作(round-robin)模式。

这个特性可以广泛应用于负载均衡。比如某个网站有10台Web服务器,管理员就可以在DNS里创建10个同名记录指向这些服务器的IP。由于不同客户端查到的结果顺序不同,而且一般会选用结果中的第一个IP,所以大量客户端就会被均衡地分配到10台Web服务器上。

From #

Wireshark网络分析就这么简单