江边闲话集

从浏览器中输入URL到页面加载发生了什么 – Part 1

背景 “从浏览器中输入URL到页面加载的发生了什么“,这是一道经典的面试题,涉及到的知识面非常多,但作为一个自认为对网络知识掌握的比较好的老码农来说,回答这个问题自然不在话下。如果这道题目如果在面试出现,对我来说就是送分题啊。尽管如此,我还是愿意花一些时间根据我自己的理解回答一下这个题目,看我自己到底掌握的有多深,同时也把自己的知识梳理一下。 这让我想起另外一件往事,这道题有点类似于“在手机上浏览器上输入一个URL,手机做了一些什么”,我当时学习通信里的核心网时就给自己提出过这个问题。 我非常愿意将这个面试题的答案共享出来,一是希望得到大家的意见,二是也希望对那些不是特别熟的人起到一些帮助。 因为文章较长,我将它们分为三大部份,后面会提供该文章的完整PDF版本,供大家下载。 从本文里学到什么? 正如前面所说,这篇文章涉及到的知识面非常丰富,我相信您绝对可以从本文里学到很多基础知识,还有一些高级话题。 DNS的解析原理,常用命令,端口等 TCP/IP模型,三次握手,四次挥手。 HTTP/HTTPS的原理和解析。 浏览器render一个页面 Web安全性问题 抓包,分析TCP模型,三次握手,SSL/TLS,让学起来不再枯燥。 其他一些高级话题。 自认为是目前写的最详细的一篇文章了,因为里面有理论,有实战,应该会起到一个比较好的效果。 总概: 几大步骤 总的来说,当你输入在浏览器里输入一个URL到页面加载,发生的顺序如下: DNS查询 TCP连接 发送HTTP请求 Server处理HTTP请求并返回HTTP报文 浏览器解析并render页面 HTTP连接断开 后面将对以上步骤详细介绍。 DNS查询 DNS解析流程 假设输入的URL是包含域名的,那肯定会涉及到DNS解析。当然,如果URL仅仅是IP,那就不会涉及到DNS的。域名的出现是为了方便记忆,因为域名比IP好记。我们这里假设URL包含域名。 解析的步骤大致如下图: 首先,在本地域名服务器中根据域名查询IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求。 如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器(TLD)发送一个请求,依次类推下去。 直到最后本地域名服务器得到google的IP地址并把它缓存到本地,供下次查询使用。 可以参考页面https://www.verisign.com/en_US/website-presence/online/how-dns-works/index.xhtml ,该页面诠释了DNS的过程。 需要说明的是Root DNS Server一般有13个,后面有个点(.),别忘了。 a.root-servers.net. c.root-servers.net. j.root-servers.net. b.root-servers.net. i.root-servers.net. d.root-servers.net. k.root-servers.net. f.root-servers.net. l.root-servers.net. h.root-servers.net. m.root-servers.net. g.root-servers.net. e.root-servers.net. DNS的优化 我们发现,一个DNS查询在没有缓存的情况下会有6步,这将是一个耗时的过程,如果DNS 查询时间过长,甚至会影响到用户体验。 那么现阶段是怎么优化的呢?缓存。DNS是存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。 我们以Chrome为例子,输入chrome://net-internals/#dns,我们会看到如下界面: […]

继续阅读...

iPhone到底贵不贵?

自从新iPhone 出来后,最大的话题莫过于它的价格,太贵了。那中国大陆这边来说,起步价比前些年高了不少。拿最受欢迎的iPhone Xs Max 256G来说,高达10,999元,估计好多人看到这个价格后,心都碎了。而且按照消费心理,1W可是一大门槛。9999和10001的效果是不是一样的。 今天,在雷锋网的公众账号上看到一则新闻,说“64GB 版苹果 iPhone XS Max 物料成本为 390 美元”,然后在Forbes上也看到类似的文章The iPhone XS Max Could Be A Profit Machine。在这篇文章里,数据来源说是IHS Markit,这家机构的数据还是挺权威的,毕竟IHS就是干这事的。 iPhone  Xs Max 64G在大陆卖9,599RMB,390美金折合人民币2,678(按6.87的汇率),估计好多人一看到这个数字就觉得苹果太过份了,不到3K块的东西你Apple凭什么卖到接近1万块。 OK,如果我们是Apple,站在Apple的角度上,如何去思考这个问题呢? Apple作为一个商业公司,利润是它追求的。所以,每次新的iPhone出来,我估计Apple在定价方面都是绞尽脑汁。如果是你Apple,你怎么去定价?如果定价便宜了,不挣钱,定价贵了,势必影响销量。为了利润,为了股价稳定,Apple必须拿出一个合理的价格来。定得太高或者太低,都会引起股价的不稳定或下跌。 那么Apple是如何定价的?一般来说,iPhone的定价可以从以下几个方面去考虑: BoM,Billing of Materials,也就是物料费,制造一台手机的费用。 COGS,Cost of Goods Sold,即销售iPhone的成本。当Apple造手机时,Apple也需要成本给所有在iPhone上的开发人员,产品人员等,这个费用也包含了产品立项,产品线,物流,仓库,以及其他费用。这个上面有优化的余地,凭Tim Cook以前做运营的,应该是把这方面优化到极致了吧. 另,COGS是包含BOM的。 Profit。很简单,Apple想要的利润。 Distributor。Apple想把iPhone卖出去,靠几个Apple Store是不可能的。在各个国家或地区需要一些分发商,有了这些分发商,Apple才有可能高效率的把自己家的产品卖给消费者。 Retailer。即零售商。需要注意一点的是,Apple Store这样的零售商的成本应该是要比传统的零售商或者分发商成本要高很多。当然,很多时候,Apple Store除了卖机器,还承担一部分Customer Care的功能。 所以一台iPhone的零售价(MSRP)等于COGS + Profit + Distributor + Retailer。 可以简单用这张图表示: 再回到iPhone的零售价上。Forbes的网站上贴了下面这张图,看了这张图,最大的感受什么?我们发现,BOM在MSRP里所在百分比和这几年差不多,当然和2017年的iPhone X […]

