这是一个很经典的面试题,也是一个非常难的问题,既考广度有考深度,如果详细说来可以写成一本书了,而且借助搜索引擎,内容也是一大把,眼花缭乱。在这里将自己学到的东西记录起来,持续更新!
入门理解
- 浏览器查找域名的IP地址
- DNS解析
- IP服务器建立Socket连接
- 三次握手
- 浏览器与服务通信
- 四次挥手
- 断开连接
进阶版
在百度查找到的大神用一个淘宝买毛衣故事来描述URL加载过程,觉得讲得很牛逼哇!设计到的知识点很深入!
1.DNS解析
- 域名转换成IP。
- 不同的地区或者不同的网络(电信、联通、移动)的情况下,转换后的ip地址很可能是不一样的,这首先涉及到负载均衡的第一步,通过DNS解析域名时将你的访问分配到不同的入口,同时尽可能保证你所访问的入口是所有入口中可能较快的一个。
2.服务器响应
- 一个日PV/UV巨大的站点,即便仅生成首页的服务器,背后不可能仅有一台(分布式与集群),那么你的一次访问时生成页面给你看的任务便会被分配给其中一台服务器完成。这个过程要保证公正、公平、平均,这一很复杂的过程是由几个系统配合完成,其中最关键的便是LVS(Linux Virtual Server),世界上最流行的负载均衡系统之一,正是由目前在淘宝网供职的章文嵩博士开发的。
3.浏览器得到服务器响应的内容
- 经过一系列复杂的逻辑运算和数据处理,HTML内容便生成成功。
- 加载页面中用到的css、js、图片等样式、脚本和资源文件。
- 浏览器在同一个域名下并发加载的资源数量是有限制的,如此小的并发连接数自然会加载很久。所以前端开发人员往往会将上述这些资源文件分布在好多个域名下,变相的绕过浏览器的这个限制。
4.内容分发
- 对于访问流量巨大的站点,比如淘宝双11,这些访问流量不可能集中在一起。不然完全有能力拖垮一个中小城市的全部互联网带宽。
- 不同地区不同网络(电信、联通等)之间互访会非常缓慢,这就需要CDN(Content Delivery Network),即内容分发网络的作用。比如淘宝在全国各地建立了数十上百个CDN节点,利用一些手段保证你访问的(这里主要指js、css、图片等)地方是离你最近的CDN节点,这样便保证了大流量分散已经在各地访问的加速。
5.内容同步
- 假若一个卖家发布了一个新的宝贝,上传了几张新的宝贝图片,那么淘宝网如何保证全国各地的CDN节点中都会同步的存在这几张图片供用户使用呢?这里边就涉及到了大量的内容分发与同步的相关技术。淘宝开发了分布式文件系统TFS(taobao file system)来处理这类问题。
6.搜索功能
- 分词操作:英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。
- 购物意图分析,通过对你的购物意图的分析,主搜索会呈现出完全不同的结果来。
- 浏览型:没有明确的购物对象和意图,边看边买,用户比较随意和感性。
- 查询型:有一定的购物意图,体现在对属性的要求上。
- 对比型:已经缩小了购物意图,具体到了某几个产品。
- 确定型:已经做了基本决定,重点考察某个对象。
- 主搜索系统便根据上述以及更多复杂的条件列出了搜索结果,这一切是由一千多台搜索服务器完成。
7.快照
- 效果:当你买过了一个宝贝之后,即便是商家多次修改了宝贝详情页,你仍然能够通过‘已买到的宝贝’查看当时的快照。
- 目的:防止商家对在商品详情中承诺过的东西赖账不认。
- 对于每年数十上百亿比交易的商品详情快照进行保存和快速调用不是一个简单的事情。这其中又涉及到数套系统的共同协作,其中较为重要的是Tair,淘宝自行研发的分布式KV存储方案。
8.访问行为记录
- 无论你是否真正进行了交易,你的这些访问行为便忠实的被系统记录下来,用于后续的业务逻辑和数据分析。
- 这些访问是分布在各个地区很多不同的服务器上的,并且由于用户众多,这些日志记录都非常庞大,达到TB级别非常正常。那么为了快速及时传输同步这些日志数据,淘宝研发了TimeTunnel,用于进行实时的数据传输,交给后端系统进行计算报表等操作。
9.分析挖掘
1.你的浏览数据、交易数据以及其它很多很多的数据记录均会被保留下来。使得淘宝存储的历史数据轻而易举的便达到了十数甚至更多个PB(1PB=1024TB=1048576GB)。如此巨大的数据量经过淘宝系统1:120的极限压缩存储在淘宝的数据仓库中。并且通过一个叫做云梯的,由2000多台服务器组成的超大规模数据系统不断的进行分析和挖掘。
- 从这些数据中淘宝能够知道小到你是谁,你喜欢什么,你的孩子几岁了,你是否在谈恋爱,喜欢玩魔兽世界的人喜欢什么样的饮料等,大到各行各业的零售情况、各类商品的兴衰消亡等等海量的信息。
高级版
作者介绍了好多底层硬件相关的东西哇,乃真大神了,作为软件开发人员就自动屏蔽了哈。
- 浏览器对URL进行协议检查和安全检查,然后调用浏览器内核对应的发方法
- 浏览器内核中会先查看缓存,然后设置 UA 等 HTTP 信息,接着调用不同平台下网络请求的方法。
- HTTP 请求的发送
- 通过 DNS 查询 IP,DNS 查询其实是基于 UDP 来实现的
- 通过 Socket 发送数据,可以选择 TCP 或 UDP 协议,HTTP 常用的是 TCP 协议。
- 进入应用服务器,可能会有
- 负载均衡
- LVS(eg:NAT)
- 反向代理(eg:Nginx)
- 进入到对应服务器上的 Web Server(比如Apache、Tomcat、Node.JS 等)
- 数据到达浏览器后
- 有压缩需要解压
- 外链资源的加载
- JavaScript 的执行
为了解决 TCP 协议的性能问题,Chrome 团队去年提出了 QUIC 协议,它是基于 UDP 实现的可靠传输,比起 TCP,它能减少很多来回(round trip)时间,还有前向纠错码(Forward Error Correction)等功能。目前 Google Plus、 Gmail、Google Search、blogspot、Youtube 等几乎大部分 Google 产品都在使用 QUIC,可以通过 chrome://net-internals/#spdy 页面来发现。
域名解析
概念
- IP 地址:IP 协议为互联网上的每一个网络和每一台主机分配的一个逻辑地址。
- 域名( DN ):IP 地址由四个数字组成,中间用点号连接,在使用过程中难记忆且易输入错误,所以用我们熟悉的字母和数字组合来代替纯数字的 IP 地址
- DNS: 每个域名都对应一个或多个提供相同服务服务器的 IP 地址,只有知道服务器 IP 地址才能建立连接,所以需要通过 DNS 把域名解析成一个 IP 地址。
DNS查找过程
- 浏览器搜索自己的 DNS 缓存(维护一张域名与 IP 地址的对应表)
- 搜索操作系统中的 DNS 缓存(维护一张域名与 IP 地址的对应表)
- 搜索操作系统的 hosts 文件(维护一张域名与 IP 地址的对应表)
- 操作系统将域名发送至 LDNS。查找成功则返回结果,失败则发起一个迭代 DNS 解析请求;
- LDNS 向 Root Name Server (根域名服务器,其虽然没有每个域名的的具体信息,但存储了负责每个域,如 com、net、org等的解析的顶级域名服务器的地址)发起请求,此处,Root Name Server 返回 com 域的顶级域名服务器的地址;
- LDNS 向 com 域的顶级域名服务器发起请求,返回 baidu.com 域名服务器地址;
- LDNS 向 baidu.com 域名服务器发起请求,得到 www.baidu.com 的 IP 地址;
- LDNS 将得到的 IP 地址返回给操作系统,同时自己也将 IP 地址缓存起来;
- 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来;
- 至此,浏览器已经得到了域名对应的 IP 地址。
备注
- 域名与 URL 是两个概念:域名是一台或一组服务器的名称,用来确定服务器在 Internet 上的位置;URL 是统一资源定位符,用来确定某一个文件的具体位置
- IP 地址与域名不是一一对应的关系:可以把多个提供相同服务的服务器 IP 设置为同一个域名,但在同一时刻一个域名只能解析出一个 IP地址;同时,一个 IP 地址可以绑定多个域名,数量不限;
网页请求与显示
网页请求是一个单向请求的过程,即是一个主机向服务器请求数据,服务器返回相应的数据的过程。
- 浏览器根据 URL 内容生成 HTTP 请求,请求中包含请求文件的位置、请求文件的方式等等;
- 服务器接到请求后,会根据 HTTP 请求中的内容来决定如何获取相应的 HTML 文件;
- 服务器将得到的 HTML 文件发送给浏览器;
- 在浏览器还没有完全接收 HTML 文件时便开始渲染、显示网页;
- 在执行 HTML 中代码时,根据需要,浏览器会继续请求图片、CSS、JavsScript等文件,过程同请求 HTML ;