赞
踩
从今天开始我们将要从系统横跨到网络的学习了,因此有些书我们就可以读起来了。
操作系统
原理:
《操作系统精髓与设计原理》、《现代操作系统》
Linux原理方面的书:
《Linux内核设计与实现》–陈莉君、《深入理解Linux内核》(选读–不作为重点)
Linux编程方面的书:
《Linux高性能服务器编程》、《Unix环境高级编程》
体系结构:
《深入理解计算机系统》
对于系统学过前面的知识建议读书顺序:先编程,后原理
下面的网络的发展有一个逻辑链条,计算机本质是为了给人提供计算任务,而人之间是要相互协作的,注定计算机之间也必须相互协作。计算机一定是通过相通数据来相互协作的。所以网络的发展有它的必然性。
独立模式:计算机之间相互独立
网络互联: 多台计算机连接在一起, 完成数据共享
比如说清华大学实验室和贝尔实验室是两个不同的局域网,它们各自内部可以互相通信,并且它们之间还想互相通信。
而且学习网络一定不能忘记一个角色:运营商, 建基站,拉网线等等都是他们做的。
局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起
路由器左边是一个局域网,右边也是一个局域网,用路由器连接已经属于跨网络了。
广域网WAN: 将远隔千里的计算机都连在一起
所谓 “局域网” 和 “广域网” 只是一个相对的概念。 比如,我们有 “天朝特色” 的广域网,也可以看做一个比较大的局域网。
假设有一台主机里面有很多设备CPU、显卡等等,我们知道这些都是用一条总线连接起来的。所以,一台计算机内部本质也是一个小型网络结构。并且计算机内部也有协议,驱动程序访问硬件就是通过协议来访问的。所以每一个硬件都是自己的协议。
现在假设把主机里的硬件拿出去,主机在浙江,硬盘在贵州,两个通过网线连接起来,以前我们写数据写到本地,现在无非就是通过网络写到远端。这里就相当于一台大型计算机。
总之:计算机体系结构中网络,网络中有体系结构。
可能我们所知道的 “协议” 是一种约定。那为什么要有协议呢?这个约定是什么呢?
假设两个人近距离沟通时,沟通不会有太大的障碍,毕竟离的近说话都能听到,有什么事情可以当面解决。
但是当两个人一个在桥头一个在桥尾距离500m,有可能这句话整体没听到,部分没听到。因为距离较远连对方的脸都看不到因此确定不了对方有没有收到。
因为通信距离变长了,可能会引入新的通信问题。所以我们要尽可能地减少通信成本:因此需要定制协议!
尽可能地减少通信成本:定制协议
所有网络的问题:本质都是传输距离变长了!
上面说了这么多只回答了为什么要有协议,下面我们谈谈什么是协议。
假如张三考上大学了但是家里比较一般,因此打电话的时候能省就省。当时打电话不通不要钱,通了没接不要钱,因此他走的时候和他父亲这样说,我在外面会给家里打电话,我们做个约定电话来了不要着急接,电话响一声就挂代表我到学校了,电话响两声就挂代表你该给我生活费了,电话响三声及以上代表我有事要和你说需要你接电话。当张三上学走了它和家人的距离就拉远了。然后在外地上学就通过这样打电话的方式和家里人互相交流。
这个故事我们抓住重点,电话响一声、两声、三声都代表不同的含义。而这个含义不用解释,双方早就已经有了共识了。-------->这就是我们的约定,而这种约定就是协议。而这种协议的约定是为了减少通信成本!
如果刚才的故事用计算机语言来表达, 这个就是计算机协议!
计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式。
只要通信的两台主机, 约定好协议就可以了么?
比如一个土匪寨今天夜里的口号是天王盖地虎,对应的口号是宝塔镇河妖!下面的人都觉得这个约定很好。并且也知道这回事了。但是这个寨子不是同一个地方的人,有北京的、上海的、浙江的、河南的。他们的口音不一样。所以当守夜的人说天王盖地虎的时候,另一个人虽然知道回答宝塔镇河妖,但是用的是方言。因此守夜的人根本听不懂,认为你说错了。
所以说协议虽然约定好了,但是执行上不太一样,那可能也不太行!
就好比上面的故事,寨主都让用普通话来进行口号的提问与回答。
协议一定要有配套的数据结构,还有对应的算法来支持。所以协议我们依旧可以认为是软件。后面我们也能看见协议是按照层状结构来划分的。既软件是按照层状结构划分的。
下面以打电话的例子来说明协议为什么要分层
当你在和你朋友打电话的时候,你认为你在和你的朋友在直接沟通吗?
理论上是这样,但实际上你和对方并不是直接沟通的,而是把你说的内容给电话,电话通过相关的协议交给另一部电话,另一部电话把你说的话解码语音播报让对方听到。这就是一种分层。一个语言层,一个通信设备层必须搭配使用,不然相隔百里之外就不能进行交流。
软件在层状结构中,一旦分层的好处:
可以对任意一层左任意的修改并不影响其他层,从而达到一定解耦的过程。
就如下面的图片所示。
上面是分层的好处,但这是一种普世性的说法。那为什么网络要成OSI七层,TCP/IP五层呢?为什么要这样分呢?
理解分层:
上面是我们从软件工程方面所理解的。下面是具体分层依据的理解。
那都要解决什么问题呢?
当网络通信的时候,并不能直接把主机A的数据传给主机B,中间需要经历各种设备一跳一跳的走。
就比如张三想从北京到新疆,只能选择自行车作为交通工具。他先需要先从北京到张家口,在从张家口到集宁等等,最后到新疆。
换句话说首先要解决的问题
那从北京到新疆,现在已经从北京骑车到张家口并且路上了,那如何保证路径的方向就是正确的呢?
所以需要提前规划好路线,然后走到那问到那。
万一路上没钱了怎么办,不认识路了怎么办,大不了回来。对于网络来说也必须要解决这个问题大不了重传。
现在根据123能把自己送到新疆,但去新疆是你的目的吗?
去新疆不是我的目的,玩才是我的目的。去新疆是我的手段。
这就是为什么网络要化成接下面看到的若干层的原因。其中这里每一层都有自己匹配的协议,每一层协议都解决自己的问题。
物理层主要解决硬件电路方面的问题
数据链路层对应解决第1个问题,这里说的互联设备是和自己直接相连的下一台主机
网络层对应解决第2个问题
传输层对应解决第3个问题
会话层、表示层、应用层解决对应第4个问题
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
数据在经过长距离传输的时候是会衰减的,为了支持能够更远距离传播就有了集线器这个物理设备。(信号衰减然后集线器放大信号)
调制解调器(猫)也工作在物理层。(把模拟信号->数字信号,数字信号->模拟信号),家里安装的wifi,先是光纤接入猫,然后猫拉一个先连接路由器,路由器帮我们构建一个局域网然后我们就可以连接wifi了,我们发送的消息先传给路由器,路由器在经过物理设备猫,帮我们做数模转换把数据打到网络里然后数据才能发出去。(路由器真正识别才是真正的01这种二进制对东西)。
双绞线 == 网线
还有一种设备网卡也是在物理层。网卡对各种数字信号做01的转化。可以理解网卡里也有各种寄存器,这些数字信号就是对网卡特定的寄存器特定的比特位充电,有就充没有就不充,最后就可以在网卡寄存器中存储上对应的01序列,然后这个这个网卡的01序列就可以被操作系统读走,然后数据就到内存里,就按照对应协议的格式慢慢解读了。
物理层是硬件,从数据链路层开始就是软件了。
下面是OSI和TCP/IP模型
TCP/IP模型将应用层、表示层、会话层合成一层。
未来我们所写的网络代码就是在应用层。
物理层也叫硬件层。
数据链路层是对应设备驱动程序内部实现的叫做网卡驱动层。
传输层和网络层是由操作系统内部实现的。这里的操作系统指的是所有OS完全一样,保证全球主机互通互联。
到这里是不是和以前学得到计算机层状体系结构相似。硬件,驱动,操作系统,系统调用接口,应用层。实际上上面的图和这里是吻合的。
上图应用程序与操作系统之间也存在系统调用接口。所以应用层这些协议最终调的是系统调用,使用的是由操作系统提供的功能来达到通信的目的。
物理层我们考虑的比较少. 因此很多时候也可以称为 TCP/IP四层模型.
一般而言
默认一台设备工作在那一层默认这一层下面的所有功能它都有。
但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发);
在具体说之前,我们需要先谈谈背景知识
协议报头
下面举个例子帮助理解
比如我在淘宝上花了50块钱买个水杯,最后卖家他就想办法要把水杯交给我。并不是卖家骑着自行车来到我加楼下把水杯给我,真正发货的并不是卖家。在卖家楼下有一家顺丰快递点,而我家楼下也有一个顺丰快递点。所以那么卖家实际上是他把自己的水杯交给了顺丰,顺丰它通过自己内部自己的路由体系,坐火车、坐飞机、然后骑三轮车,反正把东西送到快递点,快递点或者快递员他直接把东西放进来,然后最后给我打电话让我进去取,或者给我送到楼下都有可能。
场景是这么个场景。那么实际上当我收到水杯的时候,我是不是只收到了水杯?
并不是,还有一个快递盒子,最重要的就是有一个快递单。
我要的实际上只有水杯,但你给我发过来的可不仅仅只有水杯,你会给我发过来一个水杯,水杯的盒子上贴了一个快递单。这里说明我要的东西,那么对方给我的实际上会比我要的东西多一点点!那么其中多的快递单我们称之为报头。
同理我今天要的数据,我要的就是那么一点数据,但是实际上它发的要比我要的多一点,多出来的东西是报头。
那这个快递单有什么意义呢?
我们不需要快递单,快递单是给快递员看的,快递单上会贴了联系人是谁、送货地点是啥?那么电话号码是什么、并且所有的快递单格式是一样的。其中快递单上面的固定格式我们就叫做顺丰自己定的协议!在他们物流体系当中,在他们公司里面的人全部都认识,所以在全国的任何一个快递点的快递单子大家都认识,这叫做共识,这叫做约定,这叫做协议!
这里的意思就是:
实际上在网络上进行交付的时候这个添加的报头我们看不到,只看到发送的数据。
假设我这个快递现在是个洗面奶,拿到之后是我的目的吗?
不是。用它才是目的。
那现在洗面奶有没有自己的协议,标准呢?
有的,就是那个使用说明书,那个说明书就是应用层协议。
局域网
在全球范围内,每一张网卡都有自己类似序列化的的东西。48位二进制数据可以按16进制解释,最终它就是一串字符,用来表示网卡的唯一性。所以每个网卡都有自己的MAC地址,这个MAC地址是写在网卡里的是固定好的。MAC全球唯一,但是它并不应用于全球,而是运用于局域网中表明一台主机的唯一性。
ether就是以太的意思,后面就是MAC地址
下面说一说局域网的通信。
一个局域网有很多机器,这些机器通过网线连接起来。
假设在一间教室,老师叫张三站起来问它昨天作业为什么没做,那么此时这间教室的其他同学也都听到这句话,但是就张三站起来了。说他的作业交的比较晚你可能没看到。这里所有人都听到了这句话,但就张三站起来了。那老师是不是就认为他只在和张三通话,张三是不是只认为他只在和老师通话。其他人听到这句话认为叫的是张三和我又没关系,因此直接把这个消息过滤掉相当于把数据丢弃。只有张三会站起来。这就是局域网通信原理。同样的,当主机1向主机7发消息,这条消息所有主机全都收到了,只不过除主机7外的所有主机在判断的时候知道这是交付给主机7的,所有主机全都丢弃,最终只有主机7收到这条消息。反之主机7给主机1发都是一样的。
下面看看具体通信过程。
同一个局域网的两台主机进行数据传输。
左右代表不同的主机
这里省略了物理层
左边主机的用户A发送 ”你好“ 这条信息 ,右边主机的用户接收 ”你好“ 这条消息
首先这条消息会先给应用层,应用层并不是直接把消息给主机B的应用层的。应用层要添加应用层的报头。这个应用层报头什么样子一定是结合应用层协议来做的。接下来应用层就把这个报文交给下一层传输层
传输层收到这个报文之后,会把它当成一个整体添加上自己的报头,然后继续向下交付给网络层,(这里并不是拷贝,只是把做图痕迹留了下来)
网络层收到这个报文之后,会把它当成一个整体添加上自己的报头,然后继续向下交付数据链路层
数据链路层收到这个报文之后,会把它当成一个整体添加上自己的报头,然后发送到网络,这个局域网中所有主机都会收到这个消息,所有主机都会进行甄别这个消息是不是给我的,不是就丢弃,最终就只有对应主机收到这个消息。而且是该主机最底层先拿到的。
当我们从上往下做封装的时候,一定是最底层的协议在最外面做报头,那么当对方拿到的时候一定拿的加上最低层协议做报头的数据。这个数据叫做报文。
报文=报头+有效载荷
接下来对方数据链路层会将报文和有效载荷分开,然后将有效载荷作为整体交付给上一层
因为是同层协议,所有对方认识这个报头,这一层也认识这个报头,因此在将报头和有效载荷分开,然后将有效载荷交给上一层,一直到应用层,然后也将报头和有效载荷分开,然后将有效载荷交给上一层,最后把信息交给用户B。
我们发现这个过程,发送消息自顶向下添加报头,接收消息自底向上去掉报头。
我们将从上到下这个过程叫做:封装的过程。从下到上:解包 的过程。
当你在和对方发送消息的时候你认不认你在和对方直接通信呢?
肯定是的。
但是站在程序员视角认为发信息是先交给底层,而对方底层先收到然后向上传给用户。
但我们依旧认为和对方在直接通信,因为我们发现同层中它的报头和有效载荷是完全一样的,我怎么发的对方同层就怎么收的。
因此:在网络协议中,我们可以认为同层协议在直接通信,也可以理解成为向下交付,这是两种不同的认知。
下面还有问题,当接收方收到这个报文的时候,报文=报头+有效载荷。
实际上这两个问题是在网络通信中每层协议都必须面对的问题,也都需要解决的!
虽然现在一个协议都没有学,但是这里想说的是每一层协议的报头中,一定要涵盖上面的信息。 这也是所有协议的共性!
我们把报头和有效载荷分离的过程叫做解包的过程,把有效载荷定向交付给指定协议的过程叫做分用的过程。
整个报文在局域网通信的过程,要经过封装的过程、解包分用的过程
局域网可以分为:
1.以太网
2.令牌环网
3.无线LAN
以太网我们刚才就已经说过了,发送消息所有主机都可以收到。
现在主机1想把消息给主机7,主机3想把消息给主机5,它们可以同时往局域网中发消息吗?
不可以,因为我们的网线只有一个。
在局域网中,只允许一个主机在任何一个时刻在局域网中发送消息,否则发生碰撞。所有我们把这个局域网也称为碰撞域。
这种局域网的网络资源按照以往的知识如何看待呢?
站在系统的角度,它是一种临界资源、共享资源。
而令牌环网,就可以相当于互斥锁,谁拿到谁发送消息。这是令牌环网的原理。
无线LAN是以太网的一个变种这里不在细说。
跨网络的主机数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器
要进行数据报转换,首先一个设备至少要横跨两个网络,才能实现数据报跨网络转发,所以路由器必须要横跨至少两个网络,因此路由器必须有两个网络接口,对应有两个网络接口(两张网卡)。
在左边网络看来这个路由器是属于左边网络主机的的,在右边网络看来这个路由器是属于右边网络主机的。所以这个路由器既是左侧网络主机又是右侧网络主机。虽然两台主机没有办法直接传输,但是可以先把数据转给路由器,再由路由器传输给对方主机。
还是左边用户A发送 “你好” 右边用户B接收
自顶向下交付每一层都要添加报头。在经过网络层根据IP地址要进行路径选择进行跨网络传输(先不管这里细节)。然后在交付给数据链路层封装自己的报头之后,然后根据IP要把数据交给路由器,因此这个数据经过以太网交给路由器。
能不能直接交给路由器呢?
能,因为这个路由器和主机是属于同一个局域网。
但是不能直接交付,路由器工作在网络层,自底向上需要将报头和有效载荷分离,然后将有效载荷向上交付。
交给ip层,发现这个数据报是要给用户B的主机。但是不能直接交付,需要向下交付。向下交付需要重新添加报头。只不过以前用的是以太网的协议添加的是以太网的报头,现在它的底层早已经变了,变成了令牌环网,因此添加的是令牌环驱动程序的报头,然后再令牌环网上跑,然后被对方的令牌环驱动程序收到
收到之后向上交付,每层都需要做报头和有效载荷分离,将有效载荷交给上层,最后用户B收到用户A发送的消息。
在这个过程,我们可以看到以IP层作为分割,IP层上面的同层协议都是一样的,无论是在自己还是对方的主机看到的报文都是一样的,只有在IP层下面看到的协议是不一样的。
但是底层协议,因为要往路由器传输的,一次向上交付解包分用的过程,一次向下交付封装的过程。屏蔽底层网络的差异。
IP协议存在的第一个意义:屏蔽底层网络的差异。
在同一个局域网几个设备发送消息不需要经过路由器。一台机器在发送消息的时候就已经知道要发送的是给同一个局域网的另一台主机,还是另一个局域网的主机。如果是另一个局域网就要经过路由器。如果是同一个局域网就无脑发送了。
下图为数据分用的过程
在网络中同通常用的有两种地址,一种是IP地址,一种是MAC地址。
MAC地址是全球唯一的序列值,但不应用于全球,而用来表明在局域网中的一台主机的唯一性。
关于局域网目前怎么理解呢?
两台主机可以直接通信,不用跨路由器转发就是局域网。
ifconfig --查看当前云服务器的MAC地址,IP地址
eth0是云服务器提供的入网接口
IP地址
IP协议有两个版本, IPv4和IPv6
IPv6,IP地址是一个16个字符,128位比特位的整数。
MAC地址
MAC地址通常在局域网中使用,IP地址在广域网和局域网都使用,不过我们不谈IP在局域网的使用。
MAC地址和IP地址都能表示主机的唯一性。那这两套地址有什么用?为什么需要这两套地址?
下面以一个小故事来说明:我们都听过西游记的故事,唐僧师徒走到女儿国的时候,国王问高僧:”你从哪里来,要到哪里去“,唐僧说:”我从东土大唐而来,向西天拜见佛祖求取真经而去“。唐僧接下来问国王:”我现在在女儿国,下一站应该去哪里。“ 国王说:”下一站应该去黑风岭“。当唐僧师徒去往黑风岭被拦住了,被问:”和尚你从哪里来,要到哪里去。唐僧说:”我从东土大唐而来,向西天拜见佛祖求取真经而去“。黑风岭领主说那你那你上一站从哪里来的啊怎么来我这里了。唐僧说:”上一站从女儿国哪里来的,国王让我到黑风岭这里来。
那么从这个故事,唐僧口中的地址一共有几套呢?
两套。
1.【从哪里来,到哪里去】
2.【上一站从哪里来,下一站到哪里去】
黑风岭领主让唐僧一行人去往西部火焰山,唐僧一行人到了火焰山被牛魔王拦住了,牛魔王问:“你从哪里来,要到哪里去”。唐僧说:”我从东土大唐而来,向西天拜见佛祖求取真经而去“。牛魔王问:“你上一站从哪里来,当前你到了哪里呢?”唐僧说:“上一站从黑风岭来,黑风岭领主让我到火焰山。”
为什么唐僧要去女儿国,黑风岭,火焰山呢?
根本原因在于它的终极目标要去西天。 因为要到达终极目标,所以要按照路径一个一个走最终到目标点。
我们称这个终极目标 --> 目的IP, 从哪里来 --> 源IP
【源IP,目的IP】 :为我们未来每一个阶段,提供方向目标,方便进行路径选择。
【上一站从哪里来,下一站到哪里去】:该类地址,一直在变化。像这种相邻的两个地址,从一个结点跳转到和它相连的下一个结点,我们称为MAC地址【源MAC,目的MAC】。
IP地址提供方向,MAC地址提供可行性。
IP与MAC就相当于终极目标和阶段性目标的关系。
最后我们在画一张图解释网络通信的原理
主机与路由器,路由器与路由器,路由器与主机直接相连的属于同一个局域网。
同属于一个局域网,所以可以把数据从一个局域网传到另一个局域网,因此最终可以把一个主机的信息跨网络传输到另一个主机
传输层和网络层在OS内部,数据链路层在驱动,物理层暂时不说了,应用层是由用户自己实现的,用户未来一定通过调用某些系统调用接口来完成向传输层下达网络发送的任务,最后发给对方主机。
数据包在整个网络中首先自顶向下做封装,然后被某个路由器收到,然后自底向下解包分用交给路由器。然后从路由器自顶向下封装。。。,最后交给用户B
有两个问题,我们在网络通信时,路由器往下传可以有多个选择,为什么会选择这个你,不选择它呢?
根本原因还是在于目的IP,它在网络层进行路径选择时选择了下一个跳转的路由器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。