江边闲话集

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

HTTP/HTTPS请求和响应 前面TCP连接已经建立好了,意味着桥已经搭好了,下一步就该传输HTTP消息了。因为HTTP我们都很熟悉,很常见,也不是那么底层,理解起来轻松不少。 还是抓包来分析,不过这次不用Wireshark来抓,因为不太直观,这次直接用Chrome自带的Developer Tools。 HTTP 请求 下图展示了HTTP请求Header Request URL:就是请求的URL Request Method: GET, POST, PUT,DELETE, OPTIONS, HEAD 接下来就是其他报文头,常见的请求报头有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent等。 HTTP 响应 下图展示了HTTP响应Header 最常见的就是Status Code( 200, 302, 307, 404, 500),server等。 HTTP 10问 HTTP问题简单,那就直接列举几个问题,有些问题我给出详细答案。 1. HTTP METHOD有哪几种,分别是什么? 常见问题,不多解释。 2. HTTP的PUT/DELETE/等使用时需要注意什么? 有一点需要特别注意,有的浏览器是不支持的,所以在使用和实现时需要仔细评估好自己客户端的能力。 3. HTTP的OPTIONS用来做什么? OPTIONS一般用来获取目标资源的通信选项,例如确认允许的HTTP Method.下面的这个例子来在Mozilla官网https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS。 请求: curl -X OPTIONS http://example.org -i 响应: HTTP/1.1 200 […]

继续阅读...

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

TCP连接 DNS解析返回域名的IP之后,接下来就是浏览器要和该IP建立TCP连接了。为什么是TCP而不是UDP?那是因为HTTP是基于TCP上的。这里涉及到另外一个话题:TCP/IP 模型。这个已经在大学的课本上学过了,我们再复习一下。 TCP/IP模型 TCP/IP模型一般分为4层,下面是我用PPT画的。 在这里不得不说OSI七层参考模型,它和TCP/IP模型的区别和联系,继续用PPT画,见下图: 不多解释,OSI的7/6/5层和TCP/TP的应用层对应,2/1层和链路层对应。在实际的应用中,主要还是TCP/IP概念模型,后面的内容主要讲它。 这些都是课本上的,也许忘了(毕竟不是天天用到这些嘛),没关系,我们以最简单的方式来讲解。为了便于理解每层的含义和作用,先看每层有哪些协议,看看有没有自己熟悉的协议。有熟悉的协议,先体会一下。 应用层 我们可以看到,有常用的HTTP/HTTPS/IMAP/SSH/Telnet等都在应用层上(题外话,这一层你用的协议越多,说明你知识越开阔)。相信每个人都用过HTTP/HTTPS,所以我上面说HTTP/HTTP是基于TCP上的。 Wikipedia 这么解释: The application layer is the scope within which applications create user data and communicate this data to other applications on another or the same host. The applications, or processes, make use of the services provided by the underlying, lower layers, especially the Transport Layer which […]

继续阅读...

从浏览器中输入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级别的,否则,这种事情还会不断出现。我觉得,在本次事件中最大的隐患还是制度的缺失和升级方法导致的,所以在流程上改进改进再改进,方法上优化优化再优化。 最后,运维是一个非常有技术含量的活儿,同时也是靠制度撑起它的。别小看它,必须重视,否则出现什么问题,大晚上被叫起来的概率就会增加。

继续阅读...