目录
1 网络的发展
2 协议
编辑
3 网络传输的流程
局域网
跨网络通信
1 网络的发展
计算机是被人设计出来,为人提供计算服务的,而人是需要协作的,那么就注定计算机之间也必须要协作,计算机之间的协作就是靠互通数据来完成的。
独立模式
最开始,计算机之间是相互独立,数据是不流通的
而如果要把数据从一台计算机交给另一台计算机,就需要利用软盘或者光盘,先从计算机中将数据拷贝一份下来,然后再将软盘插入另一台计算机,这样才能完成数据的交换。由于这需要人亲自动手,他的速度就注定很慢。
网络互联
多台计算机连接在一起,完成数据的流通共享。
这个时期,具体的业务以及共享的数据是存在服务器的,每台终端都可以使用服务器提供的接口来使用服务,当然,终端之间也是可以互相传输数据的。这其实就是局域网的雏形。
但是这种情况当终端设备多了之后,由于他们必须通过一根网线来连接,同一时刻必须只能由一台终端发送数据,否则就会出现碰撞,造成数据丢失的问题。
局域网LAN
计算机数量多了之后,通过交换机和路由器将多个计算机划分为不同的局域网。一个交换机所服务的设备构成一个局域网,而路由器则用于局域网之间的转发与路径选择。
广域网WAN
可以将相隔千里的计算机都连在一起。
局域网和广域网只是一个相对的概念,其实最主要的就是覆盖的范围的差距,广域网我们也可以看作是大的局域网。 后续的学习中我们也不会对这两个概念作特别区分。
2 协议
“协议”其实就是一种约定。
计算机传输数据本质上还是使用光电信号的频率或者强弱有无来表示 0 和1 ,要想传递信息,就需要约定好数据的格式,比如一段什么样的信号表示什么信息,或者说数据按字节为单位来解释,不同的数值代表不同的含义 ... ...
但是,两台主机只要把协议规定好了,就能通信了吗?如果你真的只是想让两台确定的主机来通信,那么好像这样就够了。 但是实际上的通信的设备可不是确定的,生产计算机的厂家有很多,操作系统也有很多,计算机之间可能都有所差异,那么要让不同厂商、不同操作系统的计算机之间能够相互通信,就需要制定统一的标准,大家都遵循这个标准。
而能够成为标准的协议必然都是经过技术的检验和大家认同的。
协议最终也要通过软件的方式来实现。
同时,协议是按层状结构来划分的,协议对应的软件也是层状划分的。
比如:两个人当面交流,他们的语言就是一种协议,他们需要用同一种语言才能达到交流的目的,如果语言不通,不就类似于协议不一样,交流不了了。 同样,如果两人距离比较远,可能还需要电话来沟通,他们的语音传到电话中,是被处理成电话的信号来进行传递的,然后传递到对方的电话中,再讲电话的信号转换为语言信号,从而达到交流的目的。
上面的电话的案例就是简单的两层协议。
协议分层是为了解耦,解耦的目的就是任何一层出现问题,只会影响当前层,不会影响其他层。比如就算电话坏了,也不会影响两人在近距离的直接使用语言协议交流,或者我们的语言协议种类变了,比如由中文交流变成了英文交流,也不会影响电话协议。
而网络协议也是要分层的,那么分层有什么意义呢?
1 分层能够将不同层解耦 ---- 低耦合
2 一般我们分层的依据是将功能比较集中/类似,耦合度比较高的模块,设置为一层 ---- 高内聚
3 每一层用来解决特定的问题。
既然说到了每一层解决特定的问题,那么网络通信过程中的问题有哪些呢?
我们从底向上看
1 如何将数据交付到和自己直接相连的下一台主机
2 路径的选择
3 容错和纠错
4 应用方面的问题(多方面)
每一个问题都以高内聚低耦合的方式划分为一层,每一层都有自己匹配的协议,每一层协议都解决自己的问题。
那么大佬就提出了一个标准,也就是 OSI(Open System Interconnection) 七层模型
他认为我们在网络中遇到的问题是七个,细分下来也确实是七个,我们上面只是简化了,比如硬件和应用的具体问题我们都没有列出来,OSI七层模型解决的问题:
1 硬件电路方面的规定
2 互联设备之间的数据传送
3 地址管理和路由选择
4 管理两个节点之间的数据传输,负责可靠传输
5 连接的建立和断开,管理连接,负责传输层以下的分层
6 设备固有的数据格式和网络标准数据格式的转换(比如字节序等)
7 针对特定应用的协议
在实际中,我们更喜欢把上三层统称为应用层。在实际工程中,我们喜欢用 TCP/IP 五层模型
其实就是把会话标识和应用合成一个软件层了。
其实网络的分层我们可以和操作系统的分层来结合起来裂解
物理层都是管理硬件相关的。而数据链路层则是驱动软件层,网络层和传输层都是操作系统层面的,他们所使用的一些协议都是内置在操作系统中的,这是每一个操作系统都一样的,都要有相关的协议。而应用层就是我们操作系统层状图的应用层。 那么就注定了在应用层和传输层之间必须有系统调用。
而网络的系统调用都是整合在文件系统的调用的,学到后面我们就能发现,网络的操作其实和文件的操作在本质上没什么区别。
3 网络传输的流程
在这里我们暂时先不考虑物理层,因为物理层我们不需要过多了解,有基本认识就行,况且本文只是简单将一些网络的基本常识,后面都会对这些内容进行详解。
首先我们要知道一个概念: 报头
我们把网络划分为五层,每一层都有自己的协议,而每一个协议最终表现为报头。
我们的数据在网络中传递,并不只是数据,必须还要有一部分额外的东西,就拿最简单的来说,必须要有协议的种类,数据发送方的地址和接收方的地址等,这部分多出来的就是报头。
协议通常是通过协议报头来进行表达的。
每一份数据最终在被发送或者在不同的协议,都要有自己的报头
但是在理论上,用户最终收到的数据还是纯数据,不需要额外的报头。
局域网
局域网中的两台主机能够直接通信。
因为他们是直接或者间接通过交换器而组成的网络,是能直接通信,不需要路由器的参与的。
局域网通信的原理就是利用mac地址的唯一性
每一台机器都有一张或以上网卡,而每一张网卡都有自己的mac地址,mac地址在全球范围内都是唯一的,虽然他在全球唯一,但是他真正的用处确实在一个局域网内用来表征他的唯一性,用于局域网通信。
比如下图局域网(无交换机,通过级联将各自网卡连接起来)中主机A要向主机C发送消息
A的消息是直接在该局域网中进行广播,在数据报中,报头中包含了主机A的mac地址(源mac)和主机C的mac地址(目的mac),那么虽然 BCD 都能收到该消息,但是由于需要判断目的mac地址是不是自己的mac地址,所以BD会将该数据报丢弃,只有C会使用该数据报。
但是,他的过程其实并不是这么简单,由于网络是分层的,所以实际在物理层进行传输的时候,数据时被加了多层报头的,至少是五层。
用户在将数据交给应用之后,首先对应的应用会使用他的特定的协议为用户的数据整体加上报头,而后接着往下层传,到了传输层之后,传数据的对应的协议再将上层传来的数据当作一个整体,对其加上特定的协议的报头,以此类推,直到物理层也加上对应的协议报头之后,在物理层进行传输。
这个不断加报头和向下交付的过程叫做封装。
而到达对方的物理层之后,就需要不断向上进行交付,每一层都将自己的协议的报头解下来,然后交给上层的协议。
每一层都将解开报头之后的数据部分称为 有效载荷 ,所以其实每一层都是将有效载荷在向上交付。
但是这里就有一个问题,解包的时候,如何判断那里是报头,哪里是有效载荷呢?因为这里有一个问题,就是每一层可能都不止一种协议,我们怎么知道当前拿到的数据包添加的是何种协议的报头?首先,我们不考虑物理层,物理层的解包我们不需要担心,我们只需要关心物理层向上的交付。
在每一层都需要将报头和有效载荷分离出来,而我们知道,报头都是添加在上一层传过来的数据的首部的,那么我们可以在整个数据包的首部提取到一些信息,比如报头的长度和有效载荷的长度等。
那么如何分辨该上交付给上层的哪个协议呢?我们可以看封装的过程,封装报头的时候,该协议肯定是知道数据包是上层的那个协议传下来的,那么他就可以将上层的协议信息封装进自己的报头中,那么只要把包头解析出来了,就能知道需要将有效载荷交给上层的哪个协议。
这是所有协议所必须的特性。
解包和向上交付的过程我们称之为 解包分用。
局域网一般分为三类: 以太网 , 令牌环网 ,无线局域网
以太网就是我们上面用的图:
多台计算机通过公共介质连接起来。
但是由于公共介质只有一个,就决定了我们不能多台计算机同时向局域网中发送消息。
显而易见,如果同时发送数据,那么就会在网线中发生碰撞,从而导致数据的丢失或者错误。
所以在任何时刻只允许一台主机向以太网中发送消息,否则会发生碰撞。 如果发生碰撞,数据全部废弃,发送方重发数据
所以我们一般把一个局域网称为一个碰撞域或者冲突域
那么我们如何看待局域网的公共介质之类的网络资源呢?
如果我们站在系统的角度,那么网络资源就是共享资源,他需要能被多台主机访问到,而限制同一时刻只能有一台主机发送消息,也就可以看成是对共享资源进行保护,那么我们也可以称网络资源为临界资源。
而令牌环网就是通过在局域网中分配一个特殊的字段(令牌),在争个局域网中只有一份,而只有持有该令牌的主机才能够向局域网中发送数据,这就保证了同一时刻只能有一台主机能够发送数据,避免碰撞。 同时,令牌能够通过局域网进行传输,那么每一台主机都是有机会拿到令牌,持有发送数据权的。
这就是令牌环网,其实就是比以太网多了一个令牌来避免碰撞。
而从系统的角度来看,把网络资源看成共享资源的话,那么这个令牌就是我们的锁。
所以,系统和网络其实并不是泾渭分明的完全不同的学科,他们是互通的,我们可以从网络的视角来看系统,也可以以系统的视角来看网络,不同的视角会有不同的理解,当然也能帮助我们更好理解网络的一些概念。
跨网络通信
mac地址用于在一个局域网中进行传输,而要实现跨网络通信,光用mac就不够了,而是需要用到ip地址。ip地址是网管分配给我们的网卡的一个地址,他与mac地址不一样,不是固定的,而是由网管来分配。在这里我们先不管公网ip和私网ip,我们先都默认看成是公网ip,公网ip也是唯一的。
如果一个设备要实现跨网络的传输转发,那么就意味着他至少需要横跨两个网络,而一个网路接口只能在一个网络中,比如你的网卡的ip在局域网1中,那么他就不能同时在其他的局域网中。 那么就意味着这个设备至少需要两张网卡,两个ip地址。而这种实现跨网络转发的设备就是我们的路由器。
路由器至少同时在两个网络中来实现跨网络的转发。在上图中,我们认为路由器既是网1的主机,也是网2的指针。
路由器是工作在网络层的。当然他可能不止在一层工作,现在的路由器的功能十分强大,有的路由器的工作范围甚至已经上升至应用层了。 我们所说的工作在某一层,指的是它能够在该层及该层往下的层都能工作。
跨网络通信其实要解决的最重要的问题就是 两个局域网的类型不一样,比如一个是以太网,一个是令牌环网。
我们忽略物理层,只从数据链路层开始考虑,以太网和令牌环网说白了就是数据链路层用到的协议不一样,不会影响他们各自继续向下交付时封装各自的物理层的协议报头,所以我们省略了或者说把链路层和物理层当成一个整体来看。
那么路由器的功能就很巧妙,如图:
由于它工作在网络层,那么它所拿到的数据就是网络层的数据包,不包含原网络的协议报头,然后它就可以封装一层目标网络的协议报头,这样一来就能够交付给目标网络进行传输。
我们对比着以太网内通信的图片来看,忽略其物理层
我们能发现,一个以太网内的数据传输,两台主机在每一层拿到的数据都是一样的,所以我们换一种角度也可以理解为由源主机的某一层直接交付给了目标主机的对应协议层,这是另一种角度来理解网络的数据传输。也可以理解为一个封装向下交付以及解包分用的过程。
而跨网络通信中,虽然底层的链路层和物理层可能不一样,但是我们ip层及以上的数据报文还是一样的,ip协议的价值就是屏蔽底层网络的差异
这里总结和补充一点小知识:
不同的协议层对数据包的称呼不同,在传输层叫做 数据段 ,在网络层叫做数据包,在链路层叫做数据帧。
应用层数据通过协议栈发到网络上,每一层都要加上一个数据首部,称为封装。
首部信息中包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息。
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的上层协议字段将数据交给对应的上层协议处理。
两种地址
ip地址和mac地址
ip地址有两个版本: ipv4 和 ipv6。
ipv4的地址是四个字节表示一个地址,也就是32个比特位。
由于随着入网设备的增多,ipv4的地址已经不够用了,所以后续有 私网 和 ipv6 的解决方案。
ipv6 的地址是16个字节,他能表示的地址就多的多了,不用担心不够用。
一般我们说ip地址或者ip协议,如果没有特殊说明的话指的都是 ipv4 ,目前来说还是 ipv4 用的多,现在一般在子网中用 ipv6
mac地址是 6 个字节,也就是48位的地址。
mac是作用在数据链路层的,能够在一个局域网内找到对应mac的主机或者路由器,而ip是作用在网络层的,路由器也是工作在网络层。
就如同前面的图中的跨网络通信中,我们的数据包从一个网络经过路由器转发到另一个网络的时候,他会被链路层的协议包头进行重新的封装,也就是相对于对 源mac 更新,而不会修改数据包中的ip地址。 我们可以理解为数据包中 ip 地址是真正的出发地的目的地, 而mac地址只是中间的每一站的开始,当然我们目前先不管 目的 mac ,因为目的mac还是不变的。
这两套地址方案共同作用,才能完成我们的跨网络的转发。