精华内容
下载资源
问答
  • 近日,应邀为国家电网供电公司的领导干部进行培训,讲座的题目是《细节决定成败,什么决定细节?》与其说是一次讲座,其实更是一种“竞标”,因为对于国网供电公司而言,他们是想通过“讲座比稿”来决定后面的国网...

        近日,应邀为国家电网供电公司的领导干部进行培训,讲座的题目是《细节决定成败,什么决定细节?》与其说是一次讲座,其实更是一种“竞标”,因为对于国网供电公司而言,他们是想通过“讲座比稿”来决定后面的国网班组文化建设的项目交给谁。

        我们看到的《细节决定成败》等大量书籍,都从声称“魔鬼藏在细节中”,但是很多人,只是看到了细节,却没有发现细节中的魔鬼!没有“魔鬼”这一灵魂,所谓的“细节”只是一个海市蜃楼的空壳。

        按照“错层”的思路想来,只有错开表层,才能发现本质。细节肯定是外在表现,那么,到底是什么细节?又是什么决定细节呢?

        “细节决定成败”已经成为一句流行语,我在这里不想批驳这句话,另外提出像什么“战略决定成败”的口号。其实,“细节决定成败”不是一个不容置疑的绝对命题,这句话只不过是充分强调了细节的重要性而已。成败之事,很多时候不是某一个因素能决定的。很多时候,人们并不知道到底是什么决定成败。如果一定要说成败都是由“某某”决定的,发而过于吹毛求疵了。

        在这里,让我们先承认细节的重要性,但是,我想问的是:如果说“细节决定成败”,那么,什么决定细节?即使提出“细节决定成败”的汪中球先生本人,似乎对此也没有深究。但是,这是一个不可不究的问题。

        因为决定细节的决不是细心、严谨、认真等人为因素,对细节的重视与否不是由一个人的性格决定的。从根本上讲,细节是一种贵族精神。

        只有追求并坚持贵族精神的人,才会在细节上下功夫。德国人注重细节、日本人注重细节,是因为他们很早就解决了温饱问题。有更多的时间和精力放在细节的琢磨上。

        中国并不是一个天生粗枝大叶的民族,即使上千年之前出土的很多玉器、青铜器等古董,那种精湛的工艺和繁复的细节依然令我们赞叹。但是,无一例外,这些都是在王宫贵族的墓葬重出土的。普通老百姓使用的器具还是非常粗糙。今天的收藏界中有一个耳熟能详的词:“官窑”。官窑出产的瓷器一般来讲都是非常精美的,因为官窑的产品都是供给王宫贵族统治阶级的,所以,可以不惜金钱和材料,只追求精美。

        从这个意义上讲,细节不是来自性格,而是来自经济条件背后的贵族精神。一个人生活在温饱边缘的人是不会在乎细节的。在乎细节的都是有钱有闲的贵族。哪怕是没落的贵族,但是细节精神却已经渗进骨子里。

        就像“那五”。《那五》是邓友梅先生的一篇小说,表现的是没落清朝贵族那五“倒驴不倒架”的故事。那五没落之后,“穷了仍然有穷的讲究。窝头个儿大了不吃,咸菜切粗了难咽。偶尔吃顿炸酱面,他得把肉馅分去一半,按仿膳的作法单炒一小碟肉末夹烧饼吃。云奶奶用体己钱把衣裳给他赎出来之后,他又恢复了一天三换装的排场。换一回叫云奶奶洗一回,洗一回还要烫一回。稍有点不平整,就皱着眉说:"像牛嘴里嚼过似的,叫人怎么穿哪?”

        这就是细节和贵族精神。老百姓是不会在乎窝头大小、咸菜粗细、衣服平整与否的——有口饭吃就不错了。

        现在很多机关与企业都开始注重细节,但是很多人并不知道细节不是来自细心,而是来自温饱之后的贵族精神。细心的结果是少出错误,而很难提前注意并预先设计好所有的细节。

        让我在此处“长篇”引用一些文字,因为这些关于上海地铁的文字是《细节决定成败》等书籍所津津乐道的:

        上海的地铁一号线是由德国人设计的,看上去并没有什么特别的地方,直到中国人自己设计的二号线投入运营才知道其中有那么多的细节被二号线忽略了。结果二号线运营成本远远高于一号线,似乎至今仍未实现收支平衡。现将我所知的二号线忽略的细节罗列于下,给大家一个参考。

        1。三级台阶地铁一号线的每一个室外出口都不是和地面齐平的,要进入地铁口,必须要踏上三级台阶,然后再往下进入地铁站。不要小看这三级台阶,在下雨天它可阻挡雨水倒灌,从而减轻地铁的防洪压力。事实上一号线内的那些防汛设施几乎从来没有动用过,与之相较地铁二号线曾发生过雨天被淹的惨剧。

    。转弯。地铁一号线的每一个出口都会转一个弯,不会直接通到室外,而二号线显然没有注意到这一点。这一个转弯大大减少了地铁站台和外部的热量交换,从而减轻了空调的压力,使得一号线的电费大大小于二号线。

        3。地面装饰线一号线的站台最外边采用金属装饰,里面又用黑色大理石嵌了一条边,在里面铺设同一色彩地砖。这样的装饰,给予乘客心理上暗示,从而使所有的人都会下意识地站在地砖所在的范围内,和地铁保持了大约50厘米的距离,保证了乘客的安全。而二号线地面全部用同色的地砖铺成,稍不注意就会过于靠近轨道,使得地铁公司不得不安排专门的人员来提醒乘客。

        4。站台宽度一号线的站台比较宽,上下车比较方便,而二号线的站台比较窄,尤其其一二层之间的楼梯比较窄。在高峰时间,显得非常拥挤。较窄的站台,也使乘客无法看清楚对面的本站站牌,容易坐过站。这使得二号线重新装饰了所有的柱子,使每一个站台的柱子都不相同,以方便乘客辨认。但同时二号线也丧失了在柱子上做广告的收入。

        5。小缺口地铁一号线在设计的时候留有站台门,地铁到达的时候,地铁门和站台门会对准,同时打开。没有地铁的时候站台门关闭。这进一步保存了站台的热量,节省电费。同时也保证了旅客的安全,使得旅客根本不可能跳下站台。然而在实际运营的时候,并没有安装站台门,但仍然可以在站台上看到门的导轨,导轨在每一个正对门的地方都留有一个缺口。

        6。其他地铁一号线每一个站台的楼梯、柱子的位置基本上是相同的,这大大减少了设计时候的绘图费用。从德国进口的车子的照明程度的到了精确的测量,当车厢壁上没有悬挂任何东西的时候,其亮度是相当舒适的。而目前由于大量张贴了广告,使得车厢内的照明偏暗。小小一个地铁就又如此多的细节需要掌握,那么学习和引入一种制度呢?又有多少细节需要掌握,又有多少人真正努力去研究和思考这些细节呢?

        不难看出,上文中提到的所有细节都不是细心、认真、严谨就可以做到的。因为这些细节都需要提前考虑到,只有出于人性化、以人为本的思考,才能想到这些“细节”。换句话说,这已经不再是“细节”的问题了,而是一种高瞻远瞩的战略精神在细节方面的表现而已。遗憾的是,很多人只是肯定了这一细节本身,没有去追溯这些细节的来由。

        思考问题,见“树”固然重要,但是见“林”也值得花点心思。用“错位”思维去思考“细节”问题,更容易看到细节背后的本质。

        其实,我们中国人自己设计的地铁为什么存在很多问题?就是因为我们觉得地铁能跑就行了,把交通当成问题的根本,没有考虑到人才是目的。

    这是一种典型的“温饱思维”——能吃饱就不错了。另一方面,我们从来没有修筑地铁的经验,谁能在第一次尝试之前就能预料所有的问题?

        所以这不是表面的细节问题。

        其实,很多例子都能说明:细节不是细心与否的问题,而是一个社会发展程度的问题。只有远离温饱走向小康,只有从“发展中”走向“发达”,只有大家都以人的价值为目的,细节才可以充分被注意到。因为所有细节,从根本上都是一种人性化思维的体现。

        当然,有些细节需要细心,例如绣花、校对。但是,真正想把“细节”提升到“决定成败”的层面上,只凭细心就远远不够了。

        最后,说的极端一点,对“细节”做一个错位解读:细节的反义词不是粗心,而是贫穷。贫穷的状态只能产生温饱主义思维,只有真正尊重人的需求,把每个人都从贫困和温饱的状态下将放出来,真正实现所谓的“共同富裕”,把每一人都当成贵族去尊总,这种人性化的状态才会真正产生细节。

        下面两幅图片,一幅是中国如家等快捷酒店的浴室,另一幅是美国拉斯维加斯豪华五星宾馆的浴室。

    你从里面看到什么细节吗?为什么一家住宿费人民币150,而另一家美元1500?

        这如此巨大的价格差距是是什么细节决定的?

        五年前,我在美国考察,下榻拉斯维加斯的这家酒店,当时对昂贵的费用十分愤慨:觉得美国鬼子真是欺负人,这能有什么啊,竟然这么贵。

        当时正值冬天,我晚上在浴缸洗澡,当我洗完澡,从浴缸出来,伸手去抓浴巾要来擦身体的时候,当我的手抓到浴巾的一刹那,我一下子服了:酒店收我多少钱我都愿意,即使这么贵的费用是“宰我”,我也认了,我也愿意被宰。

        为什么?

        因为大浴巾竟然是热的。

        除了所谓的豪华、精美之外,很少有人能知道,这个浴室最大的“细节”体现在:不锈钢的毛巾架是电加热的。

        也就是说,这个电加热的毛巾架会烤得上面的毛巾处于热乎乎的状态,这样,当客人在沐浴之后,浑身带着水珠哆哆嗦嗦从浴缸出来,一条热乎乎的大浴巾包裹在身上是一种如何温暖的感觉?

        也许对对于快捷酒店而言,你要是问服务员:毛巾为什么不是热的?

        他一定会大吃一惊:啊?毛巾还要热的?什么凉的热的,有毛巾用就不错了。你毛病还不少!

        因为对于一个普通快捷酒店的服务员来讲,他永远不会意识到,客人还有这样的需求。因为穷人是不会意识到超越自己生活水平和观念意识之外的细节的!因为他没有见过贵族的生活。

        所以,决定细节不是细心,而是境界、格局和观念。

        细节体现在对人的尊重上,真正的贵族化的人性化的思维方式,才能真正有细节。自己没有受到过贵族一样的尊重,又怎么知道如何把别人像贵族一样去尊重呢?

        因为在穷人(无论是精神还是物质上)的世界里,是永远没有细节的!一个穷人,再细心,也不会留意到王宫里的那些讲究。

        说远了,对于我们一般人而言,真正细节之间的较量,是一种观念、责任之间的较量,而这种观念、责任之间的较量,又来自于心理期望值之间的较量。

        你做的事,超越了对方的心理期望值,对方就会觉得你有细节——哇,连这个你都想到了!如果没有达到对方的期望值,对方就对觉得你没有细节,这就是为什么很多企业面试的时候,会在走廊的地上放一张废纸,看看哪个应试者会主动拾起来。其实,这就是一种心理期望值的考验。你达不到,我就不愿录取你。

        所以,想用细节打动人,你就必须超越对方的心理期待,多想一步,多提醒自己,提前考虑到对方的心理期望值在哪个层面,能否让自己在某一点上努力超越对方的心理期望值,想到对方都没有想到的事情,才能让对方感到意外的惊喜,只有这样,在对方眼里,你的细节才能决定你的成败!

        以上只是讲座中的一个小“细节”,正是因为我们的观念、意识和考虑的周全程度完全突破了国家电网领导的心理期望值,对方才当场拍板决定让我们中标其班组文化建设的策划项目。

        如果觉得有启发,请分享给更多人的人。

        分享,是互联网思维最有价值的挥霍!只有富人才愿意挥霍,挥霍的多了,你就成了富人。这就是如何成为“富人”这一“细节”背后的“魔鬼”。

        穷人斤斤计较,富人处处分享。

        斤斤计较,最终只得到两斤;处处分享,最终赢得整个世界!


    展开全文
  • 泰勒公式的展开细节解析

    万次阅读 多人点赞 2017-08-05 08:58:22
    我并不赞成这个说法,以霍金为例,它的虚时间模型虽然只是数学上的技巧,但是最终的目标却是为他的有限无界的宇宙几何模型服务,这说明,完成逻辑完整性证明和寻找其意义同等重要,可能后者还会更重要,我没有看到哪...

    上周写完了《《三体》读后思考-泰勒展开/维度打击/黑暗森林》后收到一些邮件,进一步思考了关于泰勒展开的意义。也许我掌握的那些网络技术比如Linux Netfilter,NAT之类,太过底层太过小众,所以大家几乎都是没有感兴趣的,倒是这种科普性质的文章和那些吐槽类的文章,会引发一系列的互动,这对我来讲是好事,因为我喜欢跟人交流技术和思想。

    声明

    本来这篇文章应该添加在《三体》读后感后的“补遗”一节呢,后来觉得太长了,有点喧宾夺主的意思,就单独写了一篇文章。
      其实吧,这篇文章已经跟《三体》小说没有太大的关系了,这纯粹是一篇关于数学的文章,但是由于本文要涉及大量关于“趋势的趋势的趋势”,“走势的走势的走势的走势”,“导数的导数的导数的导数的导数…”,为了保持一致性,我将本文的题目写成了“《三体》读后感的读后感…”,可能后面还有,未完待续!

    第一部分.泰勒展开解释

    很多人对我解释的泰勒展开提出了自己的疑问,这些疑问大致都是对下面的问题表示不解:
    为什么可以从一个单独的点不断求导就可以画出整个函数的曲线?即“一点是如何蕴含整个世界”的。
    诚然,这个问题其实在数学上是及其容易证明的,在定量的角度,随便找出一本讲微积分或者数学分析的书都可以得到令人满意的回答,我在文章《《三体》读后思考-泰勒展开/维度打击/黑暗森林》中也给出了一个简易的推导。然而,在满足了逻辑上的自洽后,我们很多人对一件逻辑上合情合理的事情便有了探索其实际意义的欲望,比如我们会问,它的物理意义是什么,它的几何意义是什么,甚至更基本的,它的意义是什么?就这么问着问着,便似乎有了一点哲学探索的味道,在我看来,这便是最精彩的!
       很多人都看过双截棍表演,但现如今很少有人了解鞭术了,其实你可以把鞭子看成是N趋近于无穷大时的N截棍,玩起来更难。其实我也不是很懂,就是为了解释这个泰勒展开才稍微看了一点关于鞭术的东西,具体来讲,执鞭人手执鞭子在原地只是上下左右按照一定的规则甩鞭,一条很长的鞭子就会整体展现成各种漂亮的曲线,他是怎么做到的?
       当然,从物理上讲,这当然是若干列波从执鞭处向鞭子的另一端传播,传播的过程在不同的点产生了定向的效果,然而似乎不是一个很好的足以让人满意的解释,我们的问题是,那个执鞭人的手需要怎么个动作,才能让鞭子整体上看来是那种效果?
      这个问题我是回答不了,因为我不懂鞭术,身边也没有懂的人,但是这个问题似乎和本文一开始的那个问题讲的是同一回事,即从一个点来蕴含整体的行为。

      我的观点是:既然走势可以让人预测曲线上邻接的下一点的大致位置,那么走势的走势便可以相对精确地预测邻接下一点的具体位置,紧接着,走势的走势的走势便可以告诉人们这种趋势可以延续到什么时候,再继续…这似乎超出了人们的想象力…我们还是用简单的数学来表示吧。我们先从1阶导数,2阶导数,3阶导数的几何意义说起。
      先看1阶导数,我们知道,它是经过曲线上某点的切线的斜率:

    这里写图片描述

    我们来看这个1阶导数可以预测到多远处呢?如果我们仅仅知道该点的坐标以及有这么一个该点的1阶导数的值,我们几乎什么都预测不了,除了知道在该点处有沿着切线向上的趋势之外,这没能为我们画出这个曲线带来帮助,似乎下面的曲线都能满足,然而真正正确的只有一个:

    这里写图片描述

    换句话说,1阶导数只能将邻接的下面的点定位到两个范围中的一个:

    这里写图片描述

    so,我们需要进一步的信息,我们继续求2阶导数,看看能挖掘出什么新玩意儿。
      2阶导数是1阶导数的导数,换句话说,它代表了检测点切线的变化趋势,有了这个趋势,我们是不是可以相对精确地预测邻接的点的位置了呢?我们先看2阶导数的几何意义为何。学过数学的都知道,2阶导数表示了曲线的凸凹,对于凸函数,2阶导数是负数,它表示切线的斜率会越来越小,而对于凹函数,2阶导数是正数,它表示切线的斜率越来越大:

    这里写图片描述

    因此,有了2阶导数,我们对接下来的曲线走势定位就更加精确了,我们可以进一步缩小邻接的点的取值范围:

    这里写图片描述

    具体的坐标由2阶导数的具体值来约束。
      到了这一步,进一步将曲线往前延伸似乎是无望的,因为:

    1.首先,我们不知道代表检测点凸凹性的2阶导数的值在将来会不会逆转,即我们不知道曲线会不会由凸变凹或者由凹变凸;
    2.其次,即便假设函数的凸凹性不变,我们也不知道接下来曲线是越来越凸/凹呢?还是反过来呢?

    毕竟,我们只求得了检测点的1阶和2阶导数,注意,它们都只是一个数字,而不是一个带有自变量的新的函数,所以我们通过1阶导数和2阶导数,得到仅仅是2个值,仅此而已,如果我们能得到关于曲线任意一点的2阶导数的函数表达式,那么我们当然可以预测曲线2阶函数的走势,但在本文中,我不会那么做,我就假设,我们没有这个函数表达式,只有一个检测点的2阶导数的值!怎么办?
      我们继续看3阶导数。在此之前,我必须要澄清一个我的观点。
      我在知乎上查过相关资料,另外还特意请教过一些搞数学的老师或者朋友,得到的解答可能都是从哪个地方看到的一致性解答,说3阶,4阶,5阶…导数这些没有几何意义和物理意义,数学只追求逻辑上的完整,自包容,而不是去追求什么几何意义,物理意义。我并不赞成这个说法,以霍金为例,它的虚时间模型虽然只是数学上的技巧,但是最终的目标却是为他的有限无界的宇宙几何模型服务,这说明,完成逻辑完整性证明和寻找其意义同等重要,可能后者还会更重要,我没有看到哪一个伟大的物理学发现背后仅仅是纯粹的思辨性的数学,不管是牛顿的引力场,还是爱因斯坦的引力场,还是霍金的量子引力,在逻辑严谨性支撑的前脸,都有一个漂亮得体的几何模型作为表象。

      3阶导数不难求,继续对2阶导数表达式求导,然后代入检测点的x值即可,然而3阶导数的意义是什么?其实仔细想想,并不难理解,这正如2阶导数主导1阶导数的变化从而把1阶导数自认为正确的“以直代曲”的直线模拟拉成弯曲的或者凸或者凹的曲线一样,3阶导数同样主导2阶导数的变化,它可以表示“曲线是继续凸下去或者继续凹下去,还是会在某一个x值后逆转,由凸变凹或者由凹变凸”。用语言表示比较苍白难以理解,于是我画个图示:

    这里写图片描述

    好了,有了3阶导数,我们似乎进一步将曲线向前推进了,至少是预测出了一种趋势,然而这个趋势是必然的吗?考虑到一种情况,比如当前检测点的2阶导数值为1,表示曲线在检测点是凹的,而同时3阶导数的值为-1,这表示可能接下来邻接点的2阶导数会比1小一点,最终会变成0甚至负数,这意味着曲线会由凹变凸,即经历一个拐点,但这种预测一定会发生吗?
      不一定!But why?
      虽然当前检测点的3阶导数值为-1,但这并不意味着它会一直保持-1,如果它一直保持-1,那么我们的预测正确,但是如果曲线的3阶导数在该检测点是递增的呢?这意味着会发生下面的情况:
    在曲线从检测点x0开始,2阶导数变为0甚至负数之前,其3阶导数就已经从-1递增到0以上了,这说明虽然曲线的凹性越来越显得不那么凹,有变平变凸的趋势,但这种趋势的趋势越来越弱,还没等曲线变成凸的,这种作用便消失了,曲线将会继续保持凹型发展下去…
      上面的判断简直可以弥补3阶导数的误差,曲线进一步前进,很帅!那么如何判断3阶导数的走势呢?简单,求4阶导数!
    进一步,以上这样发展会持续多久呢?好吧,求5阶导数吧,可以再推进一步。我们对曲线走势的掌握离开检测点随着越来越高阶导数的求解渐行渐远,6阶导数,7阶,8阶,9阶…我们对曲线走势的预测将越来越接近原先的函数。

      我来画一个实际的例子结束讨论:

    这里写图片描述


    这是不是有点像鞭术大师执鞭表演,力道和甩鞭模式从大师的手掌开始沿着鞭体传播,模式的频率越低,影响的越远。除了鞭术,还有双截棍,如果玩双截棍的时候打到了自己,那么一定是哪个导数没有求好,比如4阶导数搞错了…
      在了解了曲线的走势后,剩下的就是用二项式去拟合了。其实,这种二项式叠加的拟合方式并没有什么特殊的含义,只是因为它是可以做到的而已,你同样可以用傅立叶变换的方式将一个函数在频域上展开,因为那也是一种可能的方式。其实任何两个或者多个带有实际效应的表达式叠加在一起,整体而言都会表现出各个叠加体局部的性质,这里重要的是一个纯数学上的技巧,即如何确定二项式的系数,可以肯定的是系数跟各阶导数是相关的,剩下的问题就是待定系数法求解了,这并不是需要赘述的内容。
      综上,在这个待定系数的角度,二项式拟合任何曲线实属凑出来的,因为凑出来的二项式叠加表达式的各阶导数值恰好等于原函数的各阶导数值。
      然而这并不能让不断寻找意义的人满意,如果非要在纯数学之外去寻找这样做的意义,那么我们可以从中值定理入手去理解。说好了不谈这些诸如中值定理的,但事实上,想彻底理解一个数学概念,这些概念是避不开的,问题是,我们如何更简单地(而不是更复杂地)去理解它们。
      以拉格朗日中值定理为例,它的中值定理是这样的:

    f(x)x0,x,[x0,x],ξ[x0,x]使:f(x)=f(x0)+f(ε)(xx0)

    按照这个思路展开,既然在直观的1阶导数情形下,拉格朗日中值定理拥有的几何意义,那么在2阶导数均拟合的情况下,是不是可以有下面的描述呢:

    f(x)x0,x,[x0,x],ξ[x0,x]使:f(x)=f(x0)+f(x0)(xx0)+f(x0)2!(xx0)2+f(ε)3!(xx0)3

    这个式子可以推广到N阶,这是一种很常见的思路,把一个式子一般化后推广,然后小心求证其合理性,待到证明完成,便可以进一步地解释现象,这种思路承接了近代绝大部分的科学技术进步!
      我来给出上式子的一个几何解释,虽然我们想象不到2阶导数依照其几何意义如何画出来,但是我们可以把原始的函数本身升一个维度,然后用积分的思想去理解2阶导数的几何意义。
      理解我在说什么了吗?我的意思简单点说,就是积分式的1阶导数(其实是导函数)就是被积函数,被积函数的1阶导数就是积分式的2阶导数,而我们知道积分式是有几何意义的,它表示面积,而被积函数则表示曲线,再进一步积分式的2阶导数则表示曲线上某点切线的斜率…这样,相当于我们将2阶导数看成了切线斜率,将1阶导数看成了曲线本身,而原始函数看成了曲线与x轴围成的面积:

    Farea=f(x)=x0g(x)dx
    f=g(x)
    f=g=线

    这样我们就可以用拼接图形求总面积的方式来在更高的维度表达类似拉格朗日中值定理的式子了。我们看一个图示:

    这里写图片描述

    我们依照上面的图示,试着求一下OxDA的总面积,首先我们将其表示成各个小块的和的形式:

    SOxDA=SOx0P0A+Sx0xCP0+SP0CB+SP0BD

    然后我们依照图示中的几何关系来分别求各个小块的面积,幸运的是,以直代曲的思想在此体现的淋漓尽致,我们要求的只是简单的三角形,矩形的面积,而我们知道这些完全用加减乘除四则混合运算就足够了,是不是很符合二项式叠加的思想呢?殊途同归!首先看SOx0P0A,由定义,我们知道它就是f(x0),接下来看Sx0xCP0,它是个矩形,变长分别为xx0LP0x0,而LP0x0按照定义,它就是g(x0),而g(x0)又是什么呢?很显然根据上面的微积分关系,他就是f(x0),到此为止我们可以把面积求和算式写成如下的样子了:

    SOxDA=f(x)=f(x0)+f(x0)(xx0)+SP0CB+SP0BD

    还剩下两项,现在来看SP0CB,它是个三角形,我们知道它的底边长就是xx0,而高则是LCB,同时我们知道切线的斜率就是f(x0),那么LCB显然就是f(x0)(xx0)咯!我们把它代入到上面的式子:

    SOxDA=f(x)=f(x0)+f(x0)(xx0)+12f(x0)(xx0)+SP0BD

    最后还剩一下一项了,即SP0BD,它太小了,并且貌似不是很容易计算,因为它不是三角形,也不是任何用直线围成的,它的上沿是一条曲线…这可怎么办?我们注意到,当xx0趋于接近的时候,这块小面积就趋近于0了,这便是可以忽略不计了,这就是极限的思想,当然这不是本文的主题咯。我在画上面的示意图的时候,特意将xx0拉开了一定的距离,这是为了直观,在真正的微积分运算中,这段距离就是无穷小,那么图形SP0BD的面积也就是无穷小了,暂且记为O(SP0BD),最终的式子为:

    SOxDA=f(x)=f(x0)+f(x0)(xx0)+12f(x0)(xx0)+O(SP0BD)

    这样,当切分的区间越来越细致时,O(SP0BD)越来越趋向于0(这个很容易用积分中值定理从直观上看出来,事实上,O(SP0BD)的值就等于f(ε)3!(xx0)3).
      好了,这就是一个在2阶情况下,中值定理大致的几何印象。循着这个思路推广下去,泰勒公式就在眼前了。
      虽然我们想象不出来N阶中值定理的几何意义,但是正像物理学中经常提及超维一样,我们也可以把二维的笛卡尔坐标系拓展成“无限维度空间中的超立方体”。这样的假设下,似乎还不是特别令人满意,但也就只能这样了。
      事实上,我这里可以给出一点提示,利用积分中值定理可以证明泰勒公式在意义层面的合理性,利用分部积分从我上面给出的2阶导数直观几何意义开始,可以逐渐导出完整的泰勒公式!我不会在本文正文中去表达这些内容,因为怕公式太多。当你看线条找不出线条,夹角之间的关系时,试试面积,升个维度试试。
      最后,记住一个结论,N阶导数的几何意义物理意义要比如何用泰勒多项式表达任意表达式更加重要,后者只是说明它“恰好能做到”而已,除了泰勒多项式,傅立叶展开也可以达到同样的效果,另外,还可能有别的。
      在观察二项式拟合任意函数的时候,我们知道“它恰恰可以做到”,现在的问题是如何感性的认识到这一点,即“它为什么就可以做到?”,我们以下面的两个多项式为例,来点感性认识:

    f(x)=x2
    f(x)=x3

    我们把它们画在一个图里:

    这里写图片描述

    可以看得出,2次多项式的曲线表明它是关于y轴对称,而3次多项式的曲线表明它是关于O对称的。这个时候,我们试试两个二项式加和的图像时什么,为了保持对比,我把原始的两个二项式留在了图里:

    这里写图片描述

    感觉2次的多项式完全被3次多项式碾压覆盖,表现不出任何它自己的特征,我们可以清晰地看到,在x取值小于0的时候,根本表现不出2次曲线的行为,这似乎不是一个好消息,因为直观地看,次数越高的多项式在整体的求和表达式中越占据主导地位,那些次数较低的多项式都只是配角,负责曲线水平或者垂直的移动而已…这似乎打破了“任意次多项式求和表达式”可以拟合任何曲线的神话。
      然而,我们没有考虑缩放。
      直观地看,虽然3次曲线在x变化时,其y值的变化剧烈程度要大于2次曲线(从其1阶导数上便能看得出,2次曲线是2x,3次曲线是3x2),如果我们能适当地,恰到好处的把二者的差异通过缩放平滑掉,那么结果如何呢?考虑到我们只能用四则混合运算,非常简单,给3次多项式除以一个大于1的系数,减小它的y效应,或者给2次多项式乘以一个大于1的系数,从而增加它的y效应,我们来看看结果如何。先看缩小3次曲线效应的结果:

    这里写图片描述

    再看增加2次曲线效应的结果:

    这里写图片描述

    这基本上达到了我们的预期。
      到这里,我们知道,二项式的加和表达式是“可以”拟合任何曲线的,而泰勒展开式的那些系数则是一组“恰到好处”的系数,它保证了原表达式和展开表达式的各阶导数都是相等的!

      我想,我终于把该表述的都说完了,有人提到说让我用动画去表示曲线的拟合,这个确实要比用图形和文字更加震撼,然而It is beyond my ability,我并不会这些东西,我所用的gnuplot都要折腾好久,我并没有什么更好的简单的工具来帮我做更加直观的东西,所以就只能通过画草图和文字加以赘述,实为能力所限,实在抱歉。
      我们考虑一个形象的表述来结束关于这个话题的讨论,那就是牛顿定律的公式:

    v=at
    s=f(t)=v0t+12at2

    我们知道,的1阶导数就是速度,2阶导数就是加速度,在恒力F0作用下,2阶导数是一个不随时间变化的定值,那么问题是,时间t后的位移由谁决定,仔细想想就会明白,如果我们忽略恒力导致的加速度a,即忽略的2阶导数,那么时间t后的位移为:

    st=vt0t

    很显然,在恒力的作用下,这与真实的位移结果差很多,距离当前时间越远,结果误差就越大,很显然,在离当前时间t0的适当远t处,位移/时间的2阶导数便派上了用场,在恒力作用下,它可以精确计算相对于当前时间的位移。
      以上的讨论仅仅是在恒力作用下牛顿第二定律导出的结论,然而如果施加的力不是恒定的,而是一个关于时间t变化的变力F=f(t),那么此时仅仅2阶导数便不足以刻画时间t后精确的位移了,此时要想预测时间t后的位移,随着t距离当前时间的远去,的3阶导数,4阶导数…便派上了用场,注意,变化率的变化率使得我们能在越来越远的地方预测趋势,这个正是和上文中关于泰勒展开的讨论是一致的。

    值得一提的是,牛顿在当初导出微积分重要结论的时候,就是为了研究物理运动的,特别是天体的运动,因此关于位移/时间在微积分上的结论应该是从《自然哲学的数学原理》中可以看到的第一手结论。

    第二部分.另外一种刻画的方式

    一般而言,我们在画一个函数的图像时,基本就两点:

    1.首先求解各阶导数,判断其增减性,凸凹性,极值,拐点等,并且描出这些点;
    2.其次,拟合若干个可以判断的具体点。

    这样,大致的曲线就画出来了,可以看到,这种画法跟素描的方式非常像,简直就是素描!先画轮廓,然后进一步细化。然而我觉得这不是云天明故事中针眼画师的画法,这也不是我的画法。
      不管怎样,虽然两种不同的画法在操作细节上是截然不一致的,但是结果是,两种方案的结论是完全一致的,函数被刻画了,性质坦然地舒展了,还有什么性质没有暴露呢?嗯,也许在无穷远处的无穷小的误差可能会引发逻辑上的争论。但此事并不经常,也不绝对。
      在正文中我是通过一个单独的点来蕴含整体模式的,然而在数学上,多数的建议却是,采用了素描的方式从粗到细地去刻画。两类的效果是一致的。

    第三部分.关于导数和频率

    我们知道,1阶导数就是函数在x变化时,对应到y变化的效应,而2阶导数则是x变化时,对应到函数1阶导数的变化效应,以此类推。最后我们发现,整个N阶导数对应是一系列不同频率的变化效应,而整个原始的函数曲线正是这些不同频率的效应的叠加,用这个思路去解释傅立叶展开是非常合理的,然而我们发现它竟然也可以对应地去解释泰勒展开!
      随着求导阶数的增加,效应频率也在不断降低,最终这些不同频率的效应将反馈到函数曲线上的任意一点,而这就完整勾勒出了整条曲线。如果能掌握了这个道理,那么那些执鞭者便可以从单点甩出任意曲线了,我们都知道,频率越高,传播距离越短,频率越低,传播距离越长,当然执鞭者也知道这个道理。这一切在数学上的反映,那就是:
    求导越深,频率越低,影响越远,曲线越拟合。
    爆炸!旋转升降座椅一定会爆炸!赶紧换椅子。

    很多人在看了这些文章后,都给了一些建议,比如说加入一些动画,我起初是不擅长这些的,然而主音吉他手告诉我说gnuplot里做gif超级简单,于是我在周一下班后仔细研究了一下,确实很简单,虽然还没有完全掌握关键的语法,但是比葫芦画瓢还是可以的。
      以下是一个y=sin(x)的泰勒展开的gif动画,红色代表原始的y=sin(x),绿色曲线的每一帧表示多了一阶的导数,也就是展开式中多了一项,可以看得出,随着求导的深入,绿色曲线将越来越拟合原始的正弦曲线,能拟合到什么程度呢?答案是“你想到什么程度,就能到什么程度”
    这里写图片描述

    附录

    A. 分部积分法推导泰勒公式

    我们从正文中提到的的中值定理的变形体入手:

    f(x)=f(x0)+f(x0)(xx0)+

    为了简单起见,我忽略掉了余项O(SP0BD),注意,只是在写法上忽略了余项,事实上它是会一直存在的,这个余项会随着推导的进行,一直往后逼,越来越小。
      我们首先希望推倒多米诺骨牌的第一块试试看,升个维度,把导数写成积分的形式,我们有:

    f(x)=f(x0)+xx0f(xr)dr

    请注意,r是计算积分使用的变量,它和计算整个叠加和所用的x是不同的。以上就是整个多米诺骨牌布景了,现在该推倒第一块了!使用分部积分法则:

    udv=uvvdu

    u=f(xr)
    v=r

    xx0f(xr)dr=(f(xr)r)xx0xx0rdf(xr)

    xx0f(xr)dr=f(x0)(xx0)+xx0f(xr)2dr2

    f(x)=f(x0)+f(x0)(xx0)+xx0f(xr)2dr2

    好了,多米诺骨牌的第一块已然推倒了…接下来就观测吧!给出点提示:注意上面式子的第三部分:

    f(xr)2dr2

    如果我们再次设u=f(xr)v=r2呢,继续享受上面的分部积分过程吧
      大致意思就是这样,过程就不详细写了。

    B.泰勒公式失效的场景(这个附录会很长)

    是滋补鸡汤还是慢性毒药,刚刚喝完的时候是无法获知的,然而,当你喝下去这碗汤后3天,如果它是鸡汤,你无法在这么短的时间内体会到它带给你的益处,如果它是毒药,你将死去…
      是时候把物理意义扯出来了。
      在正文中,我强调的那些可以“从一点窥见整个世界”的曲线其实有有条件的,那就是它的定义域必须是全体实数,且处处可导,若不是这样的话,情况就会复杂得多,这些复杂的情况在本附录讨论。在详细讨论前,有个声明。
      由于本文并不是在同一时间写的,中间间隔了一个工作周,在这一周中我学会并喜欢上了Geogebra,所以我放弃了gnuplot,以下的图示全部来自于Geobebra。让我们开始吧!
      首先看一个简单的反比例函数y=1x,我们看下它的图像:

    这里写图片描述

    且问曲线如何从A点“按照趋势”延伸到B点?A点和B点之间有一堵墙,该墙不可逾越!因为分母不能是0,所以y轴理所当然就是这堵不可逾越的墙了,换句话说,y轴左右两边是隔离的两个世界,在数学上,这个x=0的点就叫做奇点
      奇点的意义在于,在该点,曲线是没有定义的,在这种点处,求导什么的都是毫无意义的,这些点真的就是“奇异”的点,任何计算,任何公式,定律都毫无意义(下文中将会赋予奇点以意义!)。
      知道了奇点的概念后,再说一个例子。
      有一天我微信上问温州皮鞋厂老板有没有什么好玩的东西,老板说算5比较好玩,然后我便犯了一个低级的错误。我信口开河“把y=x12泰勒展开,把5代入不就可以了吗”,为了在计算中不引入根号,瞬间想到了在x=1处展开…计算是简便了,然而结果对吗?
      我们先来看一段动画,即在x=1处展开y=x12的最多n=50阶逼近的过程(Geogebra做这个非常帅!简单直接易上手!):

    这里写图片描述

    n=1n=50,把x=5代入均得不到正确的结果。可见,结论并不是我们之前预期的那样,在“x=1这一个点窥见整条曲线”,显然“能窥见”的曲线范围仅仅局限在大致(0,2)这个区间里。到底发生了什么?在进一步阐释物理意义之前,我还有点建议,如果你没有接触过复分析,收敛圆,收敛半径,审敛法这些,那么正好,如果你接触过这些但只是懂概念,能推导,那么建议暂时忘掉,如果你精通这些,那么不建议继续阅读下去。
    ………….
    霍金的宇宙模型中,奇点是所有经典物理定律完全失效的地方,它既是,它同时又是所有!霍金认为,量子理论可以解释奇点里发生的事,毕竟物理学不是哲学,人们显然不能接受纯粹的无或者无穷。奇点蕴含了整个宇宙本身,在创世之初的那一瞬间,奇点就是整个宇宙,它是时间,它是空间,它是上帝本体!
      宇宙的膨胀意味着时间的膨胀和空间的膨胀,既然是膨胀,肯定需要多余的物质和能量,当我们吹气球的时候,气球之所以会膨胀,那是因为有气体不断地注入气球内部,同时气球球壁还有足够的厚度可以展开,总之,整个过程是需要物质(球壁)和能量(吹气)的!宇宙外面是什么并不是我们讨论的范围,霍金认为宇宙就是宇宙,是一个自洽的整体,那么显然没有在宇宙外面吹气的那个人,宇宙也不会有球壁…促使宇宙膨胀的物质和能量来自哪里?
      来自奇点!
      来自奇点!
      来自奇点!
      奇点早就蕴含了一切!
      用霍金宇宙的奇点思想理解数学上的奇点概念,是朴素的。一条连续且光滑的曲线,它由它的奇点蕴含并生成,以y=1x为例,它由两条连续且光滑的曲线构成,x=0是该函数的一个奇点,也是唯一的奇点,那么x=0处便蕴含并可生成整个两条曲线了。
      你可以把奇点想象成一个无线维度浓缩在一起的一个点,就像面团一样,可以展开到任何维度,可以擀成饺子皮,可以拉成拉面,可以团成馒头…现在我们用奇点的概念来描述一下函数y=x12的曲线的生成过程:

    这里写图片描述

    如果不加干预,整个曲线会一直展开下去,直到遇到定义域的边界,那么在泰勒公式的干预下,事情有所不同,当我们说将原函数在x=a处泰勒展开的时候,实际上我们是接管了整个展开过程,x>a的后面的曲线将不再从奇点拉出,而是由泰勒公式预测出来并展开,此时奇点的物质和能量将停止向外释放,原始函数的曲线生成将停止,此后,泰勒展开的过程将用另外一条曲线去替代原始函数的曲线。需要注意的是,当我们将函数f(x)x=a处泰勒展开的时候,并非只针对x>a的点有效,而是所有定义域的点都有效,毕竟泰勒展开式和原始函数是完全不同的两个函数!
      由上面的过程性描述可知,如果将f(x)x=a处泰勒展开了,那么泰勒公式仅仅能看到的是曲线从其奇点开始到x=a结束这个区间的部分,其余的部分它是看不到的。这意味着什么?
      这意味着,泰勒公式仅仅可以利用曲线来自奇点的从奇点到这个展开点之间的小区间的“物质”和“能量”,这些能量有多少决定了泰勒公式能量曲线往后(离开奇点的方向上)延展多远,如果说从奇点到泰勒展开点,能量已经释放了E,那么泰勒公式就只能利用大小等于E的能量去展开原函数:

    这里写图片描述

    事实上也确实这样,抛开这些烧脑的东西,在我们日常生活中也经常会碰到类似的情况。
      当一个人讲话的时候,一些喜欢接话头的人就会插嘴说,我知道你想说什么,我来说吧。然而这种出风头的策略并非总是奏效。如果原来讲话的人刚开始说话,那么插话的人往往也预测不了太多的内容,然而如果最开始讲话的人说了很久,那么一些暗中观察的插话者往往能预测很多的内容并接着说下去。回到我们的泰勒展开,也就是说,展开点离开奇点越远,那么泰勒公式拟合的就越远,这背后的思想就是能量守恒,奇点已经将能量积累到了展开点,那么泰勒公式也就仅仅能用这么多能量(事实上所谓的能量就是各阶导数信息)来展开,这么多能量能跑多远呢?积累过程跑了多远,那就还能跑那么远!想想单摆运动吧,就这个道理。
      那么y=sin(x)y=ex这些函数的奇点在哪里?这些函数的奇点在无穷远处。这意味着,在任意一个展开点,函数曲线本身都已经积累的无穷的能量(即信息),这说明泰勒公式可以将其完全展开到无穷。
      离奇点越近,各种趋势越不易表现出来,奇点附近刚开始积累趋势,趋势尚未表现,这就是能量和运动的观点,我就是这样避开了那些收敛圆,收敛半径这些概念的。

    C.到底什么是数学

    如果你觉得数学纯思辨性的类似哲学的东西,那么你可以忽略我下面的所述,如果不是,请看完它,哪怕是心里压着邪火,保持着愤怒。
      只有在古希腊数学才是纯思辨哲学的分支,从罗马帝国的地中海世界开始,一直到今天,数学都只是工具,解题工具。当然这里说的解题并非我们考试中的解题,而是实实在在的处理数据时必须要解决的难题。
      不要把炼丹术和占星术看作是迷信这种不可救药的东西,它们和数学的关系源远流长。首先指出,现代数学和古希腊数学完全不是一个概念,甚至几乎没有什么关联,所以在理解现代数学本质的概念的时候,千万不要去想什么毕达哥拉斯学派什么的。炼丹术和占星术是现代化学和天文学的先祖,当它们无法用咒语欺骗国王的时候,它们就必须拿出证据来保住自己的饭碗,这无形中将它们推向了现代科学的“深渊”。千万不要将哥白尼,伽利略,牛顿…他们看成是拥有现代科学品质的明事理的人,在他们的年代,他们无一例外都披着神学的外衣,只是他们在处理一些棘手问题的时候,偶然间发现了一些所谓的真相,要让这些真相在逻辑上变得合理,他们必须处理大量的数据从而期望导出一些隐藏在这些数据背后的关系。在处理数据的时候,他们无一例外地被数据和关系的复杂性困扰,于是乎他们搞出一些处理技巧,这些技巧就是现代数学的前身,因此可以说炼丹术和占星术引导了现代物理,现代物理激发了现代数学,这其中一脉相承的就是神学和哲学的不断渗透和对抗。
      明白了这些之后,你会发现现在中学大学里的数学课程的教法是多么没有意义。这些课程看似很深邃,然而都是毫无意义的。我记得我上大学的时候(当时还是本科,后来才“进修到大专”),老师给我们讲梯度散度旋度,最后的输出就是背诵了一大堆的定理和公式,我问老师这些有什么用,老师说这些期末考试是必考点,以后考研也会考…后来我退学后跑到了女朋友(小小的妈妈)学校外面的村子里租了个房子,刚过去时,正逢她们班要期末考试了,也要考高等数学,什么洛必达法则,牛顿/莱布尼兹公式…爆炸,她们是日语教育专业啊!考这玩意儿毛用啊!
      然而抱怨是苍白的,我依然要拖着疲惫的身躯去给她们讲高等数学,对了,还包括她的同班男生,反正就是我女朋友全班…讲着讲着我就上瘾了(其实也没讲多久),当有人问我学这些有什么用的时候,我总是微笑着回答,这些都是必考点,以后你们考研也会考,说这话时我特别自豪,微笑里带着些许嘲讽和洒脱,因为我TMD再也不用考试和考研了!我不知道当时这样回答我的老师是不是也是这么想的。
    ….
    在以后的学习生涯中,我彻底摒弃了学校里的那一套,因为我再也不用考试了,而且也不会再参加任何形式的考试。所以我变得天马行空,我从马鞍面导出了Linux Netfilter的设计模型,最终确认作者也是这么想的,然后我想仅仅是精通iptables的配置或者看完conntrack的代码是多么Low啊,于是便更进一步探索了Cisco和Netfilter在设计上的差异,最终实现了基于Netfilter的Cisco模型…在我学习最小二乘法的时候,我试图理解平方的深意,后来我看了牛顿的《原理》之后,发现了平方律和立方律简直就是构成我们世界的基本元素啊!
      王姐姐说牛顿是外星人,我表示赞同。然而牛顿是怎么思考的?!
      1905年,爱因斯坦的奇迹年,主角是一位不修边幅,收入不高的专利局小职员,有点像《三体》小说作者刘慈欣,在火电站工作,不好好上班天天上班时间写小说…然而就是这个爱因斯坦道出了现代数学的本质,它只是工具!爱因斯坦从来没有系统学习过现代数学,他只是在用到的时候去请教身边的数学专家,他真的就是把数学当扳手使的。我不晓得其它的人怎么想,我只知道,狄拉克的算符,费曼的积分,霍金的虚时间轴,这些都是数学上的技巧,你要是问有什么物理意义,我觉得他们本人都说不出,只是这么处理很方便,仅此而已吧。
      那么,既然现代数学只是个工具,岂不是很Low?!No!每一个数学上的突破,均代表了一系列的总结,最终会引领新的突破,这方面,数学已经替代了哲学。在我工作的计算机领域,任何一个想法,如果你不能用数学表示出来,那便是不可处理的,请问不可处理的东西能完成KPI吗?于是便有了数学建模。然而模型的建立谈何容易。
    【外出买菜,未完待续】
    (TODO)

    展开全文
  • TCP和TLS/SSL会话细节

    千次阅读 2018-10-08 15:05:07
    TCP和TLS/SSL会话细节 TCP数据段格式说明 TCP建立连接和断开连接细节 Https如何保证通信安全 一次Https网络请求通信细节 网络数据包分析工具wireshark的使用 问题: SYN、ACK、FIN具体含义是什么? TCP建立连接...

    TCP和TLS/SSL会话细节

    1. TCP数据段格式说明
    2. TCP建立连接和断开连接细节
    3. Https如何保证通信安全
    4. 一次Https网络请求通信细节
    5. 网络数据包分析工具wireshark的使用

    问题:
    SYN、ACK、FIN具体含义是什么?
    TCP建立连接超时的表现?

    为什么需要证书来下发服务端公钥?
    客户端是如何验证证书合法性的?
    对称秘钥是如何协商出来的?
    为什么不直接让客户端自己生成一个秘钥发送给服务端使用?
    TLS如何避免重放攻击?

    TCP数据包格式说明

    TCP数据段分为首部+数据两部分。
    首部又分为固定首部和可选项首部。
    通过对TCP数据包格式的分析,就是了解TCP协议定义的过程。

    • 来源连接端口(16比特位)-辨识发送连接端口
    • 目的连接端口(16比特位)-辨识接收连接端口
    • 序列号(seq,32比特位)-TCP数据包标识。
      • 无惧传输时的乱序或丢包
      • 建立连接时发送和接收方第一次数据段的seq均为随机生成(TCP序号预测攻击),之后是上次序列号加1
      • 发送数据时seq为上一次发送的数据长度加1,如果数据长度为0则seq不变
    • 确认号(ack,32比特位)-表示接收方期望下次收到的数据包的序列号的值,也是当前收到的数据的字节长度加1
    • 数据偏移(4比特位)-以4字节为单位计算出的数据段开始地址的偏移值,例1111 -> 15 -> 60字节
    • 保留位(3比特位)-需置为0
    • 标志符(9比特位)
      • NS:Nonce Sum 随机和,
      • CWR:Congestion Window Reduced 拥塞窗口减少标志被发送主机设置,用来表明它接收到了设置ECE标志的TCP包。拥塞窗口是被TCP维护的一个内部变量,用来管理发送窗口大小
      • ECE:ECN-Echo(显式拥塞通知回显) ECN响应标志被用来在TCP3次握手时表明一个TCP端是具备ECN功能的,并且表明接收到的TCP包的IP头部的ECN被设置为11 NS/CWR/ECE三个标志组合实现估计网络拥塞情况的功能
      • URG:为1表示高优先级数据包,紧急指针字段有效
      • ACK:为1表示确认号字段有效
      • PSH:为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满
      • RST:为1表示出现严重差错,可能需要重新创建TCP连接,还可以用于拒绝分发的报文段和拒绝连接请求
      • SYN:为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
      • FIN:为1表示发送方没有数据要传输了,要求释放连接
    • 窗口(WIN 16比特位)-表示从确认号开始,本报文的接收方可以接收的字节数,即接收窗口大小,用于流量控制
    • 校验和(Checksum 16比特位) -对整个TCP报文段,包括TCP首部和TCP数据,计算出来的16位值,这是一个强制字段。校验方式为:将TCP报文段的头部和数据部分的和计算出来,再对其求反码
    • 紧急指针(16比特位)-本报文段中的紧急数据的最后一个字节的序号
    • 选项字段 -最多40字节,每个选项的开始是1字节的kind字段,说明选项的类型。下面具体说明支持的选项字段类型
      • 0:(1字节)选项表结束
      • 1:无操作(1字节)用于选项字段之间的字节边界对齐和分割不同的选项数据
      • 2:最大报文长度(4字节,Maximum segment size,MSS) -在握手阶段告知接收方,发送方支持的最大报文数据段的长度,以太网一般为1460。只能出现在同步报文段中,否则将被忽略。通常将MSS设置为MTU-40字节(Maximum Transmission Unit 最大传输单元),这样携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机发生IP分片。
      • 3:窗口扩大因子(3字节,wscale)-取值0-14,用来把TCP的窗口的值左移的位数。只能出现在同步报文中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节
      • 4:sackOK -发送端支持并同意使用SACK(Selective Acknowledgements,选择确认)选项
      • 5:SACK实际工作的选项,存放丢包的边界信息,最多存放4个包的边界信息。例如123,丢了2,那么SACK存放的就是2号包的开始和结束的字节序列号
      • 8:时间戳(10字节,TCP Timestamps Option,TSopt)
        • 发送端的时间戳(Timestamp Value field, TSval,4字节)
        • 时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)
          时间戳的功能有两个:
        1. 用来计算往返时间RTT(Round-Trip Time),发送方在收到确认报文后,可以准确计算出RTT。
        2. 防止回绕的序列号,通过时间戳可以判断出相同序列号的数据报,哪个是最近发送的,哪个是以前发送的。

    滑动窗口

    简单一句话就是接收方可以动态控制发送方下次发送的TCP包数据段的大小。
    当接收方处理数据较慢时,就可以通过WIN字段,在ACK包中告知发送方:“以后的数据段少发一些,我处理不过来了。”
    在极端情况下,接收方连1字节的数据也不能处理了,那么WIN字段就设置为0,发送方就会停止发送后续的TCP包。
    那么,当接收方缓过气来,可以处理更多数据时,发送方是怎么知道的呢?答案是Zero Window Probe(零窗口探针)技术。
    发送方会在一定时间间隔内重复发送ZWP包,这时接收方就有机会告知发送方最新的窗口大小。
    又有极端情况,接收方一直返回WIN为0,那么发送方在发送一定次数的ZWP后,就会发送RST包来断开连接(不同的系统有不同的实现)。

    另外一种极端情况,接收方返回的WIN值特别小,相对于TCP的首部来说,发送较少的数据时一种浪费。这个时候接收方就会使用David D Clark’s 方案。接收方直接返回WIN为0,知道接收方有足够的能力处理新数据时再把WIN打开。

    如果是由于发送方发送的数据特别少引起的,那么发送方就会使用Nagle’s algorithm。将多个小的数据包缓存起来,直到满足发送条件。

    ECE和CWR

    当两个支持ECN的TCP端进行TCP连接时,对于支持ECN的TCP端来说,SYN包的ECE和CWR标志都被设置了。SYN-ACK只设置ECE标志。

    一个支持ECN的TCP主机在支持ECN的TCP连接上发送设置了IP头部为10或者01的TCP包。支持ECN的路由器在经历拥塞时设置IP头部的ECN域为11。当一个TCP接收端发送针对收到的一个设置ECN位为11的TCP包的响应时,它设置TCP包头中的ECE,并且在接下来的ACK中也做同样设置。

    当发送主机接收到设置了ECE标志的ACK时,它就像感知到包丢失一样,开始减少发送窗口,运行慢启动过程和拥塞避免算法。在下一个数据包中,发送者设置CWR标志。在接收到新的设置CWR标志的包时,接受者停止在接下来的ACK中设置ECE标志。

    超时重传

    建立连接时:

    如果发送方在发送一个SYN包后,在超时时间内没有收到确认包,则发送方会重新发送,称为超时重发。
    默认Linux重试次数为5次,重试时间间隔由1s开始每次翻倍,即1s,2s,4s,8s,16s。如果经过1+2+4+8+16+32=63s后,仍没有收到确认包,则发送方认为接收方已掉线,会主动断开当前连接。

    数据传输时:

    为了网络整体的稳定,需要动态的根据往返时间设置数据包的超时时间。这里就不展开说具体算法过程了。
    RTO(Retransmission Timeout)重传超时时间
    RTT(Round-Trip Time)往返时间

    拥塞控制

    慢启动
    拥塞避免
    快速重传
    快速恢复

    三次握手 和 四次挥手

    三次握手

    在这里插入图片描述

    这是简单的三次握手流程示意图,三次握手意思是需要在发送方和接收方之间传递三个数据包。通过设置不同的标识位,来告知对方当前数据包的意图。

    第一次:C发送一个数据包P1给S,并将标识位的SYN置为1,表明“我要和你建立连接”。

    第二次:S如果可以接受C的请求,会给C回发一个数据包P2,并将标识位SYN置为1,表明“我同意和你建立连接”。同时将ACK位置为1,表明“确认号ack”字段有效,其值为P1数据包序列号+1。

    第三次:C接到P2后,会再次向S发送数据包P3,将ACK为置为1,其值为P2数据包的序列号+1,表明“我知道了你同意了”。

    至此,连接就被建立完成了,双方就可以任意发送数据了。

    但是,在三次握手过程中,除了要协商连接的建立,还有其他通讯参数的设置。下面以一个真实请求在三次握手过程中发生的数据交换作说明:

    第一次

    第二次:

    第三次:

    四次挥手

    在这里插入图片描述

    这是TCP连接断开时四次挥手的示意图。划重点:

    1. 每一侧的连接都单独的被终止。
    2. 主动终止连接的一方在接收到ACK后,不能再发送数据,但可以接收数据,也就是半双工状态。
    3. 首先终止连接的一方,在给对方响应了ACK后,就会等待2*MSL(Max Segment Lifetime 报文最大生存时间)时间,然后关闭连接。RFC793定义了MSL为2分钟,Linux设置成了30s。
    4. 四次挥手也可以通过三次握手实现,即主机A发出FIN,主机B回复FIN&ACK,主机A回复ACK。

    下面是三次握手实现的连接断开的报文传输细节:

    第一次:

    第二次:

    第三次:

    Https如何保证通信安全

    简介

    Https 超文本传输安全协议(Hypertext Transfer Protocol Secure),1994年由网景公司提出,Https经由Http进行通信,但利用SSL/TLS来加密数据,即在Http协议与TCP协议之间添加SSL/TLS层。

    安全防护:

    1. 身份认证,防止中间人攻击
    2. 消息加密,防止被窃听
    3. 消息校验,防止被篡改

    安全前提:
    系统或浏览器正确的实现了Https并安装了正确的证书颁发机构

    安全通信流程

    对称加密
    算法公开(AES)
    一个秘钥,秘钥不公开
    加解密速度快

    非对称加密
    算法公开(RSA)
    两个秘钥,公钥公开,私钥不公开
    公钥加密的数据,私钥可以解密。私钥加密的数据,公钥可以解密
    加解密速度慢

    非对称加密算法除了可以直接将隐私数据加密外,还可以实现对非隐私数据的防篡改校验功能,也就是数字签名。

    Hash/散列/摘要算法
    以任意长度的数据为输入,输出固定长度的数字“指纹”。
    MAC,消息认证码,是带秘钥的Hash算法,即在对数据计算散列值时将秘钥和数据同时作为输入,并采用二次散列迭代的方式。

    Alice和Bob

    在没有SSL/TLS的世界里,Alice和Bob的通讯是这样的。

    Alice(i love you)–明文(i love you)–>Bob(i love you)

    一些坏人可以在明文的传输过程中,对数据进行更改。

    Alice(i love you)–>坏人(i hate you)–>Bob(i hate you)

    Bob(i still love you )–>坏人(i hate you too)–>Alice(i hate you too)

    当两人见面后,发现对方误会了自己,就想到这个世界还是有坏人,然后双方约定将通信内容加密后再发送给对方。约定的加密算法为AES,秘钥为“Alice/Bob”。
    加密后就会出现两种情况:
    Alice(i love you)–加密(123abc)–>坏人(123abc)–>Bob(123abc)–>解密(i love you)

    Alice(i love you)–加密(123abc)–>坏人(!!!)–>Bob(!!!)–>解密(???)
    单纯使用对称加密会有两个问题:

    1. 坏人虽然不能窃听内容,但是仍能篡改。
    2. 对称加密的秘钥只能Alice和Bob两个人知道,如果想再和更多的人加密通信的话,就无能为力了。
    3. Alice和Bob必须在通信之前就约定好秘钥(在互联网世界中办不到),中途无法更新。

    所以,我们要解决这些问题,需要做到:

    1. 为了过滤掉被篡改的数据,通信过程需要有内容校验机制
    2. 为了可以和无限多人通信,需要能动态生成和更新秘钥

    Alice和Bob非常聪明,他们想到了非对称加密算法RSA,Bob拿着私钥,然后把公钥给Alice,当Alice想要和Bob通信时,利用手中的公钥将对称加密算法的秘钥加密后发送给Bob,Bob拿着自己的私钥将对称加密的秘钥解密后,双方就可以继续用对称加密算法将数据加密后通信了。当然,其他人也可以拿到Bob的公钥,与Bob通信。

    Alice(我想和你说话,给我公钥)------->Bob(我想和你说话,给我公钥)
    Bob(给你公钥(Pubkey)) --------->Alice(拿到公钥PubKey)
    Alice(秘钥:123)–>公钥PubKey加密(321)–>Bob(321)–>私钥解密(123)

    Alice(i love you)–>秘钥123加密(123abc+摘要签名)---->Bob(123abc+摘要签名)–>正确性验证–>秘钥123解密(i love you)

    上述第二个过程是无懈可击的,但是第一个过程中,如果存在坏人的话,就变成下面的情形

    Bob(给你公钥(PubKey))---->坏人(PubKey换成自己的PubKey1)--------->Alice(拿到公钥PubKey1)
    Alice(秘钥:123)–>公钥PubKey1加密(abc)–>坏人(abc),自己的私钥解密123,再用PubKey加密321–>Bob(321)–>私钥解密(123)

    完犊子了,对称加密的秘钥被坏人窃取了,通信数据又相当于裸奔了。其中核心问题就是:

    1. 接收方无法确定公钥的合法性

    那如果把公钥事先告知Alice可以么?也就是内置在系统中。理论上是没问题的,但当Alice需要和更多的人通信时,她需要记住很多很多的公钥,这是不可行的。

    所以Alice和Bob需要商量出一套方案,能保证公钥在网络上安全的传输,如果受到篡改,接收方能感知到。这时,他们想到数字签名的方式。

    Bob(给你公钥+签名(摘要的私钥加密))------>Alice(公钥+签名,对签名解密,并再次计算摘要,然后比对)

    上述方式可以做到防篡改么?可以,但是做不到防替换。中间人可以把签名连同公钥全部换成自己的。

    接下来就到了数字签名证书出场的时刻了。

    Bob找到了一个非常权威的机构,“人民政府”。
    Bob向“人民政府”证明“我是真Bob”,并提供自己的公钥。
    “人民政府”根据Bob的信息和公钥颁发给Bob一个证书文件.cer,里面写了颁发机构的信息、Bob的信息和公钥、摘要算法以及最重要的颁发机构的签名

    公钥下发过程变成了数字证书下发过程。

    同时,Alice也是非常相信“人民政府”的,只要是“人民政府”签名的证书,Alice就认为证书上面的公钥就是Bob的。

    但是,Alice并不能无脑的相信,她需要判断了两点:

    1. 接收到的证书是否是”人民政府“签发的。
    2. 证书上面的信息是否被篡改。

    那么具体的判断流程是怎样的呢?

    1. 由于Alice信任”人民政府“这个机构,所以Alice可以内置一份”人民政府“自签名的证书,上面有”人民政府“生成的公私钥中的公钥,私钥由”人民政府“自己保管。
    2. 在下发证书过程中,Alice拿到Bob发过来的由”人民政府“私钥签名过得证书cert0。
    3. Alice首先根据cert0上的证书颁发机构信息判断自己是否信任这个机构颁发的证书,cert0是由”人民政府“签发的,而Alice是信任”人民政府“的,所以Alice信任cert0。
    4. Alice通过查找内置的”人民政府“的自签名证书拿到”人民政府“的公钥
    5. 用此公钥验证cert0上的信息是否被篡改(用上级证书的公钥解密数字签名得到证书摘要1,在本地对证书信息做摘要2,对比摘要1和摘要2是否相等)。

    问题:Bob的公钥不是由”人民政府“签发的,而是由其下属的”地方政府“签发的。而Alice只有”人民政府“的自签名政府,如何判断证书合法性呢?

    答:在证书下发过程中,实际是下发的一个证书链,类似于”Bob的证书“–>“地方政府的证书”–>”人民政府的证书“,Alice可以逐级查找,直到根证书。

    证书内容

    Https证书格式遵循的是X.509标准。X.509是ITU-T标准化部门基于他们之前的ASN.1定义的一套证书标准。

    在浏览器中随便下载一个证书,通过以下命令获取到其文本格式。

    openssl x509 -in *.xxx.com.cer -inform der -text -noout >> cer.txt 
    
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                09:3e:8a:aa:5a:f8:14:de:9d:d9:4d:28:2e:97:a8:16
            Signature Algorithm: sha256WithRSAEncryption
            Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=GeoTrust RSA CA 2018  //颁发者信息
            Validity
                Not Before: Aug 22 00:00:00 2018 GMT
                Not After : Nov 12 12:00:00 2020 GMT
            Subject: C=CN, ST=\xE5\x8C\x97\xE4\xBA\xAC, L=\xE5\x8C\x97\xE4\xBA\xAC, 
    O=Beijing Qfpay Technology Co., ltd., CN=*.qfpay.com //公钥主题信息,公钥所有者的信息
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    Public-Key: (2048 bit)
                    Modulus:
                        00:e6:c0:8b:f0:12:1e:f0:92:9c:17:7d:7e:d5:69:
                        47:fc:dd:0b:51:5a:0e:79:df:b1:0e:b4:d6:7d:d0:
                        5a:bc:f9:93:f6:3c:e3:40:a8:66:9f:d0:ae:3c:e1:
                        f8:9a:55:a2:84:0e:9c:1d:65:f9:d2:63:51:48:b2:
                        88:a5:09:a6:be:92:80:f8:3b:eb:b8:78:1b:35:58:
                        47:ac:eb:47:cd:3d:7f:36:74:30:7a:01:86:48:96:
                        b3:7b:14:82:b6:63:0b:b6:43:20:98:3f:07:9d:1a:
                        56:76:25:cf:cd:d5:49:fd:6e:dc:86:f0:7f:15:f3:
                        7d:58:98:75:a5:7f:f9:ab:b2:c4:ec:fc:30:bd:75:
                        27:b3:0e:72:3d:44:d1:04:42:52:65:9b:3e:53:9b:
                        a5:c2:eb:ac:c5:01:b6:1d:0d:2f:75:79:7d:98:d4:
                        2b:b6:c0:28:ea:c7:dc:14:04:b6:4d:a3:dc:01:2c:
                        f0:14:13:b9:d2:29:31:00:37:af:17:d6:82:a6:f9:
                        57:9e:4c:2f:27:27:08:50:16:e3:ca:fa:58:32:c7:
                        f5:04:43:b4:5d:0e:97:81:e9:c3:01:36:f9:b7:c8:
                        14:ec:98:27:e9:31:86:ab:f5:c4:ff:50:aa:c4:df:
                        cc:6e:7d:1c:5a:fa:b8:47:c9:fa:78:b4:de:6d:15:
                        8d:27
                    Exponent: 65537 (0x10001)
            X509v3 extensions:
                X509v3 Authority Key Identifier: //授权秘钥标识符
                    keyid:90:58:FF:B0:9C:75:A8:51:54:77:B1:ED:F2:A3:43:16:38:9E:6C:C5
    
                X509v3 Subject Key Identifier: //主题秘钥标识符
                    EC:99:74:D5:FF:C6:1B:4F:FB:39:88:8C:E2:C1:7B:8D:90:59:AB:1F
                X509v3 Subject Alternative Name: 
                    DNS:*.xxx.com, DNS:xxx.com
                X509v3 Key Usage: critical
                    Digital Signature, Key Encipherment
                X509v3 Extended Key Usage: 
                    TLS Web Server Authentication, TLS Web Client Authentication
                X509v3 CRL Distribution Points: 
    
                    Full Name:
                      URI:http://cdp1.digicert.com/GeoTrustRSACA2018.crl
    
                X509v3 Certificate Policies: 
                    Policy: 2.16.840.1.114412.1.1
                      CPS: https://www.digicert.com/CPS
                    Policy: 2.23.140.1.2.2
    
                Authority Information Access: 
                    OCSP - URI:http://ocsp1.digicert.com
                    CA Issuers - URI:http://cacerts.geotrust.com/GeoTrustRSACA2018.crt
    
        Signature Algorithm: sha256WithRSAEncryption
             07:8d:b9:34:62:e8:4b:83:00:af:ab:38:d4:b1:24:12:a4:37:
             5e:8f:e7:ff:d9:96:48:ae:72:6f:d2:0b:41:6a:55:92:2a:06:
             39:86:a9:78:18:cd:0d:5f:33:fa:22:81:50:b7:67:2f:dc:a1:
             b4:ee:0f:6c:f8:73:87:0d:65:e7:19:9a:55:07:49:a4:2d:09:
             11:8b:5f:1c:c1:46:ce:94:22:fa:b0:1b:88:f0:f0:6f:63:11:
             e4:56:f4:51:3c:12:90:db:44:63:8b:fd:17:d2:e5:7a:66:5e:
             f5:d8:90:70:5c:d6:c2:74:d9:74:b3:75:ce:83:e3:db:57:bb:
             b6:3a:81:e7:ca:7a:48:82:6c:0b:01:a8:ed:a2:8e:d0:b0:ed:
             25:15:a2:2a:7f:6f:a5:6d:da:5a:ac:91:f4:dc:23:d8:9f:9d:
             d3:0a:f4:c7:8f:b0:c2:18:54:97:f5:00:30:36:65:e1:aa:25:
             9c:f1:b8:77:d6:7d:33:79:39:0e:41:86:1d:79:47:0e:34:cc:
             fd:e8:63:83:9d:f5:86:d6:e2:0c:fa:58:d5:d2:81:c1:92:da:
             e7:41:45:bc:a0:91:d5:40:6e:c8:22:76:69:e4:67:9a:d4:03:
             ca:8d:28:d5:ca:98:09:e0:d6:dd:ae:c2:6f:08:82:1b:89:79:
             14:d6:ca:b7
    

    上图中的Modulus和exponent字段就是服务端的公钥,而且是明文的。

    SSL/TLS握手细节

    SSL/TLS报文格式

    SSL协议属于分层协议,一个SSL报文可以包含多个记录层,每个记录层分为两部分:头部 + 协议数据。

    • Content Type:协议类型
    • Version:TLS版本
    • Length:报文长度
    • 协议数据,不同的协议包含数据字段不同
    报文支持的协议类型
    Handshake Protocol

    握手协议是最主要的协议,负责协商会话的安全属性。按照不同的功能区分为不同握手类型。

    enum {
              hello_request(0), client_hello(1), server_hello(2),
              certificate(11), server_key_exchange (12),
              certificate_request(13), server_hello_done(14),
              certificate_verify(15), client_key_exchange(16),
              finished(20), (255)
          } HandshakeType;
          
    struct {
        HandshakeType msg_type;    /* handshake type */
        uint24 length;             /* bytes in message */
        select (HandshakeType) {
            case hello_request:       HelloRequest;
            case client_hello:        ClientHello;
            case server_hello:        ServerHello;
            case certificate:         Certificate;
            case server_key_exchange: ServerKeyExchange;
            case certificate_request: CertificateRequest;
            case server_hello_done:   ServerHelloDone;
            case certificate_verify:  CertificateVerify;
            case client_key_exchange: ClientKeyExchange;
            case finished:            Finished;
        } body;
    } Handshake;
    

    每种握手协议类型,也都包含一些通用字段,如
    HandshakeType
    Version
    Length

    下面具体说明每种握手类型的作用:

    Hello Request

    ”你好,请求“,该类型的握手协议作为一个简单的通知,由服务端发送,告知客户端重新开始协商过程。作为响应,客户端应该在方便时发送ClientHello消息。
    如果客户端不希望重新协商会话,可以选择忽略此消息,或者返回一个no_renegotitation消息。
    如果服务端发送HelloRequest后没有收到ClientHello作为响应,它可能会通过致命警报关闭连接。

    Client Hello
    ”你好,我是客户端“,该类型的消息用于首次连接服务器时,或响应服务端发送的HelloRequest,或主动发送,以便重新协商连接中的安全参数。

    1. Random 由安全随机数生成器生成的28字节随机数,用于对称秘钥计算

    2. Session ID 会话标识,可变长,用于会话恢复时重用其安全参数

    3. Cipher Suites 加密算法套件,客户端提供支持的密码算法套件列表,按照客户端的偏好顺序排列,一般由四个算法组成,格式为秘钥交换算法+身份认证算法+批量加密算法+摘要算法

      例:Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)

      ECDHE 秘钥交换算法,由于对称秘钥并不是客户端直接生成发送给服务端的,而是双方又各自生成了一对"公私钥",然后互相交换“公钥”,这里生成“公私钥”的算法就是ECDHE
      ECDSA 身份认证算法,用于加密握手消息,确认未被篡改
      AES_256_GCM 批量加密算法,用于应用数据加密,它还包括秘钥大小及显示和隐式初始化向量的长度
      SHA384 散列算法,用于计算主秘钥和创建会话消息摘要

    4. Compression Methods 压缩算法列表

    这四个属于固定字段,如果还需要协商其他内容,可以通过下面的扩展字段。

    1. renegotiation_info 重新协商信息,
    2. signature_algorithms 签名算法,列出客户端支持的哈希和签名算法,用于后续消息签名时的参考。
    3. server_name 服务器域名,用于解决一台机器部署多个不同域名的站点,而引起证书冲突的情况。
    4. aplication_layer_negotiation 用来确定后续的应用层协议,例http/1.1 spdy h2

    Server Hello
    ”你好,我是服务端“,该类型的消息用于响应ClientHello消息。如果服务器找到一组可以接受的算法套件时,则回复此消息,否则响应握手失败的警报。

    1. Random 由服务端独立生成的随机数,28字节,用于对称秘钥的计算。

    2. Session ID 当前的会话标识,如果ClientHello的参数SessionID不为空,则服务器将在其会话告诉缓存中查找匹配项,找到并且愿意是定指定的会话状态建立连接,则服务器使用与客户端提供的SessionID作为响应,然后恢复会话并进入Finished消息流程。否则将重新生成该值以标识新会话。如果SessionID为空表明服务端不缓存此会话,无法恢复。

    3. Cipher Suite 服务端从ClientHello.cipher_suites列表中选择的单个密码套件。如果是恢复会话,此字段为正在恢复的会话状态的值。

      例:Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
      ECDHE 椭圆曲线离散对数算法
      RSA 非对称加密算法
      AES_256_GCM 高级加密算法,对称加密,32字节的秘钥 GCM为加密模式
      SHA384 安全散列算法

    4. Compress Method 服务端从ClientHello.CompressionMethods列表中选择的压缩算法

    Server Hello消息也可以包含扩展,但是这些扩展必须在ClientHello中有相同的扩展类型,服务端不能擅自添加。如果客户端在ServerHello中收到它未在ClientHello请求中关联的扩展类型,客户端必须使用unsupported_extension致命警告来终止握手。

    Certificate
    ”服务器证书“,只要商定的秘钥交换方法使用证书进行身份验证,则服务端必须发送该证书消息。该消息紧跟在Server Hello消息后,用于向客户端下发证书。
    什么时候服务端不需要下发证书呢?就是在秘钥协商过程中使用DH_anon(Diffie-Hellman ANON)匿名Diffie-Hellman算法,即不配合其他身份验证算法,而单独只读使用DH算法,这样无法保证数据被”篡改“。

    1. Certificates 证书链,服务端的证书必须放在第一位,以后的证书必须直接证明其前面的证书。

    证书限制

    • 证书类型必须是X.509v3,除非另行协商。
    • 证书必须适用于协商密码套件的秘钥交换算法和任何协商扩展。
    • 如果客户端提供了”signature_algorithms“扩展,那么服务端提供的所有证书必须由该扩展中出现的散列/签名算法进行签名。

    Server Key Exchange
    ”服务器秘钥交换“,用于发送服务端的预主秘钥。此消息在Certificates消息后立即发送。
    当且仅当与秘钥交换算法相关联的证书类型不能为客户端提供足够的信息来交换预主秘钥时,才会发送服务器秘钥交换信息。

    该消息主要描述了使用协商的秘钥交换算法后,服务端计算出来的公开秘钥。
    本示例中使用的是ECDHE算法。其原理简单理解如下所示:

    • 服务端生成随机整数a,作为私钥
    • 计算出A = f1(a),其中a为私钥,A为公钥,并将A发送给客户端
    • 客户端重复相同的步骤,先生成随机整数b,计算 B = f1(b),并将B发送给服务端
    • 客户端持有A和b,服务端持有a和B
    • 服务端和客户端计算出相同的预主秘钥 K = f2(a, B) = f2(b, A)
    • 之后再根据预主秘钥和两个随机数计算出主秘钥
    • 上述计算过程由ECDHE提供

    服务端为了证明此消息是真实可靠的,需要用自己证书私钥和ClientHello提供的扩展signature_algorithms里选择合适摘要和签名算法对参数进行签名。

    Certificate Request 可选
    ”要求证书“,如果服务端需要客户端提供证书以验证客户端身份,则使用此消息。消息格式与服务端下发给客户端的证书消息格式相同。

    Server Hello Done
    “服务器Hello完成”,表示服务端已经把支持秘钥交换的消息发送完成。发送此消息后,服务端等待客户端响应。客户端应该检查服务器是否提供了有效的证书(如果需要),并检查服务端Hello消息参数是否可接受。

    Client Certificate
    “客户端证书”,用于将客户端证书发送给服务端。

    这是客户端在收到ServerHelloDone消息后可以发送的第一条消息。仅当服务器请求证书时才会发送此消息。如果没有合适的证书,客户端必须发送不包含证书的证书消息。也就是说,certificate_list结构的长度为零。如果客户端没有发送任何证书,服务器可以自行决定是否在没有客户端身份验证的情况下继续握手,或者使用致命的handshake_failure警报进行响应。此外,如果证书链的某些方面是不可接受的(例如,它没有由已知的,可信的CA签名),服务器可以自行决定是继续握手(考虑客户端未经身份验证)还是发送致命警报。

    Client Key Exchange
    “客户端秘钥交换”,用于发送客户端计算的预主秘钥。该消息是在客户端收到ServerHelloDone消息后发送的第一条消息。或者是跟在Client Certificate消息后发送。

    这个消息内容比较简单,就是用服务端证书公钥加密的预主秘钥。

    Certificate Verify
    “证书验证”,此消息用于客户端证书的显示验证。发送这个消息的前提有两个:

    1. 服务端请求了客户端证书
    2. 客户端发送了非0长的证书

    此时,客户端需要证明自己拥有该证书,需要用自己的私钥签名一段数据发送给服务端做验证。
    签名的数据为:此消息之前的所有接收和发送过的握手消息。

    Finished
    “协商完成”,此消息是第一个使用上述握手过程中协商的算法和秘钥来加密的消息。接收方必须验证内容是否正确。
    该消息在Change Cipher Spec消息之后被发送,以验证密钥交换和身份验证过程是否成功。
    发送的数据为:PRF(master_secret, finished_label, Hash(handshake_messages))
    finished_label为“client finished”/“server finished”
    handshake_messages包含除去Hello Request消息之外的之前所有发送和接收的握手消息

    Change Cipher Spec Protocol

    更改密码规范协议,该协议在TSL1.3被移除。

    Change Cipher Spec
    “变更秘钥规范”,用于通知接收方后续的通讯数据将在新协商的秘钥规范保护下交换。
    此消息在Finished消息之前被发送。


    客户端在交换预主秘钥后,就立即发送了“Change Cipher Spec”消息。


    之后,服务端也发送一个“Change Cipher Spec”消息。

    Application Data Protocol

    应用数据协议
    如果握手过程结束一切正常,Alice和Bob就用这条加密信道放心的发送数据了,这些数据都是被加密过的。

    http-over-tls

    Alert Protocol

    警报消息传达消息的严重性(警告或致命)以及警报的描述。 具有致命级别的警报消息导致连接立即终止。在这种情况下,对应于会话的其他连接可以继续,但是会话标识符必须无效,防止失败的会话被用于建立新连接。与其他消息一样,警报消息按当前连接状态的指定进行加密和压缩。

    警报协议包含很多异常场景,如证书过期、没有符合密码套件、未知的ca等,这里就不一一列出了。

    TLS握手简化流程图

    Client                 Server

    ClientHello    ----------->
                       ServerHello
                       Certificate*
                       ServerKeyExchange*
                       CertificateRequest*
              <-----------    ServerHelloDone
    Certificate*
    ClientKeyExchange
    CertificateVerify*
    [ChangeCipherSpec]
    Finished      ----------->
                      [ChangeCipherSpec]
              <-----------     Finished
    Application Data  <----------->  ApplicationData

    中括号号标识的协议不属于握手协议
    星号标识的不是必须的握手流程

    至此TLS握手过程说完了,但貌似没有说到**对称秘钥(会话秘钥)**是如何被计算出来的?
    我们知道,通过前面的握手流程,客户端和服务端都知道了以下信息:

    • 预主秘钥(计算出来的)
    • 客户端随机数
    • 服务端随机数

    通过这三个参数,客户端和服务端就可以分别计算出主秘钥:

    master_secret = PRF(pre_master_secret, "master secret",
                              ClientHello.random + ServerHello.random)
    

    master_secret 长度为48个字节。

    PRF (pseudo random function)伪随机函数,也就是选择的加密套件中的第四个算法SHA384。计算完主秘钥,就应当把预主秘钥从内存中删除。
    PRF算法需要一个“秘钥”、一个“种子”和一个“文本标识”作为输入,然后产生一个不定长的输出。
    其中的“秘钥”就是预主秘钥,“种子”就是两个随机数的和,“文本标识”就是 master secret。

    因为客户端和服务端的输入参数都是一样的,所以计算出来的主秘钥也是一致的。

    主秘钥是用来做对称加密的秘钥的么?
    不是,需要由主秘钥再次计算,主秘钥在创建会话秘钥时作为一个熵来源。最终计算出来的结果如下:

    客户端写入MAC密钥
    服务器写入MAC密钥
    客户端写入加密密钥
    服务器写入加密密钥
    客户端写入IV
    服务端写入IV

    实际上是生成了两个会话秘钥:
    当客户端向服务端发送消息时,使用“客户端写入MAC秘钥”生成消息摘要附加在消息结尾,使用“客户端写入秘钥”加密;服务端接收到消息后,使用“客户端写入秘钥”解密,使用“客户端写入MAC秘钥”做消息摘要并对比两次摘要结果。
    反过来则是,服务端向客户端发送消息时,使用“服务端写入MAC秘钥”生成消息摘要附加在消息结尾,使用“服务端写入秘钥”加密;客户端接收到消息后,使用“服务端写入秘钥”解密,使用“服务端写入MAC秘钥”做消息摘要并对比两次摘要结果。
    如果需要在TLS层压缩数据,则在加密之前先压缩。

    一些AEAD(认证加密)秘钥套件可能额外需要一个客户端写入向量和服务端写入向量

    那么这些值是怎么计算出来的呢?

    key_block = PRF(master_secret,“key expansion”,server_random + client_random); 
              = P_hash(master_secret, “key expansion"+server_random + client_random)
    
    P_hash定义为: 
    P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
                            HMAC_hash(secret, A(2) + seed) +
                            HMAC_hash(secret, A(3) + seed) + ...
                            
    A(0) = seed;
    A(i) = HMAC_hash(secret, A(i-1));
    ...
    
    HMAC: 基于消息认证码的哈希算法,也就是对消息进行哈希运算时添加一个秘钥。
    

    以TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384为例,AES256会话加密算法需要32字节的会话秘钥,而我们需要2个会话秘钥(2 * 32)和2个MAC秘钥(2 * 48),就是2 * 32 + 2 * 48= 160字节。而摘要算法SHA384每次的运算输出为48字节,为了能满足160个字节,至少需要计算4次,拼接后得到172字节的输出。

    然后按照上述顺序:

    • 0~47字节为“客户端写入MAC秘钥”
    • 48~95字节为“服务器写入MAC秘钥”
    • 96~127字节为“客户端写入加密秘钥”
    • 128~159字节为“服务端写入加密秘钥”

    剩下的12字节则舍弃。

    总结:

    1. 握手过程中,客户端和服务端交换了哪些东西?

      • 两个随机数
      • DH算法的公钥
      • 证书
    2. 握手过程中,哪些消息是经过加密的?加密的目的是什么?

      • Server/Client Key Exchange 使用服务器私钥加密,防止中间人篡改
      • Finished 使用主秘钥加密并签名,验证主秘钥是否正确生成和握手消息是否被篡改
    3. 如果服务端的私钥泄漏,坏人能否解密会话数据?
      RSA 可以
      DH 不可以
      PSK 不可以

    参考:TLS握手协议分析与理解——某HTTPS请求流量包分析

    解密应用数据方式:

    启动Chrome并制定SSL的日志文件

    sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome  --ssl-key-log-file=/Users/joye/Downloads/sslkeylog.log
    

    在WireShark中Preferences->Protocols->SSL-(Pre)-Master-Secret log filename设置日志文件

    展开全文
  • 程序员应知——关注细节

    千次阅读 多人点赞 2011-10-28 15:01:34
    曾经有一句话,叫做“细节决定成败”,充分说明了细节对于成功的作用。如果我们注意一下,就会发现很多因为注重细节而获得成功的案例。 产品的细节 苹果的系列产品我们都已经非常熟悉了,各种各样i打头的产品,...

    曾经有一句话,叫做“细节决定成败”,充分说明了细节对于成功的作用。如果我们注意一下,就会发现很多因为注重细节而获得成功的案例。

    产品的细节

    苹果的系列产品我们都已经非常熟悉了,各种各样i打头的产品,对于细节已经给予了非常大的关注。尤其体现明显的就是在对用户使用的友好度和便利性方面的细节。iPad、iPhone和iTouch等产品都是大大的屏幕,而在正面就只有一个按钮,用户不必考虑到底需要按什么按钮。而系列产品的做工更是让人赞不绝口,这也是另外一个细节。

    另外对于国内的电子书产品,bambook我感觉细节做得也很不错,首先所使用的硬件质量都很好,我已经用了快一年的时间了,每个按钮还和刚拥有的时候一样灵活;电池也一直非常耐用,充一次电基本上可以至少用大半个月,这还是因为我几乎每天上下班的路上都会使用它来看书。曾经在使用的时候遇到一位用汉王产品的人,和我抱怨那款电子书的问题,首先就是按钮,没用两个月就坏掉了;还有电池,刚开始的时候能撑一个多月,但不长时间之后,就只能撑几天了。按钮、电池,看起来都是很细节的东西,但确实直接影响到了用户的体验,从而影响了用户对于产品乃至于企业的印象。

    服务的细节

    以上说的是产品,对于服务也是一样,同样需要关注细节。最近一段时间最火的饭店应该就是“海底捞”了,有无数的故事让人来传说,其实他们的服务充分体现了关注细节这一特点,不仅仅是产品的质量,更包括了服务的质量,他们能够关注于客户的各种反应,从而做出让人最满意的服务,那样才获得了巨大的成功。尽管说“海底捞你学不会”,但我们至少可以学习他们关注细节这一点,呵呵。

    程序员要关注细节

    作为程序员,我们的工作有很多,一方面需要创造出各种系统,编写各种程序,制造各种产出物;另一方面要和客户沟通,为最终的业务用户服务。无论哪个方面,我们都需要关注细节,那样才能够把工作做得更好。

    创建产品方面,我想我们可以做的有:

    • 所有程序外观、使用方式统一,从而让用户更容易地学习和使用
    • 程序代码遵守规范,便于维护和修改
    • 各种功能使用简单,程序帮助用户做尽可能多的事儿
    • 协助用户改进不合理的工作方式,帮助用户提高工作效率
    • ……

    其实这还比较笼统,更细节的问题可能会是:

    • 界面上的文字是否有错别字?
    • 文字的大小、颜色是否符合规范?
    • 各种提示信息是否规范,是否真正有助于用户发现并解决问题?
    • 代码中的注释是否必要,是否能够正确地为代码提供补充说明?
    • ……

    如果能够做到关注细节,那么不管是对于用户,还是团队中的其他开发人员来说,我们所体现出来的就是一种专业的精神和专业的态度。

    当我们需要与用户沟通,为业务用户提供各种服务的时候,同样需要关注细节,我们需要:

    • 清晰地了解用户的需求,并根据需求设计出好的技术解决方案。
    • 对于用户提出的问题,能够快速定位并及时修正。
    • 与客户沟通的过程中,及时向客户反馈。
    • 不仅要理解用户表面提出来的需求,还需要根据自己的理解,挖掘潜在的需求。
    • ……

    以上还更多的是针对工作方面,想要和业务用户更好地协作,我们可能还需要关注一些生活上的细节

    • 用户的姓名以及基本的自然信息,是否在一次介绍之后就能够清晰地记住?
    • 用户当前的状态,身体状况如何,是否适合工作?
    • 用户的某些习惯怎样,采用什么样的方式更有效?
    • 用户对我们的服务是否满意,我们还需要在哪些方面需要提升?
    • 在活动的时候不迟到,清晰、快速地阐述自己的观点
    • ……

    从以上内容看来,想要真正做到关注细节,还真的是不容易,而我们又应该如何做好这些事儿呢?我想可以从改变自身开始:

    • 细心!这样才能够发现更多细节
    • 积极!这样才能够更有效地利用细节
    • 准备!这样才能够把握好细节,发现更多机会

    以上就是我对于关注细节相关的看法,如果你也是个注重细节的人,并且有很多关注细节的好习惯,欢迎与我讨论,:)

    展开全文
  • 想想也是,面对数百台服务器,管理员肯定不会去关注一些太细节的东西 不会说某个sql写的好不好,某个查询性能怎么怎么样,这样肯定会累死的 只要保证整体上的稳定即可 但是面对突发故障,最最直接的问题不外乎...
  • Dubbo | 魔鬼在细节

    万次阅读 2018-09-14 17:01:11
    最近一直担心Dubbo分布式服务框架后续如果维护人员增多或变更,会出现质量的下降, 我在想,有没有什么是需要大家共同遵守的, 根据平时写代码时的一习惯,总结了一下在写代码过程中,尤其是框架代码,要时刻牢记的...
  • 2019年,德国,纽伦堡前段时间,朋友圈被《我是技术总监,你干嘛总问我技术细节》刷屏了,微信群里也有不少讨论。就我所看到的情况,各种意见都有。有人认为“技术人不能丢掉技术...
  • 披露时间线以太坊代币“假充值”漏洞影响面非常之广,影响对象至少包括:相关中心化交易...出于影响,我们采取了负责任的披露过程,这次攻击事件的披露前后相关时间线大致如下:漏洞细节以太坊代币交易回执中 status...
  • 软件企业:细节造就竞争力

    千次阅读 2007-09-15 18:10:00
    我想问题就出在细节的把握上,并不是我们所做的鸡或饭不好吃,而是在别的细节方面没有做好,比如管理的规范化、产品的人性化、生产的标准化、服务的优质化等等,我们经常讲“千里长堤,溃于蚁穴”、“大处着眼,小处...
  • 流媒体 直播细节优化

    千次阅读 2016-12-09 18:22:30
    比较普遍的实现方式:通过用户使用的DNS服务器来判断客户端所在的网络位置,从而返回对应的服务IP。如下图示例: 广东电信用户IP:1.1.1.1 需要看一个直播http://www.ucloud.cn/helloworld.flv ,实现就近...
  • 当我们需要考虑类、类的内部细节、类之间的关系时,这时我们已经开始做详细设计了。详细设计不一定是一份文档,也不一定是Word文档,详细设计也不一定叫“详细设计”,有时候“编码就是设计”也是未尝不可的。对于...
  • 细节优化提升资源利用率

    万次阅读 2011-09-23 13:54:59
    细节优化提升资源利用率 Author: 放翁(文初) Email: fangweng@taobao.com Mblog:weibo.com/fangweng    这里通过介绍对于淘宝开放平台基础设置之一的TOPAnalyzer的代码
  • 细节决定成败》语录

    千次阅读 2006-05-20 17:02:00
    今天花了一天的时间把《细节决定成败》这本书读完,学到不少知识。结合自己的工作和生活,发现一些细节没有足够的重视。就以代码注释为例,自己会在一些重要的地方增加一些注释,以便其它人了解这些代码和以后的维护...
  • 关于泰勒展开的细节-《三体》读后感的读后感...

    万次阅读 多人点赞 2017-07-30 08:25:23
    我并不赞成这个说法,以霍金为例,它的虚时间模型虽然只是数学上的技巧,但是最终的目标却是为他的有限无界的宇宙几何模型服务,这说明,完成逻辑完整性证明和寻找其意义同等重要,可能后者还会更重要,我没有看到哪...
  • 多人在线网络游戏实现细节

    千次阅读 2017-06-02 13:16:22
    当然了,这只是一个过于简单的解释,同时也隐去了很多细节,不过我们通过这个基本的思路可以知道RTS游戏的网络是如何工作的。如果你想知道更多网络模型,请点击:1500 Archers on a 28.8: Network Programming in Age...
  • 【杭州SEO优化】网站建设细节分析!

    千次阅读 2018-11-01 13:26:34
    【杭州SEO优化】网站建设细节分析!企业网站的建设一直都是麻烦事,新颖精致的网站风格,很容易在短时间内吸引顾客的注意力。如果客户的眼睛被锁定,他们将继续浏览网站,从而为企业创造了许多可能性。但是有这么多...
  • 近日,阿里云栖社区发布一篇技术贴,全面揭秘淘宝全站HTTPS的技术改造细节,用实践消除了业界对全站HTTPS改造的疑虑,为电商平台全站HTTPS改造起到积极的带动作用。淘宝全站HTTPS改造技术细节 以下内容引用自《淘宝...
  • 浅谈RPC服务治理服务

    千次阅读 2018-04-02 19:44:20
    面向服务的架构SOA 任何大型网站的发展都伴随着网站架构的演进。网站架构一般最初是单应用设计,然后逐渐经历面向对象设计和模块化设计的架构,最终发展到面向服务服务化架构。在单应用设计架构体系当中,我们...
  • 自己动手——快速搭建Java应用服务器

    万次阅读 多人点赞 2017-05-08 11:33:17
    ——2017.05.13 今天开始写Java Web的编写,写了之后才发现,这个确实挺麻烦的,各种细节需要各种截图,已经在上面挂上了链接,没写完,可以先看看前面的准备部分。 ——2017.05.15 今晚终于抽空写完了Java Web的...
  • 从技术细节看美团的架构

    千次阅读 2016-02-19 14:51:42
    国内曾经出现的团购类网站有6400多家,到四年多以后的现在,美团已经是成为国内最大的本地生活服务平台,不管怎么说,现在美团在这些电商,至少团购类的电商里边是走的比较成功的,如果说电商真的是没有门槛,那难道...
  • 阿里云ECS 云服务器和轻量应用服务器 区别

    万次阅读 多人点赞 2019-05-28 11:05:22
    轻量应用服务器是面向入门级云计算及简单应用用户,提供基于单台云服务器的域名管理、应用部署、安全和运维管理的一站式综合服务。用户可以选择精品应用镜像(比如wordpress),并可在控制台实现全方位的服务器、...
  • 决定高薪必要的细节守则

    千次阅读 2008-09-11 10:09:00
    决定高薪必要的细节守则 8点到10点之间,是在有目的性阅读,还是为明天的事情做准备,甚至在充电专业或研习第二专长?不管是哪一样,都有可能迈向成功,一个非常了解自己需要,同时也懂得善待时间的人不可能是一个...
  • 一文带你搞定TCP面试所有细节_TCP详谈

    万次阅读 多人点赞 2021-06-07 17:42:02
    等待一段时间没有收到重发就说明服务的已经CLOSE了。如果有重发,则客户端再发送一次ACK信号。 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文...
  • 大师级别的UE设计细节

    万次阅读 多人点赞 2013-12-03 11:26:31
    Disney的多彩文化做到了极致。 Parents的红绿蓝三色系色调搭配的有理有条,看起来很个性也很温暖。 TasteofHome的红色不仅仅是Logo,包括广告图片都做了过渡色的处理,让网站看起来很...
  • 以上实现了全球同服 服务器技术架构,可以实现全球玩家同服,细节方面就不多说了,比如使用哪种通信协议,开发逻辑使用lua开发等等。其实,它的主要原理还是利用了Web架构的设计,要假设全球同服 服务器,读者主要...
  • 当然,正所谓技高人胆大,想要做到鱼和熊掌兼得,也不是不可能的.如何权衡整体的得失做出全局性的决策,让系统的综合性能达到最高,是一名架构师安身立命的核心技能之一. 1.领域模型:重中之重 从mvc谈起,...
  • 选择棋牌游戏接口要注意哪些细节

    千次阅读 2018-01-02 14:03:36
    大雄游戏目前开发的棋牌游戏已经发展到3D效果的水平,而且也会在各个娱乐平台的要求下修改界面的LOGO、皮肤、板块,实现个性化的定制服务。  4  更新游戏  注码玩家在一定时间会感觉到电子游艺的疲惫,所以要及时...
  • [后端服务]后端程序健壮性几点思考

    千次阅读 2017-01-04 10:29:31
    对每一个程序员而言,故障都是悬在头上的达摩克利斯之剑,都唯恐避之不及,如何避免故障是每一个...对于这一问题,大家都可以从需求分析、架构设计 、代码编写、测试、code review、上线、线上服务运维等各个视角
  • 聚类、K-Means、例子、细节

    万次阅读 多人点赞 2017-11-22 21:24:55
    如果要优化客户服务的渠道,那么就应选择与渠道相关的数据;如果要推广一个新产品,那就应该选用用户目前的使用行为的数据来归类用户的兴趣。算法是无法做到这一点的 欠缺经验的分析人员和经验丰富的分析人员对于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 120,466
精华内容 48,186
关键字:

如何做到细节服务