目录
一,关于网络
二,协议
2.1 协议是什么,有什么用?
2.2 协议标准谁定的?
2.3 协议分层
2.4 OSI 七层模型
2.5 TCP/IP 四层模型
三,网络传输基本流程
3.1 局域网中两台主机通信*
3.2 报文的封装与解包
3.3 以太网通信
3.4 数据碰撞
3.5 跨网络的两台主机通信*
四,网络中的地址管理
4.1 Mac地址
4.2 IP地址
五,补充
5.1 “以太网”名字的由来
5.2 集线器
5.3 如何看待局域网
一,关于网络
独立模式:计算机之间相互独立
在早期的时候,计算机是相互独立的,但有时一台计算机难以完成某个大型计算,所以需要多台计算机协同完成业务,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率比较低下
网络互联:多台计算机相互独立
于是,为了更方便计算机之间进行数据交互,于是就用一根数据线,将三台电脑连上一个总的计算机,这个计算机就叫做“服务器”,所以这时,就可以将共享的数据放到服务器中进行集中管理,此时各个计算机就能获取到这些共享的数据了,所以各个业务在处理时就能随时进行切换了
局域网LAN:计算机的数量更多了,通过交换机和路由器连接在一起
后来这样的网络雏形逐渐发展,连入这个网络中的机器变得越来越多,于是就有了局域网的概念
交换机的作用后面会介绍
广域网WAN:将远隔千里的计算机连接在一起
各个局域网之间通过入口路由器和出口路由器相互连接在一起,便组成了一个更大的网络结构,我们称之为“广域网”。广域网和局域网是相对的概念,也可以把广域网看作一个非常大的局域网
- 比如我们在学校里使用的校园网,就是一个在校园范围内建立的局域网,只在校园里有信号,出了校园就没了
二,协议
2.1 协议是什么,有什么用?
协议是一种约定。
两台计算机使用网络连接上后,相隔距离可能会变得非常长,而且数据也是有类别的,有些数据就单纯的就是数据,而有些数据是对另一台计算机的请求指令,所以数据类别不同,对数据的处理方式可能也会不同
场景:
- 以前家里只有座机,打电话时对方接了就要收费,对方没接就不收费
- 我在远方上大学,老爸在家里,于是我就和老爸约定:每次往家里打电话,响一声代表报平安,响两声代表需要打生活费,响三声才接电话
- 这种我和我爸对响几声有什么含义表示我和我爸的一种约定,而这就叫做我和你爸达成的某种协议
问题:为啥要这样做?
解答:能减少沟通的成本,提高双方沟通的效率
问题:如何保证你的数据能准确到达下一个设备?长距离传输的数据丢失如何解决?如何定位主机?接收方如何处理数据?
解答:前三个是数据问题,第四个是应用问题;丢包有tcp协议来解决,定位主机就通过ip协议来,数据能准确到达下一个设备用数据链路层来解决
上面所有的数据问题,归根结底就一点:单纯的传输距离变长了
场景:
- 我们收快递,我们只需要快递盒子里面的东西,但是我们买的东西都会有一个盒子包装起来,并且还贴上一张纸,这个盒子以及上面的那张纸,我们就称之为“协议”,(发给我们的东西比原来的东西多发给了我一些东西)
- 那张纸上面有很多信息,如果对应到代码上,就可以用结构体来表示
- 计算机之间的传输媒介是光信号和电信号,通过“频率”和“强弱”来表示 0 和 1 这样的信息,要想传递各种不同的信息,就需要约定好双方的数据格式
总结:
- 协议就是双方的一种约定,最终它的表现形式就是结构体对象。两个主机有相同的结构体对象,这样的话传输的时候另一个主机就能立马识别到收到的结构体信息,提高数据传输效率
- 计算机生产厂商有很多,OS也有很多,硬件设备也有很多,所以光光有协议也不够,所以必须要有一个硬件通信标准,称为“行业标准”,硬件标准,软件协议,协议只是标准的一个子集
2.2 协议标准谁定的?
上面也说过了,现在的计算机生产厂商很多,计算机操作系统也很多,计算机硬件更多,那么为了让这样的不同厂商的计算机能够相互顺畅地使用网络通信,那么就需要有一个代表站出来,与所有厂商约定一个共同地标准,并且要求大家都遵守这样地标准,这就是“网络协议”。
而这个代表一般都是该领域中地“大佬”,因为网络协议地定制就是“规则”的定制,比如5G标准就是华为定义的,因为华为在通信领域已经是“大佬”了,所以它就是通信领域的代表
正所谓“一流的企业做标准,二流的企业做品牌,三流的企业做产品”。标准的定制已不是是公益性,开源性的,制定标准的目的是为了更方便人们的生活的,同时在服务人们的同时,还有一部分是有一定盈利性质的,就比如“专利”,毕竟人家也是要吃饭的,能够理解
2.3 协议分层
- 操作系统里有多种协议,所以要进行协议管理 -- 先描述,再组织
- 协议本质就是软件,软件是可以“分层”的(分层:比如在类里面编写成员方法,main函数去调用;或者C++有继承体系,每一层继承可以认为就是一层软件层,改子类不影响父类)
- 所以协议在设计的时候,就是被层状划分的
生活中的例子:我们打电话的时候,本质是你的手机在和对方的手机进行通信,表面上是人在人的语言层上交流,底层则是两部电话用它们的方式来进行通信,这也是一种分层
问题: 为什么要划分为层状结构呢?
解答:
- 场景逐渐变得复杂:比如前面打电话的例子,随着技术发展,人与人沟通从面对面沟通到远距离沟通,这也是应用场景变复杂的体现
- 功能解耦,便于人们进行各种维护:还是打电话的例子,人与人沟通,电话与电话沟通,两者之间不影响,而且便于维护是指如果出问题,只需要在人的层面或者电话层面找问题就好了,不用整体找)-->所以把网络协议也搞成了层状结构
总结: 协议为什么要分层呢?技术上,网络代码的规模太大,需要解耦;实际情况下,就是问题是分层的,而协议是为了解决问题的,所以协议也是分层的。
2.4 OSI 七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范。
- OSI把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机。
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输,比如手机和电视之间的数据传输
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七 个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯
- 但是,由于OSI七层模型比较复杂并且不太实用,于是在后面具体实现的时候对其进行了跳转,于是就有我们现在看到的TCP/IP 五层模型(其中物理层我们做应用的暂不考虑,于是也可以称为四层模型)
分层名称 | 功能 | 每层功能概览 |
---|---|---|
应用层 | 针对特定应用的协议 | |
表示层 | 通信固有数据格式和网络标准格式的转换 | |
会话层 | 通信管理。负责建立和断开通信连接(数据流动的逻辑通路)。管理传输层以下的分层 | |
传输层 | 管理两个节点之间的数据传输。负责可靠传输(确保数据被可靠地传送到目标地址) | |
网络层 | 地址管理与路由选择 | |
数据链路层 | 互连设备之间传送和识别数据帧 | |
物理层 | 以 0/1 代表电压地高低以及灯光地山灭,界定连接器地网线的规格 |
2.5 TCP/IP 四层模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 物理层: 负责 光/电 信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆 (现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决 定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测 到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网, 无线LAN等标准。交换机(Switch)工作在数据链路层。
- 网络层: 负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
- 传输层: 负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问 协议(Telnet)等。我们的网络编程主要就是针对应用层
TCP/IP 四层模型和OSI七层模型的关系如下:
通信的复杂程度,本质是和距离成正比的
问题:复杂体现在哪里,是协议栈要解决的问题吗?
应用范畴:
- 如何处理数据 --> 应用层协议 --> 对应计算机体系结构的“用户层”
- 丢包(我发出去的消息对方没接收到) --> 传输层协议 --> 对应OS层
- 定位问题(如何快速定位对方的主机) --> 网络层协议 --> 也是OS层,这两个传输层和网络层协议,都对应这Linux内核中的模块
- 前两个问题解决了,但是两个主机相隔几千米,数据传输时会经过很多路由器,所以要解决主机切换的问题(解决下一跳主机的问题) --> 数据链路层协议(还有物理层协议,但不是软件层的,所以暂时不考虑) --> 对应驱动层(物理层对应硬件层)
这五种协议就称之为 --> TCP/IP协议的五层层状协议
问题:网络协议栈和我们之前学习的Linux系统有什么关系呢?
解答:
- 往后我们学习的网络层和传输层就是在OS内实现的,所以我们要花大量时间学习OS的知识。
- 网卡是一个硬件,所以网络通信的本质就是用户在访问硬件,而我们写的各种代码本质也是在和硬件交流,所以网络通信本质也是在访问硬件。
- 但是用户没资格直接访问硬件,因为OS是硬件的管理者,它不允许上层用户直接访问硬件。但是我们用户要想达成目的就必须得访问网卡等硬件,所以OS要给用户提供对应的相关系统调用接口。
所以操作系统有很多,但是网络都是一样的,都必须遵守上面的网络标准,不然你这个操作系统就没法入网,网络协议栈都是一样的
网络通信的本质: 就是贯穿协议栈的过程。
三,网络传输基本流程
3.1 局域网中两台主机通信*
同一个局域网内的主机是可以不用跨网络直接通信的,因为局域网最初的设计目的,就是为了让局域网内的主机进行快速通信
局域网协议有很多,但是现在以太网是主流,以太网是属于局域网通信标准的一种:
网络通信的的本质就是贯穿协议栈的过程,所以当用户要将文件传输给另一台主机前,要对该文件数据贯穿网络协议栈进行封装:
- ①应用层(FTP协议):首先如果用户发送信息“你好”,首先对在“你好”前面加上应用层自己对应的报头,然后拼接起来,形成了在应用层的一个报文
- ②传输层(TCP协议):我们需要保证发送的消息有序,所以需要两个设备的传输层要有一定的协商,所以传输层也要有自己的协议,然后给每一个报文信息加上序号,而这个需要由传输层自己实现
- ③网络层(IP协议):一样的再次在报文前面加上网络层它自己的报文信息(src,dst等)
- ④链路层(以太网协议):和上面一样的逻辑
像上面这样将信息自顶向下添加各自层报文的动作我们叫做“封装”的过程,每层都要添加的信息我们叫做“报头”,其中我们把去掉报头的剩下的部分称之为“有效载荷” --> 所以我们目前可以认为:报文 = 报头 + 有效载荷
我们把数据发出去后,最先是对方的网卡最先拿到数据,然后网卡把数据放到OS的内存里
问题:为什么要交到内存里?
解答:冯诺依曼体系结构这样规定的,外设拿到的数据要想被CPU处理必须先放到内存里
通过以太网把报文从一个设备放到另一个设备的链路层,然后接收方再一层一层把报头去掉,把有效载荷向上交付,最后到应用层时,就能够把“你好”呈现给对方的屏幕上,完成一次局域网通信过程。
去报头的过程叫做“解包”,而局域网两台设备通信的过程,本质就是不断进行 封装 和 解包 的过程
3.2 报文的封装与解包
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame)。
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装 (Encapsulation)。
- 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。后面详细介绍协议报头字段时会具体介绍
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理
下面是数据封装的过程:
下面是数据分用的过程:
重点:
封装的时候,也要考虑未来对方设备解包的问题,如果不考虑解包问题,那么就相当于把两杯水倒在一起容易,但是想从一杯水中分离原来两杯水就难。
- 几乎任何层的协议,都要提供一种能力:将报头和有效载荷分离的能力
- 几乎任何层的协议,都要在报头中提供:决定将自己的有效载荷交付给上层的哪一个协议的能力 --> 报文的分用的过程
上面两点是大部分协议的共性,未来我们具体学习协议的时候会经常涉及这两个问题,就和之前学习Linux的“先描述,再组织”一样
3.3 以太网通信
以太网解决的问题是:一台主机是怎么把数据准确交给另一台主机的?
场景:
- 一个教室有很多人,老师叫张三站起来答问题,张三站起来了,但其他同学没有,这时候,老师说的话全班都听到了,但是只有张三站起来了。
- 李四当然也听到了老师的话,所以李四对老师发的报文做提取,然后发现这个消息是要发给张三的,然后李四将自己的名字和张三做对比,发现自己不是张三,然后李四就把接收到的报文全部丢弃了。
- 然后老师问张三要作业,然后张三说他昨天交了,然后老师想起来昨天已经收了作业了,于是让张三坐下。张三说昨天交了的时候,全班同学再次听到了张三发出的报文,但是依旧丢弃,因为这个报文是发给老师的,这样,老师就和张三在局域网中完成了一次通信
以太网通信和上面的场景类似,一台主机发送报文的时候,其实所有的主机都接受到了消息,每个设备读取报文然后丢弃报文,但是只有指定的设备才会开始解包,丢弃报文的阶段在链路层就已经完成,上层不关心
像这种所有主机收到了报文,但是大部分都在数据链路层都丢弃了,只有指定设备才会继续解包,这种所有主机都遵守的“约定”叫做“以太网协议”,以“以太网协议”构建的网络通信叫做“以太网通信”,保证以太网通信的基础是Mac地址,后面介绍
3.4 数据碰撞
场景:还是教室的场景,在课间的时候,都会乱糟糟的,大家都在大声喧哗,张三对李四说的话李四可能都听不清楚。
所以局域网也和教室类似,每台主机都可以往网络中发送报文,同时每台主机也可以接收报文
但就和上面场景一样,当每台主机都往局域网中发送大量报文,就又可能发生“数据碰撞”,所以要想“搞掉”局域网,就可以直接往网络里塞大量垃圾报文,就可以增加碰撞概率,使所有数据失效
我们也把多台主机构成的局域网叫”碰撞域“。
所以发送方主机都要执行避免碰撞的算法,让可能会发送碰撞的数据等待随机时间再发
问题:我咋知道碰撞了?
解答:
- 最简单的例子,我们自己说话我们自己也能听到,数据发送也是同理。
- 当主机收到一个数据后将其与之前发送的数据做对比,如果收到的数据与之前发送的数据不一样,则可以计算出发送过程中发送了碰撞
- 那么当检测到发生了碰撞之后,主机可以选择等待一段时间再重新发送该数据。就像现实生活中的两个人想要同时说话,此时会有一方说:“你先说吧”,这也是一种碰撞避免
注意:
- 大多数情况下,网卡会直接丢掉不属于自己的报文,但是网卡有一种工作模式叫做”混杂模式“,可以通过系统接口打开,这种模式下,网卡拿到报文之后,如果不是自己的报文也会交给上层去解包,而这样肯定会有安全问题。
- 但是我们一般不用担心,如果我们的数据在应用层做了加密,就算被抓包了,它也看不到,所以我们怕的就是没有加密的数据被抓包
- 在局域网中主机越多碰撞的概率越大,所以大的局域网都会有”交换机“这个设备,它的原理类似把一个大的局域网再次分成了很多个小局域网,当一个小局域网的两台设备要进行数据交换的时候,只要在它的那个小局域网内进行数据交流即可,防止了数据交流的进一步扩大。所以交换机的核心工作就是: 划分碰撞域。
3.5 跨网络的两台主机通信*
局域网之间是通过路由器连接起来的,路由器可以认为是局域网中的一台“特殊”主机;没错,路由器也是主机,它的“特殊”是因为路由器可以跨局域网与其他局域网的路由器进行数据通信,因此路由器是跨网络两台主机通信的基本保证。
上面的是路由器级联的两个采用相同的通信标准进行通信的过程,但是被路由器级联的局域网可能采用的是不同的通信标准,比如局域网1采用的是“以太网通信”,而局域网2采用的是“令牌环网”通信:
由于 以太网 和 令牌环 网采用的是不同的通信表春,因此它们给数据添加的报头也是不一样的,所以令牌环网中的主机无法对以太网的数据帧进行解包
这样的问题一般是由路由器来解决的:
- 路由器也是局域网中的主机,当数据从局域网1发到局域网2时,最先是路由器的数据链路层收到报文
- 然后路由器先对报文进行解包,将以太网对应的报头去掉,然后交给上层网络层
- 网络层进行一系列数据分析后,再将数据向下交付给链路层,此时链路层会再次给报文添加上令牌环网对应的报头,然后再发送到局域网2中,这样就能使数据在令牌环网中传输了,具体过程如下图:
四,网络中的地址管理
4.1 Mac地址
- 前面在以太网通信时提到了“如何保证局域网中每台主机的唯一性”,就是通过Mac地址来的保证的
- 每一个网卡在出厂时都有一个48比特位的长度的序列号,并且在全球是唯一的(其实只要保证其在局域网的唯一性即可),然后这个序列就是Mac地址,不能修改。
在Linux中,使用 ifconfig 命令可以查看当前主机对应的网卡信息:
4.2 IP地址
场景:假如你是辽宁人,你要去云南玩,不坐飞机,就坐火车,边坐边玩,你们先到河北,然后再去山西,接着陕西,四川,最后云南。最后我们规划出来一条辽宁到四川的路线,而在每两个节点之间,都有两套地址:“上一站你从哪来,下一站要到哪里去”。我们这个两站地址一直变化的,但是总路程的不变,还是辽宁到云南。中间站变化的依据是“我要去哪里”。当我们到四川时,问当地人问题,当地人会说:“你从哪里来(辽宁)”,“你要去哪里(云南)”,“你上一站从哪来(陕西)”
所以我们会有两套地址,一套是你从辽宁到四川,这个不变,另一套是你的临时地址,你的上一站和下一站,这个会根据你当前的位置一直变化,而前者我们不变的地址就叫做 “IP”地址,有原地址IP和目的IP地址,后者变化的地址就是Mac地址问题:①IP地址是什么?②为什么要有IP地址?
解答:
- ①:IP地址是IPv4的简称,为四字节,32比特位的整数,类似 192.168.1.1 这样的风格
- ②:可以指导我们进行路径规划,我们就可以拿着ip地址不断进行路径规划
IP地址的使用过程:
- ip协议加报头时,会加个srcip和dstip,表示发送地和接收地,然后继续往下交付给以太网驱动程序,以太网也添加报头
- 然后我要把客户端C的数据转发给客户端S,如果目的ip和我在一个子网,就不给路由器了;如果不在一个子网,就要先把数据交给路由器1,而两者的本质是一样的:局域网通信
- 当C要把数据给路由器1,就得先知道路由器1的Mac地址,假设路由器的ip地址是IP_R,Mac地址为Mac_R,所以以太网驱动加报头时,就把Mac_C和Mac_R加进去,然后扔到以太网去,然后就和前面的局域网通信原理一样, 最后只有路由器1拿到了报文
- 然后路由器1做报头方面的解析,然后识别到ip协议报文中目的地S的ip,然后如果路由器查自己的路由表,发现刚好和S的ip相连,于是就把报文直接发到S所在局域网的路由器2
- 但是路由器2不能把数据直接交给S,要先向下交付交给令牌环驱动程序,然后添加令牌环的报头,然后令牌环进行识别,将报头和有效荷载分离,然后就和前面一样一层层向上交付,就到了S主机的应用层。在这个给过程中, 除了令牌环协议,每一层的收发结果是完全一样的
总结:
- 有了路由器,就保证了ip报文才可以在全球所有的子网当中自由通行,因为到一个子网当中,路由器会去掉老的报头,在封装个符合当前局域网的新的报头,这样的话,我们的局域网中以太网和令牌环网在整个网络中底层的差异就屏蔽了,因为路由器会更新报头,并且路由器要横跨两网络,所以路由器也必须有以太网驱动也要有令牌环驱动
- 所以报文在每个路由器跳转过程中,虽然每个路由器都会对报文进行解包,但是都只是解包局部,然后重新封装时也是只封装局部
- 在路由器会重新解包和封装的过程之中,IP层往上所有的协议都可以做成一样的,底层协议可以有很大的差异,但正是因为有IP地址,再加上工作在IP层的路由器的存在,IP实现了全球主机的软件虚拟层的“一切皆是IP报文”,屏蔽了底层硬件的各种差别。
- Mac的使命就是在局域网中把数据从一个主机送到另一个主机,然后到下一个路由器时,会把旧的Mac地址丢掉,然后加上新路由器在它的局域网中的Mac地址,
ip尤其是目的ip,一般是不会改变的,协助我们进行路径选择;mac地址,出局域网之后,来源和目的都要丢弃,让路由器重新封装
五,补充
5.1 “以太网”名字的由来
“以太”这个名字来源于物理学,在20世界初,很多科学家认为“光的传播也是需要介质的”,那么科学家们就发现:光能从太阳经过太空传播到地球上,那么地外空间的真空中一定也有一种物质能使光传播,所以科学家们就把这个物质称为:“以太”
但是后面科学家们经过实验发现,“以太”不可能存在,真空就是真空,里面没有任何东西;但值得一提的是,在这个故事线中,图灵和冯诺依曼也参与过这场讨论,因为它们不仅仅是科学家,也是数学家
经过后面的发展,诞生了互联网,而互联网也需要有个名字,于是当时的人们将其命名为“以太网”,因为在物理学史上人们认为“以太”就是传送物质的介质,也就是说“以太”具有某种通信能力,虽然“以太”实际上不存在,诞生现在计算机领域出来了一个能够传输信息的“网络”,于是早期的局域网标准就被命名为“以太网”
5.2 集线器
集线器是工作在物理层上的一个设备
电磁信号在长距离传输过程中,信号是会衰减的,所以集线器的功能就是对接收到的信号进行再生整形放大,以扩大传输距离
需要注意的是,集线器属于纯硬件网络底层设备,基本上不具有类似于交换机的“只能记忆”能力和“学习”能力,也不具备交换机有的Mac地址表,所以它发送数据没有针对性,所以是采用广播方式发送,简单来说就是把数据包发送到与集线器相连的所有节点
5.3 如何看待局域网
局域网某种程度上算是该局域网中所有主机的共享资源,任何时刻都只允许一个主机向局域网当中发数据,换句话说就是保证多台设备访问共享资源时的互斥访问,所以局域网可以看作多台设备共享的临界资源
未来我们往网络发送数据本质也是通过进程在网络读和网络写