继续阅读...

对顺丰删库事件的思考

这几天,每次在各个新闻app和圈子里出现该事情,我是感到很诧异和遗憾。 顺丰作为国内快递行业上市公司的第一名,市值约1800亿人民币。作为这样一个量级的公司,出现这种情事情,的确是不应该的。总体来说,我对这件事情的印象是: 顺丰IT水平可能不好。 顺丰IT管理肯定是存在很大的漏洞。 该工程师技能应该是比较弱的。 顺丰最应该考虑的是如何避免这种事情再次发生。 一直以来,在软件工程里,前期开发很重要,到了后期,运维又变得重要了。所以,任何一个公司,绝对不可以小觑运维的重要性。一个规范化的公司,在软件运维上必须有自己的制度和规范。 在我看来,当一个公司发展到了一定规模后,制度是要比人的主观能力要重要。说回这次事故,该如何去避免?或者说一个正常的运维是什么样的? 首先,对于不同角色,严格控制其权限和职责,例如研发有研发的权限,运维工程师有运维工程师的权限,DBA有DBA的权限。每个角色的权限是相对的。 其次,如果做一项升级,前期工作必须做好。一般来说,先申请一个时间窗口去升级,这个申请,必须按照相关的流程去审批。其次,如果申请通过,需要准备好升级的步骤(至于是手动还是自动,后面再讲),形成文档。接下来,将该文档提交给相关team去审核,审核通过后到了维护的时间窗口根据文档去做升级即可。那么该文档怎么写: 包含每个模块升级的每一步骤。 必须准备好升级失败后如何rollback的步骤。 能用脚本执行则用脚本执行,避免人工执行每一个步骤。 涉及到删除数据,更改数据,增加数据等操作,务必谨慎,有必要在lab环境里跑一次。要条件的化,QA可以介入其中。 升级文档要经过几个team的审核,尤其是对那些复杂的升级。 接下来,就开始干活了。至于是手动还是自动升级,都非常关键。在我看来,越是自动化,说明公司运维水平越高,反之,越是手动,公司运维水平就越低。例如,假设现在去升级某个web app,但是这个web app部署在不同pop(假说m个),不同pop又有n个实例,那么最后要升级m*n个实例,试想一下,如果2*2=4,手动还可以。如果是2*10=20,手动还可以接受吗? 为什么要强调自动化呢?很简单,我们要尽量降低认为错误。毕竟,人犯错误的可能性是非常大的,因为升级的时间窗口往往都是大半夜,这个时候,人处于疲惫状态,很容易出现认为的错误,而且很多时候不可预测。例如,计划删除数据库里的某些数据,通过执行SQL语句DELETE FROM table1 WHERE id=12可以达到该墓地。因为网络错误,或者id=12输入到1时,手抖,按了enter,这样就会误删,想想是不是很可怕。除了这些,还有rm 命令等。如果我们前期在准备升级文档时,把这些SQL放到脚本里去执行,那么人为错误的概率就会大大降低。 在这件事情上,运维工程师犯错了,一点不冤,需要惩罚,但是务必达到教育的效果。同时,这件事情也需要引起运维部门的高层的注意,例如Director,VP甚至COO级别的,否则,这种事情还会不断出现。我觉得,在本次事件中最大的隐患还是制度的缺失和升级方法导致的,所以在流程上改进改进再改进,方法上优化优化再优化。 最后,运维是一个非常有技术含量的活儿,同时也是靠制度撑起它的。别小看它,必须重视,否则出现什么问题,大晚上被叫起来的概率就会增加。

继续阅读...

工作以后最艰难的时刻

