31 December 2010

one note for the past 2010

2010
留作纪念的一句话

没有永远的朋友,没有永远的敌人

08 December 2010

linux net stack

from Internet 协议简介

虽然对于网络的正式介绍一般都参考了 OSI(Open Systems Interconnection)模型,但是本文对 Linux 中基本网络栈的介绍分为四层的 Internet 模型(如图 1 所示)。


这个栈的最底部是链路层。链路层是指提供对物理层访问的设备驱动程序,这可以是各种介质,例如串口链路或以太网设备。链路层上面是网络层,它负责将报文定向到目标位置。再上一层称为传输层,负责端到端的通信(例如,在一台主机内部)。尽管网络层负责管理主机之间的通信,但是传输层需要负责管理主机内部各端之间的通信。最后一层是应用层,它通常是一个语义层,能够理解要传输的数据。例如,超文本传输协议(HTTP)就负责传输服务器和客户机之间对 Web 内容的请求与响应。
实际来说,网络栈的各个层次有一些更为人所熟知的名字。在链路层上,可以找到以太网,这是最常用的一种高速介质。更早的链路层协议包括一些串口协 议,例如 SLIP(Serial Line Internet Protocol)、CSLIP(Compressed SLIP)和PPP(Point-to-Point Protocol)。最常见的网络层协议是 IP(Internet Protocol),但是网络层中还存在一些满足其他需求的协议,例如 ICMP(Internet Control Message Protocol)和ARP( Address Resolution Protocol)。在传输层上是 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)。最后,应用层中包含很多大家都非常熟悉的协议,包括标准的 Web 协议 HTTP 和电子邮件协议 SMTP(Simple Mail Transfer Protocol)。
核心网络架构
现在继续了解 Linux 网络栈的架构以及如何实现这种 Internet 模型。图 2 提供了 Linux 网络栈的高级视图。最上面是用户空间层,或称为应用层,其中定义了网络栈的用户。底部是物理设备,提供了对网络的连接能力(串口或诸如以太网之类的高速网络)。中间是内核空间,即网络子系统,也是本文介绍的重点。流经网络栈内部的是 socket 缓冲区(sk_buffs),它负责在源和汇点之间传递报文数据。您很快就将看到 sk_buff 的结构。



首先,让我们来快速浏览一下 Linux 网络子系统的核心元素,后续章节中会更详细进行介绍。顶部(请参阅图 2)是系统调用接口。它简单地为用户空间的应用程序提供了一种访问内核网络子系统的方法。位于其下面的是一个协议无关层,它提供了一种通用方法来使用底层 传输层协议。然后是实际协议,在 Linux 中包括内嵌的协议 TCP、UDP,当然还有 IP。然后是另外一个协议无关层,提供了与各个设备驱动程序通信的通用接口,最下面是设备驱动程序本身。
系统调用接口
系统调用接口可以从两个角度进行描述。用户发起网络调用时,通过系统调用接口进入内核的过程应该是多路的。最后调用 ./net/socket.c 中的 sys_socketcall 结束该过程,然后进一步将调用分路发送到指定目标。系统调用接口的另一种描述是使用普通文件操作作为网络 I/O。例如,典型的读写操作可以在网络 socket 上执行(socket 使用一个文件描述符表示,与一个普通文件一样)。因此,尽管有很多操作是网络专用的(使用 socket 调用创建一个 socket,使用 connect 调用连接一个收信方,等等),但是也有一些标准的文件操作可以应用于网络对象,就像操作普通文件一样。最后,系统调用接口提供了在用户空间应用程序和内核之间转移控制的方法。
协议无关接口
socket 层是一个协议无关接口,它提供了一组通用函数来支持各种不同协议。socket 层不但可以支持典型的 TCP 和 UDP 协议,而且还可以支持 IP、裸以太网和其他传输协议,例如 SCTP(Stream Control Transmission Protocol)。
通过网络栈进行的通信都需要对 socket 进行操作。Linux 中的 socket 结构是 struct sock,这个结构是在 linux/include/net/sock.h 中定义的。这个巨大的结构中包含了特定 socket 所需要的所有状态信息,其中包括 socket 所使用的特定协议和在 socket 上可以执行的一些操作。
网络子系统可以通过一个定义了自己功能的特殊结构来了解可用协议。每个协议都维护了一个名为 proto 的结构(可以在 linux/include/net/sock.h 中找到)。这个结构定义了可以在从 socket 层到传输层中执行特定的 socket 操作(例如,如何创建一个 socket,如何使用 socket 建立一个连接,如何关闭一个 socket 等等)。
网络协议
网络协议这一节对一些可用的特定网络协议作出了定义(例如 TCP、UDP 等)。它们都是在 linux/net/ipv4/af_inet.c 文件中一个名为 inet_init 的函数中进行初始化的(因为 TCP 和 UDP 都是 inet 簇协议的一部分)。 inet_init 函数使用 proto_register 函数来注册每个内嵌协议。这个函数是在 linux/net/core/sock.c 中定义的,除了可以将这个协议添加到活动协议列表中之外,如果需要,该函数还可以选择分配一到多个 slab 缓存。

