写这篇文章是因为这学期学习了《计算机网络自顶向下》,另外课下也在看《HTTP权威指南》、《图解HTTP协议》,OSI模型中各种layer又有多种protocol,它们的作用很容易混淆,希望写下来整理这方面学习。另一个原因是,在没有学习计算机网络之前,看到FEX团队出了一个经典的面试题目:输入一个URL地址到页面加载完成发生了什么事情?我知道这里面的逻辑很复杂,有些实现细节可能现在都不理解,希望尽力梳理一下。
一、术语
1.传输单位
先讲一讲各层的传输单位,应用层是报文(message),报文在发送之前一般会划分成为等长的数据段,在每段前面加上一些必要的控制信息组成的首部后,就构成了一个分组(packet),也叫做包,首部也可叫包头。无论在哪一层传送的数据单元,习惯上都可以笼统地用分组来表示。
传输层主要使用TCP和UDP,如果使用TCP的话,单位是报文段(segment),UDP的单位是用户数据报。在发送数据时,网络层把传输层产生的报文段或者用户数据报封装成分组或包进行传送,由于网络层使用IP协议,分组也叫做IP数据报,简称数据报。 数据链路层将网络层交下来的IP数据报组装成帧(framing),物理层单位是比特,就是0和1
2.中间设备
从一般的概念讲,讲网络互联起来要使用一些中间设备,物理层使用的中间设备叫做转发器(repeater),数据链路层使用的中间设备叫做网桥或桥接器(bridge),网络层使用的中间设备叫做路由器(router),网络层以上使用的中间设备叫做网关(gateway)。
二、OSI模型
不论是接收端还是发送端,每一层次只认识对方的同一层次的数据。而整个传送的过程就好像人们在玩整人游戏一般,我们通过应用程序将数据放入第七层的包裹,再将第七层的包裹放到第六层的包裹内,依序一直放到第一层的最大的包裹内,然后传送出去给接收端。接收端的主机就得由第一个包裹开始,依序将每个包裹拆开,然后一个一个交给对应负责的层次来查看。这就是OSI 七层协议在层次定义方面需要注意的特色。
既然说是包裹,那我们都知道,包裹表面都会有个重要的信息,这些信息包括有来自哪里、要去哪里、接收者是谁等,而包裹里面才是真正的数据。同样的,在七层协议中,每层都会有自己独特的头部数据(header),告知对方这里面的信息是什么,而真正的数据就附在后头。
各层的作用如下图所示:
1.应用层
负责对软件提供接口以使程序能使用网络服务。“应用层”并不是指运行在网络上的某个特别应用程序 ,应用层提供的服务包括文件传输、文件管理以及电子邮件的信息处理。
2.传输层
这一个分层定义了发送端与接收端的连接技术(如 TCP、UDP 技术),同时包括该技术的数据包格式、数据包的发送、流程的控制、传输过程的侦测检查与重新传送等,以确保各个资料数据包可以正确无误的到达目的端
3.网络层
这一层定义出计算机之间的连接建立、终止与维持等,数据数据包的传输路径选择等,因此这个层次当中最重要的除了 IP 之外,就是数据包能否到达目的地的路由 (route) 概念了
4.数据链路层(MAC、LLC)
这一层分两个子层进行数据的转换操作。在偏硬件介质部分,主要负责的是 MAC (Madia Access Control),我们称这个数据包裹为 MAC 数据帧 (frame),MAC 是网络接口设备所能处理的主要数据包裹,这也是最终被物理层编码成比特流的数据。
至于偏向软件的部分则是由逻辑链接层 (Logical Link Control, LLC) 所控制,主要在多任务处理来自上层的数据包数据 (packet) 并转成 MAC 的格式,负责的工作包括信息交换、流量控制、失误问题的处理等
5.物理层 Physical Layer
由于网络传输介质只能传送 0 与 1 这种比特位,因此物理层必须定义所使用的传输设备的电压与信号等,同时还必须了解数据帧转成比特流的编码方式,最后连接实际传输介质并发送/接收比特信号
三、协议
先来一个复杂版的:
再看一个简易版的:
涉及到的协议大概分布如下:
四、输入一个URL地址到页面加载完成发生了什么事情?
1)比较经典的解释是FEX团队的:http://fex.baidu.com/blog/2014/05/what-happen/
2)下文转自子柳《淘宝技术十年》:
你发现快要过年了,于是想给你的女朋友买一件毛衣,你打开了www.taobao.com。这时你的浏览器首先查询DNS服务器,将www.taobao.com转换成ip地址。不过首先你会发现,你在不同的地区或者不同的网络(电信、联通、移动)的情况下,转换后的ip地址很可能是不一样的,这首先涉及到负载均衡的第一步,通过DNS解析域名时将你的访问分配到 不同的入口,同时尽可能保证你所访问的入口是所有入口中可能较快的一个(这和后文的CDN不一样)。
你通过这个入口成功的访问了www.taobao.com的实际的入口ip地址。这时你产生了一个PV,即Page View,页面访问。每日每个网站的总PV量是形容一个网站规模的重要指标。 淘宝网全网在平日(非促销期间)的PV大概是16-25亿之间。同时作为一个独立的用户,你这次访问淘宝网的所有页面,均算作一个UV(Unique Visitor用户访问)。最近臭名昭著的12306.cn的日PV量最高峰在10亿左右,而UV量却远小于淘宝网十余倍,这其中的原因我相信大家都会知道。
因为同一时刻访问www.taobao.com的人数过于巨大,所以即便是生成淘宝首页页面的服务器,也不可能仅有一台。仅用生成www.taobao.com首页的服务器就可能有成百上千台,那么你的一次访问时生成页面给你看的任务便会被分配给其中一台服务器完成。这个过程要保证公正、公平、平均(暨这成百上千台服务器每台负担的用户数要差不多),
这一很复杂的过程是由几个系统配合完成,其中最关键的是LVS,Linux Virtual Server,世界上最流行的负载均衡系统之一,正是由目前在淘宝网供职的章文嵩博士开发的。
经过一系列复杂的逻辑运算和数据处理,用于这次给你看的淘宝网首页的HTML内容便生成成功了。对web前端稍微有点常识的童鞋都应该知道,下一步浏览器会去加载页面中用 到的css、js、图片等样式、脚本和资源文件。但是可能相对较少的同学才会知道,你的浏览器在同一个域名下并发加载的资源数量是有限制的,例如ie6-7是两个,ie8是6
个,chrome各版本不大一样,一般是4-6个。我刚刚看了一下,我访问淘宝网首页需要加载126个资源,那么如此小的并发连接数自然会加载很久。所以前端开发人员往往会将上述这些资源文件分布在好多个域名下,变相的绕过浏览器的这个限制,同时也为下文的CDN工作做准备。
据不可靠消息,在双十一当天高峰,淘宝的访问流量最巅峰达到871GB/S。这个数字意味着需要178万个4mb带宽的家庭宽带才能负担的起,也完全有能力拖垮一个中小城市的全 部互联网带宽。那么显然,这些访问流量不可能集中在一起。并且大家都知道,不同地区不同网络(电信、联通等)之间互访会非常缓慢,但你却很少发现淘宝网访问缓慢。这便是CDN,Content Delivery Network,即内容分发网络的作用。淘宝在全国各地建立了数十上百个CDN节点,利用一些手段保证你访问的(这里主要指js、css、图片等)地方是离你最近的CDN节点,这样便保证了大流量分散已经在各地访问的加速。这便出现了一个问题,那就是假若一个卖家发布了一个新的宝贝,上传了几张新的宝贝图片,那么淘宝网如何保证全国各地的CDN节点中都会同步的存在这几张图片供用户使用> 呢?这里边就涉及到了大量的内容分发与同步的相关技术。淘宝开发了分布式文件系统TFS(taobao file system)来处理这类问题。
好了,这时你终于加载完了淘宝首页,那么你习惯性的在首页搜索框中输入了'毛衣'二字并敲回车,这时你又产生了一个PV,然后,淘宝网的主搜索系统便开始为你服务了。 它首先对你输入的内容基于一个分词库进行的分词操作。众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我是一个学生。
进行分词之后,还需要根据你输入的搜索词进行你的购物意图分析。用户进行搜索时常常有如下几类意图:(1)浏览型:没有明确的购物对象和意图,边看边买,用户比较随意和感性。Query例如:”2010年10大香水排行”,”2010年流行毛衣”, “zippo有多少种类?”;(2)查询型:有一定的购物意图,体现在对属性的要求上。Query例如:”适合老人用的手机”,”500元 手表”;(3)对比型:已经缩小了购物意图,具体到了某几个产品。Query例如:”诺基亚E71 E63″,”akg k450 px200″;(4)确
定型:已经做了基本决定,重点考察某个对象。Query例如:”诺基亚N97″,”IBM T60″。通过对你的购物意图的分析,主搜索会呈现出完全不同的结果来。
之后的数个步骤后,主搜索系统便根据上述以及更多复杂的条件列出了搜索结果,这一切是由一千多台搜索服务器完成。然后你开始逐一点击浏览搜索出的宝贝。你开始查看
宝贝详情页面。经常网购的亲们会发现,当你买过了一个宝贝之后,即便是商家多次修改了宝贝详情页,你仍然能够通过‘已买到的宝贝’查看当时的快照。这是为了防止商
家对在商品详情中承诺过的东西赖账不认。那么显然,对于每年数十上百亿比交易的商品详情快照进行保存和快速调用不是一个简单的事情。这其中又涉及到数套系统的共同
协作,其中较为重要的是Tair,淘宝自行研发的分布式KV存储方案。
然后无论你是否真正进行了交易,你的这些访问行为便忠实的被系统记录下来,用于后续的业务逻辑和数据分析。这些记录中访问日志记录便是最重要的记录之一,但是前边我们得知,这些访问是分布在各个地区很多不同的服务器上的,并且由于用户众多,这些日志记录都非常庞大,达到TB级别非常正常。那么为了快速及时传输同步这些日志数据,淘宝研发了TimeTunnel,用于进行实时的数据传输,交给后端系统进行计算报表等操作。你的浏览数据、交易数据以及其它很多很多的数据记录均会被保留下来。使得淘宝存储的历史数据轻而易举的便达到了十数甚至更多个PB(1PB=1024TB=1048576GB)。如此巨大的数据量经过淘宝系统1:120的极限压缩存储在淘宝的数据仓库中。并且通过一个叫做云梯的,由2000多台服务器组成的超大规模数据系统不断的进行分析和挖掘。从这些数据中淘宝能够知道小到你是谁,你喜欢什么,你的孩子几岁了,你是否在谈恋爱,喜欢玩魔兽世界的人喜欢什么样的饮料等,大到各行各业的零售情况、各类商品的兴衰消亡等等海量的信息。
说了这么多,其实也只是叙述了淘宝上正在运行的成千上万个系统中的寥寥几个。即便是你仅仅访问一次淘宝的首页,所涉及到的技术和系统规模都是你完全无法想象的,是
淘宝2000多名顶级的工程师们的心血结晶,其中甚至包括长江学者、国家科学技术最高奖得主等众多大牛。同样,百度、腾讯等的业务系统也绝不比淘宝简单。你需要知道的是,你每天使用的互联网产品,看似简单易用,背后却凝聚着难以想象的智慧与劳动。