在早年计算机之间是相互独立的,但后面难免会出现需要多台计算机之间进行协作的问题。
有人尝试通过用线路将计算机彼此连接起来,这就形成了最初的网络。
在之前介绍冯诺依曼体系时,说过外设的数据IO,只能先通过内存进行缓存,再传给CPU计算或是由CPU计算完成传给内存。
那么硬件和硬件间的数据是怎么进行传输的呢?
单个主机,不同硬件之间,是通过"线"来连接进行数据传输(光电信号)的,但这个“ 线 ”比较短。
整个计算机体系结构就可以看作一个小型的网络。
而多主机之间通过体系结构的延展,通过网卡用网线连接起来,这种多主机之间连接通信本质也是通过"线"连接起来,只不过“ 线 ”变长了。
而在一些大的公司会有自己的一些集群所构成的大型互联网平台,每个集群里面有很多的服务器,彼此通过网络连接。
存储集群的数据会传输到缓存集群,处在缓存集群的数据再经过计算集群进行计算,返回给缓存集群。
这些集群在整体上看,就是一个宏观的冯诺依曼体系结构。
这样回看,体系结构可以构造网络,网络也可以构成体系结构,其实它们两个是不分的。
通过前面也能更好理解一些东西。
在单个机器内," 线 "比较短,因此数据传输方便,也比较快,但是其存在一些信号干扰问题。
在多个机器间,“ 线 ”就比较长了, 因此就会出现以下问题:
网络知识的本质就是为了解决这些问题。
随着发展,接入网络的主机越来越多了,就有了以下概念。
局域网:可以理解成多台主机连接,并且没有路由器
在局域网内的主机可以直接通信,而因为线长了,就需要一些办法来确保如数据可靠性、数据衰减等问题,这就出现了交换机和路由器。
路由器简单来说就是为了连接不同的网络。
广域网:广域网由多个局域网构成,涉及多个路由器与接入公网。(详细的后面再谈)
局域网和广域网是相对的概念,比如小到一间宿舍可以看做一个局域网,大到一个学校,也可以看成一个局域网。
网络是由各自通信协议以及硬件设备组成的。
计算机之间的传输媒介是通过光信号和电信号,通过频率和强弱来表示0、1这样的概念的,要想传递彼此的信息,就必须约定好数据的格式。
协议是一种约定,通信双方做好这个约定,就能正常的进行工作。
那么只要通信的两台主机,约定好协议就可以了吗?
首先,计算机的生产厂商是很多的,不同的厂商生产的操作系统很多,就算操作系统一样,硬件上也是有很多不同的。
大家可以遵守这个协议,但是其可能因为软硬件上的不同,导致在对待协议时以同样的方式去解释,但是对面听不懂!(比如大家都是由0,1来进行二进制传输的,但有些人是通过光频率来表示,有些是通过电信号强弱来表示的,彼此不能读懂对方表示的意思。)
所以在硬件和软件上也得有对应的标准!
(商业、资本、法律也促使着标准的形成)
协议分层
什么是分层?
在之前见过很多软件的分层。
比如:
1、一个main函数在调用一个函数,main函数只要关注这个函数的功能,不需要在乎这个函数是如何实现的,并且一但main函数中出问题,不会影响这个函数。
2、在之前操作系统体系结构中,在硬件上有驱动层,OS层,用户层,这也是一种分层结构。
那么分层有什么好处呢?
在网络上,比如两个人视频聊天,在语言层有着汉语协议,并且都认为彼此在直接和对方进行通信的。但实际上,在通信设备层,有着很多的设备通过同一协议在处理,但是语言层的人不关心它们怎么处理。
因此,层状结构下的网络协议,我们认为,同层协议下,都可以认为自己在和对方直接通信,忽略底层细节,并且每层都有自己的协议。
不过在介绍它之前,先了解一下OSI(Open System Interconnection,开放系统互连)七层网络模型
OSI七层网络模型很清楚也很规范,但是其因为复杂并且难以实现在底层实现(5,6,7层设计想法需要软件层上的支持),因此最后被简化成了TCP/IP五层结构。
其中
表示层的工作就是网络标准数据格式的转换。
会话层为了通信管理,负责建立和断开连接。负责管理传输层以下的分层。
这是一个参考模型,是一个逻辑上的定义和规范,也意味着不是严格要遵守的。
一般而言:
对于一台主机,它的操作系统内核实现了从传输层到网络层的内容。
对于一台路由器,它实现了从网络层到物理层。
对于集线器,它只实现了物理层。
应用层被用户使用,就一定需要访问网卡,访问硬件就一定需要贯穿操作系统,因此在操作系统内部就有一个模块,称为TCP/IP协议栈。
网络协议栈隶属于操作系统,同时它也是一种标准,它的这个标准必须被每一个操作系统进行遵守,所以如果windows系统与linux系统,它们必须也要通过自己的方式,将网络协议栈实现起来。
假设有两个不同系统主机上的用户之间通信。
这些能帮助理解以下两个概念
当一个主机上用户在用户层向另一个主机上的同层用户发送一个你好时,当前应用层认为自己只和另一边的应用层交谈,因此它们有着自己的同层协议,并且往下每层都认为自己和对面同层的进行交谈,因此都有着自己的同层协议。
为了让对方在拿到数据时确定这个数据是同等协议下的,因此数据在往下传时,需要带有每层的协议。(硬件层不考虑)
这个向下的过程,就称为封装。
对方每层在拿到数据包时,除了属于自己的数据,还有对应协议。在识别协议后再传给上层。
这个向上的过程,就称为解包。
每一层多出来的协议数据称之为报头
数据链路层通常会同时使用报头和报尾进行封装。
以太网是局域网的一种通信标准。
以下是就是一个TCP/IP协议栈。
在局域网中,如果两个主机之间通信是能被其它主机看到的。
那么
1、每一个主机都要有唯一的标识:该主机上MAC地址。(网卡地址,用来标定主机在局域网的唯一性。)
2、局域网是一个碰撞域,多个主机在任何时候都可以发消息,就会造成无法准确的听到对应信息,发生信息碰撞(正如教室中任何人都可以说话,但是多个人都说话无法准确听到对应信息),因此主机会识别碰撞(碰撞检测),避免碰撞(让其它主机先进行发送消息),直到自己发消息。
在一个局域网中,多个主机串行的发送信号,这里的以太网在系统方面看就是一种临界资源。
如果规定一种特定数据格式,拿到这种特定数据格式的主机才能发送消息,这就相当于一把锁,对应的通信标准就称之为令牌环网。
认识MAC地址
MAC地址用来识别数据链路层中相连的结点(主机、路由器)。
MAC地址也叫物理硬件地址,用于识别相邻的两个物理硬件设备。其在出厂就会设定,不能修改,并且一台计算机可以绑定多个网卡,进而可以有多个MAC地址。
长度为48位,6个字节,一般用16进制加上冒号的形式来表示。
(比如:09)
在Linux中可以通过
ifconfig
来查看
其中比如ether 08:00:22:01:04:fb:18 这样的
数据包从一台主机跨网络传输到另一台主机是需要通过路由器的。
其中路由器可以作为左侧局域网的一部分,同时也可以作为右侧局域网的一部分。这样路由器就能横跨两个网站,才有可能实现主机间的跨网络通信。
IP地址和MAC地址?
IP地址从理解上。(假设你想从北京到云南,这是一个起始和目标地址,而在其中去的过程会经过其它的省份,在这个过程中也有一个上一站从哪来,下一站去哪的问题。)
这个从起始到目标的地址就是一种源IP地址和目标IP地址,而在过程中上一站从哪来,下一站去哪就是一种源MAC地址和目标MAC地址。
(目标MAC地址就需要根据目标IP地址,进行确认下一步的走向)
当跨网络进行传输时,需要找到数据包下一条的MAC地址,因此可以先到达本网段的路由器,再找到下一个MAC地址,再到达另一个主机。(MAC地址可以标识主机唯一性)
因此
MAC地址,用来在局域网中,标识主机的唯一性。
IP地址,用来在广域网(公网),标识主机的唯一性。
一个用户在用户层将数据跨网络发送给另一个用户时,不能直接发送。发送主机必须通过跨了两个网络的路由器,将数据发送给另一个主机。而发送主机在IP层,必须决定数据应该怎么走,在确定好接收主机的IP后,由于不在同一网络,就需要将数据先发送到局域网。对方收到的时候,一定是从物理层开始的,路由器也是这样,通过自己的以太网驱动程序,将数据包收到解包并向上交付,路由IP也识别到目标IP在同一局域网内,但也不是直接交付,而是需要再向下封装,再向上解包得到。(源IP地址和目标IP地址一直没变,而MAC地址在底层一直在变)
最重要的是,在IP层及其往上的发生接收主机看到的数据都是一样的
因此,网络也被称为IP网络,IP网络屏蔽了底层的差异。
这也体现了添加一层软件层的好处。
而网络中数据传输的本质,就是不断的封装不断的解包,最终转给同层用户。
数据向上解包时,由于每层有着多种协议,因此如何确定呢?
因此,数据包添加报头的时候,也要考虑解包时将有效载荷传给上一层的哪一个协议。而决定交付给上层哪一个协议的过程称为有效载荷的分用。
结论:
一般而言,任何报头的公共属性里,一定要存在一些字段,支持我们进行封装和解包,并且也需要存在一些字段表示要把有效载荷交付给上层的哪个协议,以支持分用。
小结:本章对于网络整体有一个初步的了解,从结构到协议再到与OS之间的关系,并对TCP/IP协议栈有了了解。这些都是为了后面的网络编程做准备。
本章完~