通过 linux/net/ipv4/ 目录中 udp.c 和 raw.c 文件中的 proto 接口,您可以了解各个协议是如何标识自己的。这些协议接口每个都按照类型和协议映射到 inetsw_array,该数组将内嵌协议与操作映射到一起。inetsw_array 结构及其关系如图 3 所示。最初,会调用 inet_init 中的 inet_register_protosw 将这个数组中的每个协议都初始化为 inetsw。函数 inet_init 也会对各个 inet 模块进行初始化,例如 ARP、ICMP 和 IP 模块,以及 TCP 和 UDP 模块。



注意在 图 3 中,proto 结构定义了传输特有的方法,而 proto_ops 结构则定义了通用的 socket 方法。可以通过调用 inet_register_protosw 将其他协议加入到 inetsw 协议中。例如,SCTP 就是通过调用 linux/net/sctp/protocol.c 中的 sctp_init 加入其中的。

socket 中的数据移动是使用一个所谓的 socket 缓冲区(sk_buff)的核心结构实现的。sk_buff 中包含了报文数据,以及涉及协议栈中多个层次的状态数据。所发送或接收的每个报文都是使用一个 sk_buff 表示的。sk_buff 结构是在 linux/include/linux/skbuff.h 中定义的,如图 4 所示。






如图所示,多个 sk_buff 可以针对某个给定连接链接在一起。每个 sk_buff 都在设备结构(net_device)中标识报文发送的目的地,或者接收报文的来源地。由于每个报文都是使用一个 sk_buff 表示的,因此报文头都可以通过一组指针(thiphmac[用于 Media Access Control 或者 MAC 头])方便地进行定位。由于 sk_buff 是 socket 数据管理的中心,因此创建了很多支持函数来对它们进行管理。其中有些函数用于创建和销毁 sk_buff 结构,或对它进行克隆或排队管理。

针对给定的 socket,Socket 缓冲区可以链接在一起,这样可以包含众多信息,包括到协议头的链接、时间戳(报文是何时发送或接收的),以及与这个报文相关的设备。
设备无关接口
协议层下面是另外一个无关接口层,它将协议与具有很多各种不同功能的硬件设备连接在一起。这一层提供了一组通用函数供底层网络设备驱动程序使用,让它们可以对高层协议栈进行操作。
首先,设备驱动程序可能会通过调用 register_netdeviceunregister_netdevice 在内核中进行注册或注销。调用者首先填写 net_device 结构,然后传递这个结构进行注册。内核调用它的 init 函数(如果定义了这种函数),然后执行一组健全性检查,并创建一个 sysfs 条目,然后将新设备添加到设备列表中(内核中的活动设备链表)。在 linux/include/linux/netdevice.h 中可以找到这个 net_device 结构。这些函数都是在 linux/net/core/dev.c 中实现的。
要从协议层向设备中发送 sk_buff,就需要使用 dev_queue_xmit 函数。这个函数可以对 sk_buff 进行排队,从而由底层设备驱动程序进行最终传输(使用 sk_buff 中引用的 net_devicesk_buff->dev 所定义的网络设备)。dev 结构中包含了一个名为 hard_start_xmit 的方法,其中保存有发起 sk_buff 传输所使用的驱动程序函数。
报文的接收通常是使用 netif_rx 执行的。当底层设备驱动程序接收一个报文(包含在所分配的 sk_buff 中)时,就会通过调用 netif_rxsk_buff 上传至网络层。然后,这个函数通过 netif_rx_schedulesk_buff 在上层协议队列中进行排队,供以后进行处理。可以在 linux/net/core/dev.c 中找到 dev_queue_xmitnetif_rx 函数。
最近,内核中引入了一种新的应用程序编程接口(NAPI),该接口允许驱动程序与设备无关层(dev)进行交互。有些驱动程序使用的是 NAPI,但是大多数驱动程序仍然在使用老式的帧接收接口(比例大约是 6 比 1)。NAPI 在高负载的情况下可以产生更好的性能,它避免了为每个传入的帧都产生中断。
设备驱动程序
网络栈底部是负责管理物理网络设备的设备驱动程序。例如,包串口使用的 SLIP 驱动程序以及以太网设备使用的以太网驱动程序都是这一层的设备。
在进行初始化时,设备驱动程序会分配一个 net_device 结构,然后使用必须的程序对其进行初始化。这些程序中有一个是 dev->hard_start_xmit,它定义了上层应该如何对 sk_buff 排队进行传输。这个程序的参数为 sk_buff。这个函数的操作取决于底层硬件,但是通常 sk_buff 所描述的报文都会被移动到硬件环或队列中。就像是设备无关层中所描述的一样,对于 NAPI 兼容的网络驱动程序来说,帧的接收使用了 netif_rxnetif_receive_skb 接口。NAPI 驱动程序会对底层硬件的能力进行一些限制。