和同事和朋友交流时,有一个问题令我非常感触,那就是工作以后最艰难的时刻时什么时候。 后来又有知乎上一个类似的问题,我觉得挺有趣的。 自从自己工作以来,到目前为止,应该有2个时刻我认为非常艰难,令人难忘。 第一个时刻,2003年 2003年我毕业后刚开始工作时,发现自己在学校里的知识完全不够用,和公司里的其他毕业生相比较,真是差的蛮远的。我是一个很要强的人,如果因为自己能力不足而不能胜任这份工作,我会赶到羞愧。所以,我当时分成2步,第一步是赶上其他毕业生,同时胜任工作 第二步是在工作中作出优异的成绩。这两步都需要自己的技术本领过硬。所以从上班的第一天起,每天下班回到家后都会学到晚上12点到凌晨1点,第二天里6点起床继续学习到8点左右。感谢东华大学,因为当时住的地方离东华大学近,所以都蹭他们教室。也感谢上海书城和交大旁边的昂立书店,好多专业的书籍。同时也感谢上海图书馆,如果有时间我都会去那边。这样经过大半年的时间,我认为我的技术水平有一个质的飞跃。工作上能够胜任,甚至有时候会出彩。这是一段艰难的时候,白天上班,晚上学习,一种不服输,一种自信时刻支持着我。 第二个时刻,2011年-2012年 这段时间是我从北京派到西安build office。因为自己原来没有管理经验,而且要去西安build一个新office和团队,我的老板有作出这样的决定需要何等勇气,感谢老板给我机会。我也认为这是一个好机会。还是发扬自信不服输的作风,我给自己订的目标是一定要撑起来。所以,当我到了西安后,既要面对office一些各种前所未有的事情,也要去带团队,最后还要把产品做好。所有的事情必须在短时间内做完,现在想想当时压力也蛮大的。为了达到这些目标,和不同的人接触,跟不同的人请教,当然也自己私下学习。最后还是终于挺过去了,感谢我的家人对我的支持,感谢我的老板的魄力和支持,同时也感谢整个office的人。还要感谢那些帮助过我的人。 现在会想起这2个时候,的确是非常难的经历,给了自己很多表率和正能量,当然也有自己一颗不服输的心。

继续阅读...

买部什么手机

最近一个月,实在太忙,新产品的开发,公司的一些事情忙的不可开交。今天,礼拜五,终于闲下来一些,在这里写一篇文章吧。 iPhone的合约已经到期,所以,我在思考一个问题,我该选一部什么样的手机。 大屏幕 前面一段时间,买了一台Windows Phone手机,4寸的,用起来还不错,就是windows phone的app太少,令人遗憾,同时,也有一些硬伤。不过,有一点我彻底被改变了,那就是用惯了一台大屏幕的手机后,再回到小尺寸的手机,对于我来说是不可以接受的事情。 所以,接下来的屏幕不可能低于4寸的了。 有个性 用了2年iPhone,不得不说,iPhone是一部上乘之作,尤其是我的iPhone手机屏幕摔坏之后,自己花了一个晚上将手机拆卸,然后复原。虽然挺复杂,但是过后一想,其实也没那么复杂, 其工业设计绝对算是一流。也正因为此,iPhone成了大多数人心仪的手机。导致,地铁,公交,城市,农村,到处都是iPhone。当达到如此程度后,iPhone在我这里失去了意义。而且用了2年多,对iPhone已经开始厌倦了,想换点新的,这不正符合我好奇的心理么? 所以,下一步手机不会是iPhone,除非有特别之处。 生态圈 生态圈对于一部手机非常重要。原来我不这么认为,但是自从买了Windows Phone之后,我发现自己依赖手机很严重,依赖手机带给我的快乐。因为我喜欢手机上的新鲜玩意。虽然Windows Phone一开始给我带来了快感,但是过后因为其生态圈的不完善,导致我非常不适应缺乏新鲜感的那种感觉。 所以,从目前来看,也只有iOS和Android符合这一条件。 用户体验 尽管我现在从事app的管理和开发,但是一直以来,我对Android的用户体验嗤之以鼻,因为1.x和2.x给我带来了不能容忍的用户体验,这也是我为什么这几年从来不把Android手机当成自己的日常手机。也许有人问,你不是搞这个的吗,你不用,怎么明白你的软件设计的还不好?我想说的是,这和我用不用没毛的关系。也真因为此,我才知道Android手机的弊端。 用完iOS和Android,以及Windows Phone, iOS是用户体验最好的。用过Android 4.x,用户体验改善不少,但是还远没达到我的期望。 质量上层 我需要的手机必须是质量上层,否则宁可不买。iPhone 5的做工很好,HTC One的做工也不粗,就是因为国内的双卡双待,搞的后盖可以分离,算是败笔。S4的后盖还他妈的塑料壳。Samsung真是坑了不少人啦。Samsung还是营销做得好。 售后 老实说不太关心,当然售后好也会在我这里加分。不过用过这么多手机,好像还没和售后打过交道呢。 综合以上,目前只能从iPhone 5, HTC One以及Samsung S4选择,最后我可能从iPhone 5以及 HTC One做出final decision。 等Apple的WWDC开完再说。

继续阅读...