博文

目前显示的是 一月, 2014的博文

2014年1月21日中国互联网DNS瘫痪事件原因分析

1月21日下午,中国互联网大面积瘫痪。约2/3的网站和用户受影响。这么大范围的严重的事故真的让人瞠目结舌,我以为被是美国黑客入侵了。实际上中国伟大的防火墙GFW把所有网络连接都导给了一个法轮功网站。该网站的总裁Bill Xia在接受中国官方媒体环球时报采访时,声称他的公司与此事无关,并发布报告称这是"由於中國國內約50家ISP(網際網絡服務供應商)的域名解析伺服器上的域名遭劫持而引起的"。什么是DNS?DNS的全称叫域名解析系统,是互联网的一个基础设施。它就像一个电话本,你说你要访问哪个网站,它就负责把这个网站的域名(如www.baidu.com)翻译成一串数字告诉你。然后你的电脑就拿着这串数字去呼叫。这串数字,行话叫IP地址。今天下午的事故是,这个电话本坏了。它返回的结果是错的。不管你查询什么域名,它返回的结果都是同一串数字:"65.49.2.178"。而这个IP地址其实是法轮功的。你可以设想下,你打开手机,无论播哪个电话,结果都是法轮功的学员在接听,哈哈哈哈…… 今天下午的中国互联网就是这么搞笑。错误的细节为了搞清楚到底是怎么回事,有必要把事情的经过从头捋一遍。当我打开浏览器,输入www.baidu.com,按下回车之后,正常流程应该是这样:浏览器把www.baidu.com这个字符串发给北京联通的DNS服务器,问它这个到底该对应哪个IP北京联通DNS服务器也不知道哇,于是它就去问root-servers.net:"www.baidu.com的IP是多少?"。root-servers.net我们称为根域名服务器,在全球有13组,每组很多台,它们是整个互联网的域名系统的老大,中央常委!root-servers.net说:"你去问我下属,gtld-servers.net。"于是北京联通DNS服务器去问gtld-servers.net:"www.baidu.com的IP是多少?",gtld-servers.net说:"你去问dns.baidu.com,这是百度的域名服务器,它负责管这个"。于是北京联通DNS服务器去问dns.baidu.com:"www.baidu.com的IP是多少?" dns.baidu.com说:"…

工作与价值观

你工作是为了什么?这个问题看起来很哲学,但其实每个人心中都有答案。。我曾有个台湾同事,很活泼、可爱的小姑娘。她的爱好就是环球旅游。她说,工作对她的意义就在于,工作所带来的收入能让她在这个城市自给自足,想呆多久就呆多久。等觉得够了,就换下一个城市。她的护照在全球大多数国家都免签,她这种生活让我们很羡慕。证明并提升自己的能力,以达到更高的生活状态。我觉得我自己很牛B,但这不够,我得去证明它。所以我得加入一个团队,做出切切实实的产品,用工作体现我的价值。我在工作中所做的一切是为了让自己变得更强,更了不起。我跟公司之间像是一场交易,你给我钱、给我学习的环境,我在提升自己的同时,也给你创造产品和利润。一旦我觉得自己止步不前、学不到新东西,我就会离开。因为我才20多岁,不能过一天算一天的混日子。当一个人的工作能力不再提升,他的薪水也就不会再涨。所以提升自己的能力,比起赚更多钱,是更基础的事情。实践自己的价值观。昨天我看到一篇新文章,"Value is created by doing" ,刷新了我的想法。 作者Sam Altman毕业于斯坦福,曾是一家价值几千万美金的创业公司的初创人和CEO。他们创业时抱有这样一个观点:我做这件事只是因为我信它,从用户需求、市场环境、技术成熟度等等考虑后认为这件事情一定能成,就算我不做,别人也会做。就算我失败了,别人也会成功。不管最终我是做成了还是做败了,总之我做了一件"对"的事情。 用户需求体现了我工作的价值,而正是每日的工作中选择"做"什么与"不做"什么时,体现并实践了我的个人价值观。比如你能容忍编译器里上千个警告吗?满篇的copy-paste的代码?明明是个C++程序员但是却被迫在写python?变量名居然还是中文的!抬头一看,这些与你所选择的事业相比,其实都微不足道。以上三个选择,并非是递进的关系,而是相斥的。你只能选一个作主菜,剩下两个作饭后甜点。比如,很多人都在想,等我赚了足够多的钱,生活有基本保障,然后就可以自由的追逐自己的梦想。这绝对是一句谎话。谁知道你需要多少钱?当你终于赚够了500万在北京买了一套房,你还会想再赚500万把爸妈也接过来。当你终于娶了媳妇生了孩子上了户口,媳妇还会抱怨为什么别人家都在忙着给孩子找学区、凑赞助费、上占坑班,而你却每…

The exit(3) function and destructors

本文主要探讨一下Linux下exit函数是怎么实现的,以及C++中的全局对象的析构函数是如何注册到exit函数的执行过程中。
exit(3)函数的声明及实现 C语言标准库中的exit(3)函数用于终止当前进程。
Linux为例,main函数是被glibc的LIBC_START_MAIN函数调用。LIBC_START_MAIN内部大概是这样:
result = main (argc, argv, __environ MAIN_AUXVEC_PARAM); exit (result); 在main函数返回后立刻调用exit函数。而exit函数中会处理那些析构函数。下面是glibc中exit函数的实现:
void exit (int status) { __run_exit_handlers (status, &__exit_funcs, true); } __exit_funcs是个全局变量。它是一个链表,
类型声明在stdlib/cxa_atexit.h:
struct exit_function_list { struct exit_function_list *next; size_t idx; struct exit_function fns[32]; }; 变量定义在stdlib/cxa_atexit.c:
static struct exit_function_list initial; struct exit_function_list *__exit_funcs = &initial; 这个链表稍有点复杂。它是把exit_function每32个组成一个块,然后把这些块用单向链表串起来。这个链表的头指针是__exit_funcs。每当要构造一个新块(exit_function_list对象)时,它总是被插入在这个链表的头部。往每个exit_function_list里写入function时,是按照index 0、1、2、3这样的方式顺序写入。idx代表下一个空闲位的index,所以它的初始值是0,每写入一个function就加1。如果idx等于sizeof (fns)/sizeof (fns[0]),就代表写满了,得申请要给新的exit_function_list插在头部。
在exit函数中…