设备驱动程序在 dev 结构中配置好自己的接口之后,调用 register_netdevice 便可以使用该配置。在 linux/drivers/net 中可以找出网络设备专用的驱动程序。
展望
Linux 源代码是学习有关大多数设备类型的设备驱动程序设计最佳方法,包括网络设备驱动程序。除非需要一种新协议,否则网络栈中的其余代码都是通用的,都会非常有用。即 使现在,TCP(用于流协议)或 UDP(用于基于消息的协议)的实现都可以作为开始新开发有用模块使用。

Lee's advice

在《李嘉诚传》中给年青人提出了53条人生忠告:

1.我17岁就开始做做批发的推销员,就更加体会到挣钱的不容易、生活的艰辛了。人家做8个小时,我就做16个小时。

2.我们的社会中没有大学文凭、白手起家而终成大业的人不计其数,其中的优秀企业家群体更是引人注目。他们通过自己的活动为社会作贡献,社会也回报他们以崇高荣誉和巨额财富。

3.精明的商家可以将商业意识渗透到生活的每一件事中去,甚至是一举手一投足。充满商业细胞的商人,赚钱可以是无处不在、无时不在。

4.我凡事必有充分的准备然后才去做。一向以来,做生意处理事情都是如此。例如天文台说天气很好,但我常常问我自己,如5分钟后宣布有台风,我会怎样,在香港做生意,亦要保持这种心理准备。

5.精明的商人只有嗅觉敏锐才能将商业情报作用发挥到极致,那种感觉迟钝、闭门自锁的公司老板常常会无所作为。

6.我从不间断读新科技、新知识的书籍,不至因为不了解新讯息而和时代潮流脱节。

7.即使本来有一百的力量足以成事,但我要储足二百的力量去攻,而不是随便去赌一赌。

8.扩张中不忘谨慎,谨慎中不忘扩张。……我讲求的是在稳健与进取中取得平衡。船要行得快,但面对风浪一定要捱得住。

9.好的时候不要看得太好,坏的时候不要看得太坏。最重要的是要有远见,杀鸡取卵的方式是短视的行为。

10.不必再有丝毫犹豫,竞争既搏命,更是斗智斗勇。倘若连这点勇气都没有,谈何在商场立脚,超越置地?

11.对人诚恳,做事负责,“多结善缘”,自然多得人的帮助。淡泊明志,随遇而安,不作非分之想,心境安泰,必少许多失意之苦。

12.在逆境的时候,你要问自己是否有足够的条件。当我自己逆境的时候,我认为我够!因为我勤奋、节俭、有毅力,我肯求知及肯建立一个信誉。

13.做生意一定要同打球一样,若第一杆打得不好的话,在打第二杆时,心更要保持镇定及有计划,这并不是表示这个会输。就好比是做生意一样,有高有低,身处逆境时,你先要镇定考虑如何应付。

