目录
一、网络的概念
1.认识网络
2.网络的发展
二、协议
1.网络问题的产生
2.什么是协议
3.网络协议
三、协议分层
1.协议分层的概念
2.OSI七层模型
3.TCP/IP四层(五层)模型
(1)物理层
(2)数据链路层(网卡层)
(3)网络层
(4)传输层
(5)应用层
四、局域网络通信
1.协议报头
2.MAC地址
3.局域网通信原理
4.局域网通信的过程
5.一些局域网的介绍
五、跨网络通信
1.IP协议的作用
2.IP地址与MAC地址
3.跨网络通信的大致流程
我们每天都需要上网,在你看博客的时候就正在使用互联网。
那网络这个我们既熟悉又陌生的东西到底是什么呢?
在我们的印象中网络应当是计算机间沟通的东西,其实计算机本身就是一种小型的网络结构。
在计算机的内部存在许多模块,比如CPU,显卡,磁盘,网卡等硬件资源。这些模块只有协同工作,才能保证一台计算机正常运行。
而为了保证模块之间的协调运作,模块间必定存在信息的传送。在计算机中有很多的线(物理上的电线之类的),信息就是通过各模块之间的线传送的。
这些实际存在的线与被连接的硬件模块构成了一个网状结构,这种结构就被叫做网络。
那么我们不妨将视野放大一点,我们假设连接硬件设备的线可以无限远。如果我们移除一台计算机的硬盘,再准备一些储存能力很强的计算机与该计算机连接起来,这些专门用于存储的计算机也可以叫做存储集群。
所以当该计算机需要存储数据时,就可以直接通过线向数据传送到存储集群,需要用到硬盘数据时,也可以通过线获取数据。
那如果我们将计算机的各个硬件全部分散开来,并通过线连接起来,它们也就构成了一个网络,但所有的设备还是一台计算机。只要我们的网络传输够快,所有的硬件都可以单独设置一个集群,集群间通过网络传送数据,这也是很多大型计算机的实现思路。
所以最终我们认识到:计算机体系结构中有网络,网络中也有计算机的体系结构。
(1)在网络发展的早期计算机间处于独立模式,也就是计算机之间会保持相互独立。
比如说下面的三台计算机,由于它们之间相互独立,所以只能自己干自己的事情。小松、小竹、小梅想要获取对方的数据就必须使用硬盘等存储介质进行转移,很不方便。
那我们如果再拿一台计算机作为服务器并将其与三个人的电脑连接起来,三个人处理好数据就可以发送到服务器上,三个人需要数据也可以从服务器中拿。
(2)网络继续发展,实现了网络互连,小范围内的多个计算机可以共享数据。
(3)后来,想要共享数据的计算机数量变得更多了,大家都有数据交换的需求。这些计算机就会通过交换机和路由器彼此连接起来,此时就构成了一个局域网(LAN)。
接入局域网的计算机之间可以之间传送数据。
(4)再后来,全世界的局域网越来越多,人们也不再满足于局域网的一定地域范围的计算机间通信,此时就出现了能将各个局域网互相连接的广域网(WAN)。
如图所示,将每个城市的局域网通过路由器相连,这样就形成了一个大的“局域网”,我们就称之为广域网。
广域网实现了局域网间的数据传送,远隔千里的计算机此时也能连接在一起了。比如说,从天津到上海开车需要走1000多公里,但通过广域网,天津和上海的计算机就可以进行数据传输。
“局域网”和“广域网”只是一个相对的概念。你可以将一个国家的单个城市不同地区局域网组成的广域网,看做是这个国家的局域网。而不同国家的广域网,又可以看作全球通信的局域网。
注意,上面我们说路由器就可以连接起各个局域网,但是实际广域网的连接方式是很复杂的,这种网络的构建者是各大通信运营商,在中国就是中国移动、中国联通和中国电信。通信运行商在中间起到的作用我们以后会说到。
我们人与人之间面对面沟通的时候,通过语言或者面部表情等都能很快理解到对方的信息,也就是说短距离沟通的障碍是很小的。
如果二人隔了很远的距离说话,一方面,你说话的时候对方可能听不清,也可能对方没听清一部分,而且你也很难知道对方到底听懂没听懂。而对于网络而言,更多的都是长距离的数据传输,所以网络传输一方面障碍很多,另一方面,可能引入新的问题(比如面对面对方一个眼神你就知道对方听懂没听懂了,而远距离你甚至都看不到对方,这就是引入新的问题)。
所以我们得到以下结论:所有的网络问题本质都是通信距离变长导致的。
其实在我们的生活中就有协议,比如说我跟同学约好了去水上公园玩,我告诉他,只要我给你打电话了,你下楼来找我就可以了。
在这里,虽然我打电话只是一个行为,但是我们二人早就商量好了,只要我打电话他就下楼,这是我们之间不需要解释共识。
所以,协议的本质就是约定。
在计算机中也是一样,比如说两台计算机进行通信。两台计算机约定好,其中一台计算机给另一台计算机发送一个整形数字,每个整形数字代表的操作不同。
比如 ,一台计算机给另一台计算机发送整型数字1,而数字1代表重启电脑,那另一台计算机收到数字1后就会直接重新启动。
有了这样的协议就减少了计算机通信的阻碍。
在计算机制造中,计算机生产厂商有很多,生产计算机硬件的厂商更多,生产网络传输相关硬件的厂商也很多。每一个厂商都有自己的协议,每一种硬件支持的协议都不一样。到最后,不同协议间的硬件无法有效传输信息,大家的计算机还是不能通信。
既然这样,就必须出现一个统一的标准,大家根据一样的标准才能通信,现在这样的标准就叫做网络协议。
协议实质上还是计算机的软件部分,因为协议的使用必须依靠一定的数据结构。
那协议分层又从何谈起呢?我们以打电话为例。
如上图所示,两个人通过座机打电话,当电话打通时:
对于A和C来说,他们都认为自己在直接与对方通话。
对于两台电话机来说,它们也认为是它们之间在互相传递信息。
这样一来,整个通话的信息传递就分为了两层:
两层每层都有各自的协议:
如果A和C使用英语交流,只是语言层的协议从汉语变成了英语,电话机协议不需要改变,两人同样可以正常通话。
如果A和C使用无线电来通话,此时仅是通信设备层的协议从电话机协议变成了无线电协议,语言层仍然使用汉语协议。
也就是说,两层中的某一层协议发生改变时,不影响另一层。
在实际的网络通信中,分的层数会更多,情况也更复杂,但同样符合这一特点。
那这样的分层有什么优势呢?
协议分层的一个重大原因就是,每一层都需要解决特定的问题,这些问题主要表现为以下四点:
(1)如何把数据交付给和自己直接相连的下一台主机。
比如,我要从太原开车去天津,我第一站肯定是先去阳泉,我如果开到阳泉的能力都没有,那又何谈去天津呢?
(2)要有路径选择的能力,因为网络通信过程中存在很多节点。
太原到天津如果我们东南西北分不清,也没有导航。那我们走着走着就不知道自己到哪了,所以网络通信必须也要有选择到达最终接收机器路径的能力。
(3)容错纠错的能力,当通信信息发送错误时,能够处理。
我想从太原到天津,应该向东北方向走。如果我走着走着突然发现自己到西安了,那我就知道我往西南方向走了,需要折回去。网络通信也是一样,比如说发送的数据送错位置了,下一台主机没有收到(很像加速器上说的丢包),那就需要重新发送一份数据,这就是一种纠错能力。
(4)当信息递达以后,具体的应用问题。
我到天津之后,我总要干一些具体的事情,比如我是回家,还是海河边遛遛弯之类的。网络通信也是一样,数据到了目标主机上,目标主机总是要用这些数据做事情的,传输数据只是手段,解决问题才是目的。
OSI(Open System Interconnection,开放系统互连)模型将网络通信分为七层,它也叫开放式系统互联参考模型,是一个网络通信逻辑上的定义和规范。
注意,会话层、表示层、应用层都是各司其职的,我举一个例子。比如说,你在参加社团活动时认识了一个女孩子,你想跟她加微信,她也同意了。
此时,你们之间就建立了联系。建立联系,就是会话层常做的工作。
你们聊天后发现,二人说话都喜欢直截了当,这样你们就确立了两个人的说话风格。确定通信风格,就是表示层的工作。
最后,你们二人开始试着交往,那两个人就可以去电影院、游乐园之类的地方。根据实际进行实际问题操作,就是应用层的工作。
由于这三层的代码是程序员自己实现的,所以根据实现不同,它们的工作协议也会有所变化,上面只是一个简单的例子,不代表全部。
TCP/IP模型也遵循OSI规则,它将上三层合并成了一层,叫做应用层。所以还剩下五层,再加上物理层也不会被考虑,最后剩下四层。
在以后的学习中,如果没有特别说明物理层,TCP/IP模型就只有四层。
负责光/电信号的传递方式.。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)也工作在物理层。
这里需要说一下集线器,集线器是加强信号的机器。如果我们需要把一条信息从天津送到上海,两地距离1000多公里,数据就需要长距离传输。而信息必须使用一定的物理介质传播,比如光信号等。在传递过程中信息的强度就会逐步减弱,当信号将要衰减至无法识别前,集线器就会将该信号加强,以达到远距离传输的目的。
我们加一个小插曲,大家看没看过家里的光猫和路由器。有没有好奇过,这两个小玩意是怎么帮我们上网的?
实际上,光猫的学名叫做调制解调器。它会与光纤(或网线)进行连接,并通过光纤(或网线)接受和发送信息。
在网络通信中我们有两种常用的信号,一种叫数字信号,一种叫模拟信号。模拟信号类似于波,更适合远距离传播,而数字信号就是我们二进制的01组合,适合小范围局域网内传播。
所以,调制解调器会先从光纤中获取模拟信号信息,然后在其内部将模拟信号转换为数字信号并传输给路由器。
路由器可以构建局域网,它接收数字信号后将数据再发给我们的手机、电脑和电视等设备。
我们发送的数据也可以反方向输送到光纤远距离传输。
还有一点就是什么是双绞线。你可能不知道双绞线是什么,但下面这个插头你一定见过。
这个就是双绞线的水晶头,双绞线跟我们所说的网线没什么区别。比如我们的房间里可能墙上就伸出来这么一个水晶头,将该水晶头插上电脑就能实现上网。
最后一点,网卡也属于物理层,它也可以接收网络传递来的信息。比如说,网卡接收到信息后,就会解析数据并对它的寄存器进行充电,数据的01序列就被放到寄存器里。然后操作系统就能将数据读走使用。
所以说,寄存器只存在于CPU的说法是不对的,实际上硬件还有外设都有自己的寄存器,我们看上去是将数据写到了某个设备上,其实是先写入寄存器,然后再经过硬件处理。所以,这些不同硬件与外设的寄存器也被称作端口。
上面这些知识大部分属于硬件,不在我们学习的范围内,了解即可。
数据链路层: 负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层。
我们以后会详细讲述交换机的工作方式,但现在我们只需要记住数据链路层负责将数据传输到与该设备直接相连的下一台主机即可。
负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层。
我们记住网络层能提供路径选择能力,而且很多以后要学习的传输协议还有路由器都工作在这一层。
负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机。
我们记住传输层提供纠错能力就可以了。
负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层。
应用层就是利用发来的数据解决一些实际的问题了,比如说识别出是通知就给用户发过来之类的。
4.TCP/IP四层模型图解
这个图片也很重要,我们还是需要解读它的信息,我们从下往上开始说。
其实这个图是有一些问题的,如果根据我们之前学过的计算机体系层次来看的话。
物理层对应硬件,这里也是唯一属于计算机硬件的一层。
数据链路层(网卡层)对应计算机的硬件驱动,从这里开始向上就全都属于软件了。
传输层和网络层是操作系统自己实现的,不管我们使用的是Windows、Linux还是MacOS,只要计算机能入网,这里的实现就完全一样。
不论是我们的手机、电脑还是其他电子设备,只要入网大部分会在传输层使用TCP协议,在网络层使用IP协议,所以我们管这个模型叫做TCP/IP四层模型。
由于操作系统不相信任何人,所以在传输层和应用层之间会存在系统调用接口。
还记得之前的进程间通信吗?进程间的管道通信本质使用了文件操作,而网络通信实质上就是跨主机的进程间通信。所以,网络接口就被整合进了文件操作里,这样使得学习过系统编程的人学习网络接口的效率会大大提高。
每一个机器都有自己的工作层,对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容。对于一台路由器, 它实现了从网络层到物理层。对于一台交换机, 它实现了从数据链路层到物理层。对于集线器, 它只实现了物理层。
但是现在随着科技的发展,上面的这些机器都已经可以在多个层内工作,比如路由器就已经变成了一台小型计算机,它可以实现更多的操作。所以上面的表述只是教科书的表达,很多机器都已经在多个层内工作。
大家肯定都有网购的经历,比如说我在网上买了一个保温杯。首先,商家会把现货交给快递公司。快递公司会用盒子包装好并贴上快递单,然后送到离我们最近的快递点。
当我拿到保温杯的时候,它不仅有一个水杯,还会多出来一些东西,比如包装盒和贴着的快递单。理论上我们从驿站取快递时应当打开检查后再将物品拿回,快递盒和快递单不应该被我们拿走,只不过直接拿走更方便更有效率,这一步就被省略了。
快递单上的信息对于我们而言没什么用,但对快递站则是一种协议,这些信息可以帮助快递员转运快件。站在网络的角度,快递单的数据就是协议。
快递单上的信息需要一个快递单来填写并贴在便于运输的纸盒上。站在网络的角度,信息需要空间保存,所以包装盒和快递单就对应了协议报头。
所以,我们能得到以下结论:
两台同属一个局域网的设备可以直接通信,比如说我们的手机wifi热点原理也是局域网。那局域网是怎么让设备间进行通信的?为了搞清这个问题,我们首先要认识MAC地址。
我们每一个人都有自己的身份证号,对于网卡也是一样。每个人的身份证号都不一样,同样网卡也需要一个可以标识自己唯一性的名字,这个名字就是MAC地址。在局域网中每台电脑的MAC地址是唯一的。
我们可以通过ifconfig指令查看Linux机器的网络信息。
第五行ether(以太)后面的的52:54:00:9c:e6:65就是MAC地址。
我们也可以点击Windows+r输入cmd,用ipconfig /all指令查看Windows机器网络的所有信息。
其中我链接的是无线局域网,物理地址98-8D-46-55-AC-99就是MAC地址。
每个MAC地址大小为6个字节,48个比特位。
实际上,像硬盘等硬件也有自己的专有的序列号。只不过标识网卡唯一性的MAC地址需要参与网络通信,它太特殊了,所以其他硬件的序列号我们都不关心。
所有的主机都接入了同一个局域网,所以每一个主机都认为它在与其他主机进行通信。
但是我们不妨想象这样一个场景,在一个班级中有小明、小红、小刚等几十个同学。老师正在前面讲课,讲到一半说:“小明,上来把这个题做一下。”此时,小明就站起来走到黑板前拿粉笔并开始写。
首先,老师讲课,学生听课就可以看作老师向学生传递信息。学生之间有事情也会互相交谈,所以学生之间也可以传递信息。学生也可以向老师问问题,所以学生也可以向老师传递信息。如果把每个人都看作一台计算机,那就可以将这个教室看作局域网,大家可以相互通信。
然后,老师叫小明上黑板做题。这句话其实班级内的所有人都听到了,但是因为老师叫的是小明,所以只有小明做出了反应。小红、小刚等其他人知道老师叫的不是自己,就直接忽略了。
这些放到局域网中也一样,局域网中的所有主机都在相互通信。如果一个主机发送了一条信息,所有的主机也都能收到。只是需要该数据的计算机会处理该数据,其他不需要该数据的计算机虽然接收数据,但不会处理它。
我们上面说到的通信方式就是以太网的通信原则。实际上局域网的通信准则有很多,最常见的就是以太网、令牌环网还有无线LAN。正因为最早网络通信局限于局域网,所以不同地区的通信标准会有所差别。
我们举一个例子,用户A和用户B用QQ聊天,A用户给B用户发了一句你好,B用户也接收到了。那这个你好是怎么发送到B用户的电脑上的呢?
首先,我们先向应用层发送你好,这是一个字符串。
这个字符串到达应用层后就需要在前面加上应用层的协议报头,这个报头我们用圆圈表示。
应用层再将加了报头的报文交给传输层,传输层会在前面再加一个传输层的协议报头,我们用四角星表示。
传输层再将加了报头的报文交给网络层,网络层会在前面再加一个网络层的协议报头,我们用六角星表示。
网络层再将加了报头的报文交给数据链路层,数据链路层会在前面再加一个数据链路层的协议报头,我们用云朵表示。
数据链路层再将加了报头的报文交给物理层,此时数据就能交给网络了。
在用户B的电脑接收到的数据会保存物理层中。此时,数据需要传递到应用层。物理层去掉自己的报头(云朵)向数据链路层传递数据,数据链路层去掉自己的报头(六角星)数据向网络层传递数据……
就这样数据不断向上传递,到应用层时,应用层将自己的报头(圆圈)去掉,就将你好显示在了聊天框内。
所以,我们需要知道以下结论:
我们常用的局域网通信标准有以太网、令牌环网和无线LAN。
以太网的通信逻辑上面说过了,同一时刻只允许局域网内的一个主机发送信息。
以太网这个名字的来历还是有个小故事,大家如果上过大学物理可能会对以太这个词有印象。以太最早由亚里士多德提出,它被认为是充满世界的五大元素之一。
后来18世纪,笛卡尔、惠更斯和牛顿都认为以太是存在的,一方面是他们认为光声等的传播需要介质,物质也需要以太进行相互作用。
到了19世纪,由于杨氏干涉的提出,以太论又开始火热。此时的以太不光作为介质,也作为绝对静止的物体存在。所以当时各个科学家就都开始研究这个东西是否存在,也包含爱因斯坦。但研究了半天,他们并没有找不到以太存在的证据,反而找到了一些不存在的证据。所以,直到现在我们都认为以太是不存在的。
到了计算机网络发展的年代,新的科学家们发明出了上面这样的局域网,他们想到物理学家研究以太的各种故事,就把这种局域网起名为以太网。本来这只是玩个物理学家的梗,没想到这个名字一直流传到了现在。
令牌环网就是在某个计算机内发送一个数据,这个数据只能被一个电脑接收到。接收到这个数据的计算机就能够发送数据到网络,而拿不到这个数据的主机就不能发送数据。到这里我们也能认识到,令牌环网的实现和我们学过的锁很像,确实如此,我们学到的知识都是相通的。
无线LAN是以太网的一个变种,用的相对少一些。
所谓跨网络通信就是两个需要通信的主机不在同一个局域网里,一旦需要跨网络,那就需要路由器发挥作用了。
我们看下面这张图,依旧是用户A给用户B发送数据。
用户A发送的你好字符串会不断封装至驱动部分,也就是数据链路层。
由于路由器和用户A的主机属于同一个局域网,所以数据封装到数据链路层就可以传输到路由器上。
路由器必定有两个接口连接用户A和用户B所在的局域网,而此时由于这两个局域网数据链路层协议不一致,再加上路由器工作在网络层,所以路由器会把原来以太网的的报头(以云彩表示)删掉。
然后路由器会再给数据加上令牌环网的报头(以圆对话框表示),此时数据就符合了用户B所在局域网的数据链路层协议,数据就可以一层层向上解包,最终B用户收到”你好“的信息。
打个比方就是,你在冬天从天津去三亚旅游,在冬天的天津你必须穿羽绒服,而在冬天的三亚你只需要穿短袖。所以在上飞机时你穿着羽绒服,而下飞机就要换成短袖。数据在路由器中也要经过脱一件衣服,再穿一件衣服的过程。
正是IP这样的通信方式,能够保证在数据链路层协议不同,或者说局域网配置不同的情况下,让各种局域网链接为广域网。
我们之前使用ifconfig指令看到了Linux机器的MAC地址,ether表示以太,在它后面的由冒号隔开的6个16进制数就是MAC地址。
同样在上面的图片中,inet后面的由点隔开的4个10进制数就是IP地址。
那二者又有什么关系呢?
我可以举个例子,比如说我要从天津市武清区杨村到天津市和平区的劝业场,那我就需要从高德地图等软件上查找可选择的路线。
比如说,我先去创意米兰公交站等749路公交,坐公交到北辰道地铁站。那我的上一站就是家,下一站就是北辰道地铁站。
我到达地铁站后,我要从北辰道站坐地铁转运到和平路站,此时我的上一站就是创意米兰公交站,下一站就是和平路地铁站。
从和平路地铁站出来后,我要沿着和平路走350米到劝业场.此时我的上一站就是北辰道地铁站,下一站就是天津劝业场。
最后我走到劝业场就可以了,但在这其中我的起始地址家和最终地址天津劝业场始终没有发生改变,而上一站和下一站的地址一直在变。
其实对于跨网络的通信也是一样的,最早发送数据的主机IP叫做源IP,最终数据的目的主机IP叫目的IP。
由于主机大部分都不在一个局域网内,所以主机需要在广域网中标识自己的唯一性。源IP与目的IP大部分都使用IP地址,这两个地址可以为我们未来每一个阶段提供方向目标,方便传输的路径选择。
而对于网络传输的上一站,下一站而言,它们一直在不断变化,而且更多的都在局域网内传输。所以这类地址常用MAC地址,为当前的路径选择提供可行性。
跨网络通信的过程大致如下图:
一个用户的数据会被封装到物理层,然后发送给目的IP决定的下一个节点。在下一个节点,数据会被解包至网络层,此时根据目的IP,该节点的设备又会将数据封装至物理层再次发送至下个节点……直到最后发送到目的IP的主机,该主机将数据完全去除报头展现给用户。
上面便是我们网络基础的全部内容了,此时我们能够初步认识网络的运行逻辑并开始接触socket套接字。