域名随机大小写导致libevent2的异步DNS解析失败

libevent内置的异步DNS解析器采用了一种叫做DNS-0x20 encoding的hacking手段来防止DNS投毒攻击。但是这种做法是有问题的,在某些环境下会导致DNS解析全部失败。DNS协议对域名大小写的规定数据库中,域名应该是不分大小写的。DNS协议的RFC标准是http://tools.ietf.org/html/rfc1034。在它的3.5节中特别有一段话"Note that while upper and lower case letters are allowed in domain names, no significance is attached to the case. That is, two names with the same spelling but different case are to be treated as if identical."DNS答复中,应保持域名大小写不变。DNS消息有三种类型 请求、答复、更新。请求包中域名是怎样的大小写,答复包中也应该保持一致。例如,我要查www.baidU.com,那收到的答复消息中域名也应该是www.baidU.com,而不是www.baidu.com或www.Baidu.com。而且在数据库中,www.baidU.com、www.baidu.com和www.Baidu.com应该是同一条记录。实际上,有些DNS Server并不遵守标准。下面是我做的实验。我在我的windows 7上用nslookup www.Baidu.com 202.106.0.20向联通的DNS(202.106.0.20)发起了请求对www.Baidu.com的查询请求,并用wireshark抓取来往的包。请求:000000020100000100000000000003777777.............www 001005426169647503636f 6d 0000010001.Baidu.com.....答复:000000028000000100010000000003777777.............www 001005626169647503636f 6d 0000010001 c0 .baidu.com......00200c 00010001000001…

chrome对代理服务器的支持情况

今天我调查了一下chrome浏览器对proxy的支持情况。目前总体来说它支持两大类协议:socks和http。其中socks下面又分为socks4、socks4a、socks5。而http下面又分为http、https、spdy。我想将来应该还会有quic和http/2.0。解析代理服务器协议配置的函数在 http://src.chromium.org/svn/trunk/src/net/proxy/proxy_server.cc 文件中。对于URL格式的代理设置,如 --proxy-server=https://www.google.com:443http:// 开头的就是普通的httphttps:// 开头的就尝试走https,然后根据握手时得到的扩展信息,来考虑是否用SPDY。socks:// 或socks5:// 开头的就是socks5socks4://开头的就是socks4。quic:// 开头的是quic。(见GetSchemeFromURIInternal函数)socks4和socks4a的主要区别在于socks4不支持远程域名解析(remote resolver)。这是一个非常重要的功能,比如在中国,DNS应答是会被干扰和伪造的。但是chrome并没有明确的表明支持socks4a协议,并且,chrome对于所有的socks协议,都不支持任何形式的身份验证。当使用socks4时,chrome只有在本地DNS解析失败的情况下才会切换至socks4a。这个见socks_client_socket.cc:DoResolveHostComplete()。关于握手开销:http大于socks4大于socks5。socks4建立新连接的时候,需要1个round trip的握手工作。相比而下,socks5建立新连接的时候,需要2个round trip的握手工作。http需要一个round trip,因为chrome不会主动记住哪个http proxy server需要身份验证。它会首先发一个普通的http proxy请求过去,不带auth信息,等server返回407之后,再发送带Proxy-Authorization header的请求过去。但是如果http代理服务器支持"Proxy-Connection:keep-alive"则chrome…

凤凰男与美国梦 -- Gatsby读后感

我觉得The Great Gatsby就是一本讲"美国梦"如何破灭的书。什么是美国梦?"美国梦"不是移民梦,也不是富国强军梦、民族复兴梦,美国梦是指,一个贫民区的孩子,如何通过自己的努力奋斗,迈入中上层。 比如, 一个叫Rey Ramos的人,西班牙人后裔,生于纽约南布朗克斯区,他家周围的年轻人进监狱的比上高中的还多。但是他通过努力学习,进入了哈佛医学院,毕业后在纽约成为了一名医生(年薪几十万美元),与他中学时的恋人Maiysha结了婚。他的个人经历被NBS、纽约时报等美国主流媒体广泛报道。这是10-20年刚刚发生的很真实的事情,这就是最最典型的"美国梦"。Gatsby的故事同样发生在纽约,他从交不起学费的穷光蛋到天天摆流水席的亿万富翁,他就是那个年代的美国梦的代表。为什么说Gatsby了不起(Great)?有人评论说,Gatsby's power to transform his dreams into reality is what makes him "great"。比如,最后一章中Gatsby的那个每日清单,让很多人竞相模仿。Rise from bed … … … … …. 6.00 A.M.
Dumbbell exercise and wall-scaling … … 6.15-6.30 A.M.
Study electricity, etc … … … … 7.15-8.15 A.M.
Work … … … … … … … 8.30-4.30 P.M.
Baseball and sports … … … …. 4.30-5.00 P.M.
Practice elocution, poise and how to attain it 5.00-6.00 P.M.
Study needed inventions … … …. . 7.00-9.00 P.M.No wasting time at Shafters or ..
No more smoking or chewing
Bath every other day
Read one improving book or magazine per week
Save $ 5. 00 [crossed out] $ 3. 00…