分布式专题(1)- 计算机网络
说一下从输入网址到获得页面的过程是怎样的?
有一定开发经验的同学都知道,有如下几个过程:
(1). 浏览器对输入的域名进行解析,获取域名对应的IP地址;
(2). 浏览器获得IP地址后,浏览器向服务器请求建立TCP链接;
(3). 链接建立后,浏览器向服务器发送HTTP请求;
(4). 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,一般处理就是执行controller里面的方法,并将处理结果及相应的视图返回给浏览器;
(5). 浏览器根据其请求到的视图、数据渲染页面,显示给用户。
(虽然你可能还不知道域名如何解析成IP,也不知道什么是TCP链接,也不知道HTTP请求具体是什么个概念,但先照着标准答案回答了先)
三次握手
你回答了之后,然后面试官可能会继续问你,浏览器向服务器发起请求时,是怎样建立TCP链接的?
这时候对计算机网络不太了解的同学可能就懵逼了,答不上来,然后面试官可能就会觉得,这个人连这个问题都不知道,行不行啊。了解一点计算机网络的同学就知道,就是三次握手嘛。为什么是三次而不是两次四次,不了解的同学可以看这里。
一般面试官听到三次握手也就满意了,但是你如果去阿里腾讯这些大公司去面试的话,他们肯定会追问说:“嗯,那你再说一下OSI七层模型吧?” 或者会问:“那你知道TCP/IP五层模型吗?” 。如果你这个问题答上来并说清楚了,面试官绝对眼前一亮,对你的印象分蹭蹭蹭地涨,离拿到offer就不远了。
所以我们非常有必要清楚,什么是OSI七层模型,和TCP/IP五层模型。
OSI七层模型、TCP/IP五层模型
OSI定义了网络互连的七层框架,分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP五层模型是把上三层都归为应用层,其原理还是跟OSI七层一样。
如下图:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。共23个字,但它在计算机界的地位,就跟我们5000字的道德经在中国的地位一样。小兵我大学的时候就学过计算机网络这门课,但说来惭愧,那时候吊儿郎当地没听过几节,工作后得重新学习时才发现,卧槽,好像错过了一个亿。这时候想学也没老师教了,只能自己找找资料自己领悟了。在费了不少时间后,小兵我终于对这个模型有了更深刻的认识。然后觉得,好像不是错过了一个亿,是错过了两个亿!!发现它就是我们现今很多技术的总纲!!可以说没有它分布式相关的技术就无从谈起!! 下面小兵我就来说一下我是怎么认识这个两个亿的模型的。
以需求为源头
我是先从需求角度,再从实现的角度去理解这个模型的,
就是为什么人们要提出这个模型?基于什么样的需求才提出的这个模型?如果叫我实现那我如何实现?
然后我们很容易得出答案,需求就是:实现两台计算机通信。
我们先看一下两个主机H1、H2通信的总图,见下图左。图是从网上随便找的,有点模糊,内容好像很多,可能会觉得看不懂,但那都没关系,如果你是第一次看这张图,只要清楚一个事情,那就是数据是从主机H1的应用层产生的,最终会发送到主机H2的应用层。也就是说
数据从一台计算机的应用层,发送到目标计算机的应用层,就实现了两台计算机通信。
而且数据在应用层产生后,并不是变魔术变到了目标计算机的应用层,而是走了长长的一条路,
是从应用层 -> 传输层 -> 网络层 -> 链路层 -> 物理层,中间又经过了N个路由器的物理层链路层网络层,才最终到达目标计算机的应用层。
然后从下图右我们可以看到,我们在应用层产生的数据,到了传输层之后就改叫为【报文】,到了传输层之后就成为【包】,到了数据链路层后就称为【帧】了,到了物理层,就是比特流【bit】了。名字不同,证明数据一路传输下去,每层都对数据做了一些其它的处理,具体什么处理呢,一两句话还真讲不清,我们在后面讲解每层的作用时会说到。
即我们在浏览器输入baidu.com,就是数据baidu.com在应用层产生,然后这条数据进入传输层,网络层,链路层,物理层,经路由转发,最终到达百度服务器,也就是目标计算机的应用层。这就实现了计算机的通信了。然后目标应用层收到这条数据后,会对你的数据进行解析,解析后发现,它需要把百度首页返回给你,然后它就返回了一个html文件给你的浏览器,返回的时候就是要走一条相反的路,从服务器本机的应用层走到物理层,然后中间也是要各路由转发,最终达到你的浏览器,你的浏览器收到这个html之后就可以展示出百度首页了。这就是实现了两台计算机的通信,浏览器、服务器的相互通信也就是HTTP协议的内容了。
上面说了一堆,终于要开始讲到各层的扮演的角色,各层的作用了。讲之前我再次总结一下上面那一大对废话:
总结1:数据从应用层产生
总结2:应用层的数据,发送到目标计算机的应用层,就是实现了两台计算机通信
总结3:应用层的数据,发送到目标计算机的应用层,中间要走很长的一段路
有了三面的三点总结,其实你已经可以回答面试官了,什么是OSI七层模型、TCP/IP五层模型?
你可以回答说:“OSI七层模型,和TCP/IP五层模型,说的就是数据怎么从一台计算机的应用层,发送到另目标计算机应用层的过程。就是我们从应用层产生的数据,会从应用层传输到传输层、网络层、数据链路层、物理层,经过路由转发,最终到达目标计算机应用层,实现计算机通信的过程。”
如果面试官不想深挖的话,能答出上面那句你已经过关了,他会转到其它问题。
如果他继续深挖的话,会继续问你,能简单说一下每一层的作用吗?你知道哪些协议,比如http协议,tcp/ip协议?
这时候就是体现功力的时候了,如果你能够不慌不忙地,用自己的语言把每一层的理解说出来的话,我敢保证,你这个offer,稳了。
下面,小兵要开始讲每层的内容了。我会尽量讲得比较的通俗易懂,让人能够理解,便于记忆。
物理层
两个通信需要交流,必须要有介质来传播。像两个人说话需要空气作为介质,电话交流需要电话线作为介质,所以要实现两个计算机通信,也需要东西作为通信的介质,于是我们发明了网线(双绞线)。两台电脑用网线一连,好,有通信通道了,A可以通过网线给B发消息了。物理层就对应我们生活中的网线、光纤等。物理层中的数据形式是二进制比特流,二进制比特流通过一些物理设备转换为脉冲信号,也就是网线中的信号,即一切数据最终都是通过这些具体的物理介质来传输。我们国家信息化进步得这么快,就是因为国家出大力气铺设了大量网线大量光纤,使信息能在我国广袤地土地上飞速传输。
另外,在网线传输信号的过程中,信号可能会衰减,所以物理层对应的设备还有中继器、集线器(HUB,也就是多口中继器)。中继器就是连在两根网线之间的一个设备,能对网线中的信号进行放大,但它对信号不做任何逻辑处理,即透明传输比特流。中继器有两个重要的概念需要了解一下,就是广播域和冲突域。
冲突域:该域当中的任何时刻,只能有一台设备发送数据,否则会有冲突。冲突后两台设备都必须重新发送数据包。
广播域:该域当中的任何一个设备发送信息,其它设备都能“知道”这个信息。
先大概了解冲突域和广播域的基本概念,后面会用得上。
HUB:域可以看做一间办公室。大家把网线连到了同一个HUB,就相当于处于同一个域,就是说大家就会处在冲突域和广播域中。
冲突域可以理解为,办公室的门很小,一次只能过一个人,如果小王、小李、小兵都想出门(发送数据),那就都挤在门口了,即发生冲突。这时候大家就得都退一步,重新一个个出门(重新发送数据)。
广播域可以理解为,办公室门的上装有语音播报系统,有人进出门(发送、收到数据)的时候,办公室都会响起一阵声音:【小兵要出门去找小芳了】、【隔壁小花来找小兵了】,即整个办公室的人都能知道这些信息(广播)。
一句话总结物理层就是:物理层为物理设备间提供了通信通道,实现了数据传输。
数据链路层
物理层为物理设备间提供了通信通道,实现了数据传输。但这个传输是透明的,即传输过程网线本身不会对你的数据进行任何逻辑处理,理论上你如果传的是10010,目标计算机收到的时候也是10010。但物理传输毕竟是不可靠的,信号在传输过程中,可能衰减衰减着就没了,或者受到干扰变成了11111,这是我们不希望看到的。所以呢,
数据链路层的功能就是:通过一些数据链路层协议和差错检验机制,让数据在不太可靠的物理链路上能够进行可靠的传输。
简单概括就是,数据链路层实现数据的可靠传输。
下面我们就看看,数据链路层具体是怎样工作的。
在了解数据链路层如何工作前,我们要先了解几个概念,即以太网、MAC地址、帧。
数据链路层之:以太网
百度百科的解释是:以太网(Ethernet)是一种计算机局域网组网技术。IEEE制定的IEEE 802.3标准给出了以太网的技术标准。它规定了包括物理层的连线、电信号和介质访问层协议的内容。以太网是当前应用最普遍的局域网技术。
也就是说以太网就是局域网的一种。我们知道,不同网段的ip相互之间是不能直接访问的,因为网段不同,证明他们连的不是同一根网线。但是接入网桥、交换机(多个网桥)等设备后,就能够跨网段访问了。网桥网桥,就是网络之间的桥,有桥梁了,自然就能互相访问了。交换机,也就是多个网桥,就相当于多条通路。大部分学校,实验室,办公大楼都有自己的局域网,也就是我们所谓的内网(不知道你们有没有试过封闭式开发时只有内网可以访问的体验,U盘不能插入电脑,手机不能做出对着屏幕拍照的姿态,以防资料外泄...)。我们常见的局域网如下。
数据链路层之:MAC地址
我们每个人都有自己唯一的身份证号,计算机也需要一个类似身份证号的东西来做唯一区分,那就是计算机的MAC地址,MAC集成在计算机的网卡,由计算机厂商生产计算机时指定,它一定是全球唯一的。
PS:我们可以通过 ipconfig /all命令来查看本机的物理地址。如下图。
数据链路层之:帧
了解了以太网和MAC地址的概念后,我们可以看看,在以太网(即局域网)下,数据链路层是怎么工作的。我把第一张图片又拿了出来:
从上面的图片我们可以看到,数据链路层的基本单位是帧(frame)。那么我们可以先想象一下,帧中应该包含哪些数据?比方说小兵用QQ给小花发了一条消息“hello”,这条消息从应用层,到传输层,网络层,然后到数据链路层后,就被称为帧了。那么我原始的消息“hello”肯定也应该还在帧里面,但除此之外,帧应该还包含什么数据呢?如果你还不知道答案,那可以想象一下我们给别人发快递时是怎么发的,除了需要快递的东西外,是不是还要填写发件人姓名地址,和收件人姓名地址?不然怎么知道快递要发到哪里,别人又怎么知道是谁发来的。所以可以猜到帧包括的内容有: 数据来源 + 发送的数据 + 目标地址。然后我们看看实际的帧结构是怎样的。