14.我表面谦虚,其实很骄傲,别人天天保持现状,而自己老想着一直爬上去,所以当我做生意时,就警惕自己,若我继续有这个骄傲的心,迟早有一天是会碰壁的。

15.当生意更上一层楼的时候,绝不可有贪心,更不能贪得无厌。

16.任何一种行业,如有一窝蜂的趋势,过度发展,就会造成摧残。

17.随时留意身边有无生意可做,才会抓住时机。着手越快越好。遇到不寻常的事发生时立即想到赚钱,这是生意人应该具备的素质。

18.人才缺乏,要建国图强,亦徒成虚愿。反之,资源匮乏的国家,若人才鼎盛,善于开源节流,则自可克服各种困难,而使国势蒸蒸日上。从历史上看,资源贫乏之国不一定衰弱,可为明证。

19.假如今日,如果没有那么多人替我办事,我就算有三头六臂,也没有办法应付那么多的事情,所以成就事业最关键的是要有人能够帮助你,乐意跟你工作,这就是我的哲学。

20.你们不要老提我,我算什么超人,是大家同心协力的结果。我身边有300员虎将,其中100人是外国人,200人是年富力强的香港人。

21.长江取名基于长江不择细流的道理,因为你要有这样豁达的胸襟,然后你才可以容纳细流??没有小的支流,又怎能成长江?

22.在我心目中,不理你是什么样的肤色,不理你是什么样的国籍,只要你对公司有贡献,忠诚、肯做事、有归属感,即有长期的打算,我就会帮他慢慢地经过一个时期而成为核心分子,这是我公司一向的政策。

23.一个总司令,是一个集团军的统帅,拿起机关枪总不会胜过机关枪手,走到炮兵队操作大炮也不如炮兵。但作为集团军的总司令不要管这些,只要懂得运用战略便可以,所以整个组织十分重要。

24.人才取之不尽,用之不竭。你对人好,人家对你好是自然的,世界上任何人都可以成为你的核心人物。

25.知人善任,大多数人都会有部分的长处,部分的短处,各尽所能,各得所需,以量才而用为原则。

26.可以毫不夸张地说,一个大企业就像一个大家庭,每一个员工都是家庭的一分子。就凭他们对整个家庭的巨大贡献,他们也实在应该取其所得,只有反过来说,是员工养活了整个公司,公司应该多谢他们都对。

27.不为五斗米折腰的人,在哪里都有。你千万别伤害别人的尊严,尊严是非常脆弱的,经不起任何的伤害。

28.在我的企业内,人员的流失及跳槽率很低,并且从没出现过工潮。最主要的是员工有归属感,万众一心。

29.有钱大家赚,利润大家分享,这样才有人愿意合作。假如拿10%的股份是公正的,拿11%也可以,但是如果只拿9%的股份,就会财源滚滚来。

30.我老是在说一句话,亲人并不一定就是亲信。一个人你要跟他相处,日子久了,你觉得他的思路跟你一样是正面的,那你就应该可以信任他;你交给他的每一项重要工作,他都会做,这个人就可以做你的亲信。

31.人要去求生意就比较难,生意跑来找你,你就容易做,那如何才能让生意来找你?那就要靠朋友。如何结交朋友?那就要善待他人,充分考虑到对方的利益。

32.有金钱之外的思想,保留一点自己值得自傲的地方,人生活得更加有意义。

33.以往我是百分之九十九是教孩子做的道理,现在有时会与他们谈生意……但约三分之一谈生意,三分之二教他们做人的道理。因为世情才是大学问。

34.坏人固然要防备,但坏人毕竟是少数,人不能因噎废食,不能为了防备极少数坏人连朋友也拒之门外。更重要的是,为了防备坏人的猜疑,算计别人,必然会使自己成为孤家寡人,,既没有了朋友,也失去了事业上的合作者,最终只能落个失败的下场。

35.那些私下忠告我们,指出我们错误的人,才是真正的朋友。

36.商业合作必须有三大前提:一是双方必须有可以合作的利益,二是必须有可以合作的意愿,三是双方必须有共享共荣的打算。此三者缺一不可。

37.不义而富且贵,于我如浮动。是我的钱,一块钱掉在地上我都会去捡。不是我的,一千万块钱送到我家门口我都不会要。我赚的钱每一毛钱都可以公开,就是说,不是不明白赚来的钱。

38.我觉得,顾及对方的利益是最重要的,不能把目光仅仅局限在自己的利上,两者是相辅相成的,自己舍得让利,让对方得利,最终还是会给自己带来较大的利益。占小便宜的不会有朋友,这是我小的时候我母亲就告诉给我的道理,经商也是这样。

39.一个人一旦失信于人一次,别人下次再也不愿意和他交往或发生贸易往来了。别人宁愿去找信用可靠的人,也不愿意再找他,因为他的不守信用可能会生出许多麻烦来。

40.如果取得别人的信任,你就必须做出承诺,一经承诺之后,便要负责到底,即使中途有困难,也要坚守诺言。

41.我生平最高兴的,就是我答应帮助人家去做的事,自己不仅是完成了,而且比他们要求的做得更好,当完成这些信诺时,那种兴奋的感觉是难以形容的……

42.世情才是学问。世界上每一个人都精明,要令大家信服并喜欢不容易?

43.注重自己的名声,努力工作、与人为善、遵守诺言,这样对你们的事业非常有帮助。

44.讲信用,够朋友。这么多年来,差不多到今天为止,任何一个国家的人,任何一个省份的中国人,跟我做伙伴的,合作之后都成为好朋友,从来没有一件事闹过不开心,这一点是我引以为荣的事。

45.我个人对生活一无所求,吃住都十分简单,上天给我的恩赐,我并没多要财产的奢求。如果此生能做多点对人类、民族、国家长治久安有益的事,我是乐此不疲的。

46.保持低调,才能避免树大招风,才能避免成为别人进攻的靶子。如果你不过分显示自己,就不会招惹别人的敌意,别人也就无法捕捉你的虚实。

47.如果单以金钱来算,我在香港第六、七名还排不上,我这样说是有事实根据的。但我认为,富有的人要看他是怎么做。照我现在的做法我为自己内心感到富足,这是肯定的。

48.做人最要紧的,是让人由衷地喜欢你,敬佩你本人,而不是你的财力,也不是表面上让人听你的。

49.绝不同意为了成功而不择手段,刻薄成家,理无久享。

50.一个有使命感的企业家,应该努力坚持走一条正途,这样我相信大家一定可以得到不同程度的成就。

51. 要成为一位成功的领导者,不单要努力,更要听取别人的意见,要有忍耐力,提出自己意见前,更要考虑别人的意见,最重要的是创出新颖的意念……作为一个领 袖,第一最重要的是“责已以严,待人以宽”;第二。要令他人肯为自己办事,并有归属感。机构大必须依靠组织,在二三十人的企业,领袖走在最前端便最成功。 当规模扩大至几百人,领袖还是要去参与工作,但不一定是走在前面的第一人。要大便要靠组织,否则,便迟早会撞板,这样的例子很多,百多年的银行也一朝崩 溃。

52.未攻之前一定先要守,每一个政策的实施之前都必须做到这一点。当我着手进攻的时候,我要确信,有超过百分之一百的能力。换句话说,即使本来有一百的力量足以成事,但我要储足二百的力量才去攻,而不是随便去赌一赌。

53.与其到头来收拾残局,甚至做成蚀本生意,倒不如当时理智克制一些。

05 December 2010

notes

市场是对的。投资者是否应该为了盈利而改变自己,没有人知道。

三种元素成就流行,浅薄而流行的故事,难忘的主人公,精彩的场景。
对应与投资,持续的好记录,财富精英的激励故事,阶段性明星神奇表现。

形象的重要性。丰富的文化。坚固的实力。优质的人脉。瞩目的成就。

两人为了一面幡争论,一人说是幡在动,另一人说是风在动。老者听到后说,其实是你们的心在动。

未来是不确定的。就如微观世界是概率的世界。

短期而言,股价对于企业基本面的波动是不确定的,但企业的基本面是确定的。
长期而言,股价对于企业的反应是确定的,但企业的基本面却会改变。

人性总是希望自己会碰到大美女,入超级潜力股,哪怕其实是头恐龙。另一方面,对于普通的收益并不太珍惜,总想寻找大美女,结果连普通的收益都得不到。

信任和传奇是最佳的宣传。比如把彼得林奇就是公司一手促成的传奇,将投资理念顺道推广。

这个世界上别人是靠不住的,只有靠自己。

拥有生蛋的鸡还是鸡蛋,每个人的利益目标是不同的。