文章目录
- 网络基础
- 网络的发展历程
- 网络在哪里的问题
- 网络协议栈各部分所处位置:
- 网络协议栈各层的作用
- 网络协议栈分层的目的
- 网络协议的概念
- 网络协议
- 协议分层的好处
- 理解各层之间直接通信
- OSI七层模型
- TCP/IP五层(或四层)模型
- 网络传输基本流程
- 同局域网的两台主机通信
- 封装和解包
- 报头的理解
- 报头与有效载荷的关系
- 报头与有效载荷进行分离
- 协议的共性
- 跨网络的两台主机通信
- 网络中的地址管理
- 认识IP地址
- 认识MAC地址
网络基础
网络的发展历程
早期:计算机之间相互独立
如果多个计算机要协同完成某种业务,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率非常低下
网络互联:多台计算机连接在一起,完成数据共享
当某个业务需要多台计算机协同完成时,就可以将共享的数据放到服务器中进行集中管理,此时各个计算机就都能获取到这些共享的数据,所以各个业务在处理就能随时进行切换了
一台机器用来共享数据,其他人通过网线连接到该机器
局域网LAN: 计算机数量更多了,通过交换机和路由器连接在一起
后来这样的网络雏形逐渐发展,连入这个网络中的机器变得越来越多,于是就出现了局域网的概念.
在局域网中有一种设备叫做交换机,交换机主要完成局域网内数据的转发工作,也就是在局域网内将数据从一台主机转发给另一台主机
各个局域网之间通过路由器连接起来,路由器主要完成数据的路由转发工作
广域网WAN:将远隔千里的计算机都连在一起
各个局域网之间通过路由器相互连接在一起,便组成了一个更大的网络结构,我们将其称之为广域网
实际局域网和广域网是一种相对的概念,我们也可以将广域网看作一个比较大的局域网
如何理解城域网和校园网呢?
城域网实际就是在一个城市范围内所建立的计算机通信网,而校园网对应的就是在一个校园范围内所建立的计算机通信网
城域网和校园网实际也是一种相对的概念,我们都可以将它们看作一个大的局域网
网络在哪里的问题
这里的网络,指的是网络协议栈,它是一个软件
网络协议栈是分层的,它是贯穿于计算机体系结构的一个软件,尤其是TCP/IP协议栈,是属于操作系统的一部分
我们首先需要知道:软件是可以分层的
例如STL接口和STL库
网络也是软件,所以网络协议栈是层状结构也就不奇怪了
网络协议栈各部分所处位置:
操作系统中包含进程管理、文件管理、内存管理、驱动管理这四大模块,操作系统层与用户层之间有着系统调用层,操作系统层往下是驱动层,而驱动层再往下就是各种硬件设备了
操作系统中的进程管理、文件管理、内存管理、驱动管理是隶属于系统部分的,系统部分的核心工作就是管理好各种软硬件资源,对上提供一个良好稳定的运行环境
操作系统中除了有这四大管理模块,还有与网络协议栈有着密切的关系.网络协议栈主要负责数据的通信,其自顶向下可分为四层,分别是应用层、传输层、网络层、数据链路层
网络协议栈各部分所处位置:
- 应用层是位于用户层的 这部分代码是由网络协议的开发人员来编写的,比如HTTP协议、HTTPS协议以及SSH协议等
- 传输层和网络层是位于操作系统层的 其中传输层最经典的协议叫做TCP协议,网络层最经典的协议叫做IP协议,这就是我们平常所说的TCP/IP协议
- 网络层和传输层就是OS内核的一部分
- 数据链路层是位于驱动层的 其负责真正的数据传输
整个网络协议栈呈现出一种层状结构,网络协议栈贯穿整个OS体系结构
网络协议栈的其他分层方法
在其他书上可能将网络协议栈分为了五层,这多出来的一层就是最底层的物理层
物理层主要就是利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,是与硬件强相关的
将通信过程进行抽象
我们可以将通信过程进行抽象,可以将通信理解成不是两台机器在通信,而是这两台机器当中的网络协议栈之间在进行通信,如下图:
网络协议栈各层的作用
- 数据链路层和物理层
要实现通信我们首先要能够将数据发送出去,而数据链路层和物理层就是负责数据真正的发送过程
- 网络层
在数据链路层和物理层的支持下,现在能够将数据发送出去了,但是我们还应该知道数据应该往哪里发,而网络层完成的就是数据转发,解决了数据去哪里的问题
- 传输层
现在有了发送数据的能力,也知道数据应该往哪里发,但是我们并不能保证发出去的数据能够成功的到达对端主机,比如在传输过程中可能会出现丢包或对端主机关机,甚至对端服务器出错,导致数据传送出现问题.而传输层的工作就是处理传输时遇到的问题,主要是保证数据可靠性
- 应用层
也就是说,网络协议栈的下三层能够保证把数据交付给对端主机,但现在我们还需要明确的是,我们将数据发送给对端主机的目的是什么,而这就是应用层要解决的问题
应用层需要根据特定的通信目的,对数据进行分析与处理,以达到某种业务性的目的
因此网络协议栈的下三层主要的完成的工作就是处理通信细节,而应用层主要完成的就是某种具体的业务细节
因此网络协议栈的顶层应用层对应的就是某种具体的业务细节,而位于应用层之下的各层就对应处理各种通信细节
综上:
误区:认为把数据传送给对面事情就完了
这个只是第一步,在应用层完成
第二步:如何分析和使用数据, 在后面的层完成
网络协议栈分层的目的
我们在设计协议栈的时候也可以不进行分层,将各个层的功能全部写在一起,将这些小模块合并成一个更大的模块.但这样的设计方式对设计人员的要求就非常高了,设计人员必须能够编写从物理层到应用层的整个通信过程的代码,并且最终设计出来的代码的可维护性和可扩展性是很低的
目的:
1)层状结构的本质是软件工程上面的解耦,此时层与层之间只有接口的相互调用关系,此时我们就可以让研究不同领域的开发人员编写不同层的代码,最后再将各层的代码联调起来,由于每一层的代码都是对应领域的专业人员编写的,因此代码联调后整体的性能也是很高的
2)层状结构可以增加代码的可维护性和可扩展性.比如有一天你觉得数据链路层的代码已经无法承担起通信的能力了,那么此时我们就可以用一个新的协议对它进行替换,而其他各层对应的协议都不用换,这就叫做可扩展性
而如果协议栈的某一层出现了问题,我们只要确定了是哪一层出了问题,就可以直接去对应层去找问题,这就叫做代码的可维护性
通过分层完成解耦,一旦解耦,任意一层想要替换,都可以直接进行替换,而并不会影响另一层, 即便有一层当中有bug,只需要把问题聚焦到这一层就可以,不影响其它层
总结**:网络协议栈设计成层状结构,其目的就是为了将层与层之间进行解耦,保证代码的可维护性和可扩展性**
网络协议的概念
所谓的计算机协议,本质就是由程序员自己根据标准文档或者自身喜好的一种约定,网络通信的通信计算机双方必须遵守的规则,并根据协议规定发出各种字段,对方做出对应的响应动作
例如:光电信号
计算机之间的传输媒介是光电信号,通过信号的频率和强弱,表示对应的“1”和“0”信号,从而传递不同的信息
“协议”本质就是一种约定,假如:通信计算机双方曾经做过如下约定:
- 如果code的值为1,则表示需要将data的值存储进数据库
- 如果code的值为2,则表示需要将data的值写入日志信息
- 如果code的值为3,则表示需要将data的值进行打印输出
我们可以用位段的结构来表示某种协议的规定:
struct Cmd
{
int code:4;
int data:28;
};
当A计算机向B计算机发送类似于{1, 0x1234}的数据时,B计算机识别到code的值是1,于是就知道了A计算机是让自己将data的值存储进数据库,这是一种纯软件的约定方案
问题:只要通信的两台主机, 约定好协议就可以了么
计算机生产商有很多,计算机操作系统也有很多,计算机网络硬件设备更是多种多样,何让这些不同厂商之间生产的计算机能够相互顺畅的通信?
就需要有人站出来, 约定一个共同的标准,大家都来遵守, 这就是 网络协议
网络协议
协议分层的好处
网络协议栈设计成层状结构,其目的就是为了将层与层之间进行解耦,保证代码的可维护性和可扩展性
以打电话为例子:
在工程师的角度实际这两个人并不是直接进行沟通的,而是甲的电话将甲说的话记录下来,经过一系列编码转码后,通过通信网络将信息从甲的电话传递到了乙的电话,然后信息在乙的电话中再经过对应的编码转码,最后乙才通过话筒听到了甲所说的话
人与人之间通信使用的是汉语,我们可以将其称为语言层;而电话和电话之间通信使用的是电话系统相关的一些接口,我们可以将其称之为通信设备层
下层使用的通信设备变了/层使用的通信语言变了,但我们仍然可以正常沟通
分层最大的好处在于“封装”,在分层情况下,将某层的协议进行替换后,通信双方之间是不会受到影响的
层状结构是一种很优秀的设计,它一定程度上实现了”解耦“,实现了解耦后,任何一层都可以进行替换,即便在某层中出现BUG,也可以将问题聚焦到指定的一层中,不会影响到其他层
数据自顶向下交互的时候,每一层协议都要添加它的报头
经过以太网交互给对端主机之后,对端主机将自己本层的报头识别出来去掉之后,然后把其它内容交互给上层
**同等的协议栈层会拿到同样的协议报文,同样的报文就意味着如果忽略底层的细节,**所以同层就可以认为:我发什么对方就收到什么,就类比同层协议,好像和对方直接 通信
- 实际上并不是,这就是封装的好处,不需要考虑底层的实现
理解各层之间直接通信
虽然在打电话时我们并不是直接进行沟通的,但是我们可以认为我们是在直接进行沟通,并且这两台电话也不是直接在进行沟通的,数据经过电话后,还需要各种基站,各种电信网络来进行数据转发,但是这两台电话依旧可以认为是直接在和对方电话进行通信的
因此对于网络协议我们需要有一个基本的认识:关于通信,同层协议可以认为自己在和对方层直接进行通信,从而达到简化对于网络协议栈的理解
也就是说,在网络协议栈中我们可以认为通信双方的应用层之间直接在进行通信,也可以认为通信双方的传输层之间直接在进行通信,对于网络层和数据链路层也同样如此
OSI七层模型
OSI组织设计了一个七层网络模型,是一个逻辑上定义的规范.实际上并不真实存在,只是从逻辑角度抽象设计出来的
- OSI(Open System Interconnection,开放系统互联)七层网络模型称为开方式系统互联参考模型,是一个逻辑上的定义和规范
- OSI把网络从逻辑上分为了七层,每一层都有相关的、相对应的物理设备,比如路由器,交换机
- OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输,比如手机和电视之间数据的传输
- OSI七层模型最大的优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯
- 但是,OSI七层模型既复杂又不实用,所以后来在具体实现的时候就对其进行了调整,于是就有了我们现在看到的TCP/IP四层协议
人们在实际将规范实现落地的时候,并没有完全遵照该模型,而是按照实际情况,定义出来了真实的TCP/IP五层(或四层)协议
TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,共同组成了TCP/IP协议簇.TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
- 物理层: 负责光/电信号的传递方式.比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的WiFi无线网使用的电磁波等都属于物理层的概念
- 物理层的能力决定了最大传输速率、传输距离、抗干扰性等.集线器(Hub)就是工作在物理层的
- 数据链路层: 负责设备之间的数据帧的传送和识别
- 例如网卡设备的驱动、帧同步、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作
- 数据链路层底层的网络通信标准有很多,如以太网、令牌环网、无线LAN等.交换机(Switch)就是工作在数据链路层的
- 网络层: 负责地址管理和路由选择
- 例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间数据传输的线路(路由)
- 路由器(Router)就是工作在网络层的
- 传输层: 负责两台主机之间的数据传输
- 例如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机
- 应用层: 负责应用程序间沟通
- 比如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等
- 我们的网络编程主要就是针对应用层的
与OSI七层模型各层的对应关系
物理层我们不作考虑,因此称TCP/IP四层协议.一般而言越靠近用户的设备,实现的网络协议栈越高:
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容
- 对于一台路由器, 它实现了从网络层到物理层
- 对于一台交换机, 它实现了从数据链路层到物理层
- 对于集线器, 它只实现了物理层
但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发)
注意:
- 网络层负责路径规划,也就是选择数据传输的路径,
- 网络层只是预先的规划,链路层负责具体的数据传输过程.
- 传输层负责传输可靠性,保证传输过程中数据的完整,数据丢了要补发.
- 数据传输只是第一步,更重要的是数据的使用
- 应用层决定了传输过来的数据用法
- 链路层不属于操作系统,是底层硬件的驱动程序
- 传输层和网络层是操作系统内核的两层网络协议栈
- 应用层是操作系统之上的应用程序,属于用户进程,由用户使用
网络传输基本流程
同局域网的两台主机通信
**同一个局域网内的主机是能够直接进行通信的,**因为最初局域网设计的目的,就是为了让局域网内的主机能够进行通信
此时各层对应的协议如下:
链路层、传输层、网络层都是处理通信细节,像是快递包裹的运输细节,用户并不关心,用户关心的是应用层处理应用程序细节
当用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装:
- 文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层
- 传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付
- 网络层收到数据后,再添加上对应网络层协议的报头信息,接着将数据再交给链路层
- 链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕
数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:
- 链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层
- 网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付
- 传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层
- 应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据的解包与分用
总结:
1)任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,在这个过程中,每一层协议都会添加上对应的报头信息
2)而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包和分用,在这个过程中,每一层协议都会将对应的报头信息提取出来
封装和解包
1)数据从应用层产生,自顶向下经过传输层、网络层、链路层,最后到达以太网(物理层)
2)在网线中传输到另一台联网主机上,自底向上经过链路层、网络层、传输层,最后到达应用层
- 不同协议层对数据包有不同的称谓,在传输层叫做段,在网络层叫做数据报,在链路层叫做帧
- 应用层数据通过协议栈发到网络上,每层协议都要加上一个数据首部,称为封装
- 首部信息中包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理
数据封装的过程
报头的理解
什么是报头
报头类似于快递单上的快递信息,扫描二维码即可,查看到快递的运输信息
- 报头最重要的是报头的格式 + 数据
报头本质也是一种数据,报头一般是通过位段实现的,因此协议栈的每一层都有一个对应的位段来表示当前层的报头
数据的封装与解包:
- 数据封装,实际就是不断给数据加上各种对应的报头,这些报头里面填充的就是对应的各种协议细节
- 数据解包,实际就是不断从数据中提取对应的报头,并对提取出来的报头进行数据分析
在计算机OS中理解报头
报头也是数据,是一种结构化的数据,在语言角度就是位段:
//示意报头结构
struct my_hdr
{
unsigned int src:16;
unsigned int dst:16;
unsigned int type:8;
unsigned int len:24;
};
struct my_hdr hdr = { 0x1, 0x2, 0x3, 0x9 };
封装就是将报头位段变量使用memcpy
放到有效载荷的前面,解包就使用字段类型的指针struct my_hdr* ptr
向后++即可,就跳过了报头部分,指向有效载部分
为什么要有报头呢
报头中的数据用来指导当前层进行某种协议决策,传输层的报头指导如何传输,网络层的报头指导路径选择,链路层的报头指导如何转发
几乎每一层协议的报头字段中,都要包含两种字段:
1)明确报头和有效载荷的边界,将报头交给对应协议栈的过程叫做解包
2)报文的有效载荷得交给上层的哪一种协议,选择交给上层哪一种协议的过程叫做分用
报文
在计算机系统中,报文由两部分组成:报头和有效载荷,只有当前层的报头被认为是报头,之后的都是有效载荷
报头与有效载荷的关系
报头与有效载荷
当对端主机收到数据后,需要自底向上贯穿协议栈,依次进行数据的解包与分用.在这个解包的过程中,每一层的协议只需要提取出数据中对应的报头,然后对该报头进行分析处理,而剩下的数据则直接交付给上层就行了.
因为每一层的协议实际上只关心数据中与当前层对应的报头信息,而剩下信息的具体内容根本不必关心,我们将数据中除当前层的报头以外的数据叫做“有效载荷”
需要注意的是,上层协议在数据封装时添加的报头信息,在下层协议进行数据解包时看来就是有效载荷
报头与有效载荷进行分离
如何将报头与有效载荷进行分离
协议栈的每一层都要从数据中提取对应的报头信息,而要将数据中的报头提取出来,首先就需要明确报头与有效载荷之间的界限,这样才能将它们进行分离
而每一层添加报头时都是将报头添加到数据的首部的,因此我们只要知道了报头的大小,就能够讲报头和有效载荷进行分离
获取报头大小的方法通常有两种:
- 定长报头
- 就是报头的大小是固定的
- 自描述字段
- 报头当中提供了一个字段,用来表示报头的长度
实际上每个协议都要提供一种方法,让我们获取到报头的大小,这样我们才能在解包时将报头与有效载荷进行分离
当前层如何知道应该将有效载荷交付给上层的哪个协议?
网络协议栈的每一层都可能会对应多种协议,即便将报头与有效载荷分离了,那当前层应该将有效载荷交付给上层对应的哪个协议呢?
- 实际在每种协议的报头当中,几乎都会包含一个字段,表明我们应该把分离出来的有效载荷交付给上层的哪个协议,这就是分用的过程
局域网内传输数据时,该局域网内的所有主机都能收到
除了当前正在进行通信的A主机和B主机以外,还有其他的主机,那A主机是如何将数据成功发送给B主机的呢?
实际当主机A想要发数据给主机B的时候,该局域网内的其他主机也都收到了该数据,只不过除了主机B以外,其他主机识别到该数据并不是发给自己的,此时其他主机就把收到的数据丢弃了
也就是说,在局域网(以太网)通信时,该局域网内所有的主机在底层其实都收到了数据,只不过经过筛选后只提交上来了发给自己的数据
什么是通信碰撞
当主机A在向主机B发送数据时,其他主机彼此之间可能也正在进行通信,甚至主机A在和主机B通信的同时也在和其他主机进行通信
但同一局域网中的所有主机在通信时,使用的都是一个共同的通信信道,因此如果局域网内的多台主机同时进行通信,此时这些数据之间就可能会相互干扰
每一个局域网都可以看作是一个碰撞域,如果某个主机发送出去的数据与其他主机发送的数据之间产生了干扰,我们就称这两台主机在该碰撞域中发生了碰撞
如何判断发送出去的数据是否发生了碰撞
因为发送到局域网当中的数据是所有主机都能够收到的,因此当一个主机将数据发送出去后,该发送主机本身也是能够收到这个数据的
当该主机收到该数据后就可以将其与之前发送出去的数据进行对比,如果发现收到的数据与之前发送出去的数据不相同,则说明在发送过程中发生了碰撞
也就是说,发送主机实际是能够通过某种方式,知道曾经发送出去的数据是否发生了碰撞的
发生碰撞后要如何处理
当一个主机发现自己发送出去的数据产生了碰撞,此时该主机就要执行“碰撞避免”算法
即:当一个主机发送出去的数据产生了碰撞,那么该主机可以选择等一段时间后,再重新发送该数据.这就像现实生活中的两个人同时想要说话,此时对方就都会说“你先说吧”,这实际上就是一种碰撞避免
每个主机如何判断该数据是否是发送给自己的
在局域网中发送的数据实际叫做MAC数据帧,在这个MAC数据帧的报头当中会包含两个字段,分别叫做源MAC地址和目的MAC地址
每一台计算机都至少配有一张网卡,而每一张网卡在出厂时就已经内置了一个48位的序列号,我们将这个序列号称之为“MAC地址”,这个MAC地址是全球唯一的
在局域网中进行通信的时候,每一个主机在收到一个MAC数据帧后,都会提取该MAC数据帧的报头,找到对应的目的MAC地址与自己的MAC地址进行比对
如果该MAC地址与自己的MAC地址不匹配,则直接将该MAC数据帧丢弃,只有MAC地址匹配时,该主机才会将该数据帧的有效载荷继续向上进行交付处理
与碰撞相关的一种局域网攻击机制
如果局域网内的某台主机一直向该局域网内发送一些无用的数据,那么其他主机一发数据就会产生碰撞,此时该局域网也就瘫痪了,这实际就是局域网本身的一个攻击原理
但需要注意的是,这台一直发送“垃圾数据”的主机,必须要通过某种方式绕过“碰撞避免”算法,否则当其发送的数据产生碰撞后,该主机自己也会执行“碰撞避免”算法
协议的共性
1)明确报头和有效载荷的边界 ->便于解包
2)协议当中必须包含一个字段,表明应该将有效载荷交付给上层的哪个协议 -> 便于分用
实际当我们要学习一种协议的时候,首先就应该明确这两点,因为当我们在解包的时候必须将报头与有效载荷分离,而当我们在分用的时候必须知道应该将有效载荷交付给上层的哪个协议
跨网络的两台主机通信
上面说的都是同一局域网内的主机之间的通信,那跨局域网的两台主机之间是如何进行通信的呢
跨网段的主机的文件传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器
局域网之间都是通过路由器连接起来的,因此一个路由器至少能够横跨两个局域网
这些被路由器级联局域网都认为:该路由器就是本局域网内的一台主机,因此路由器可以和这些局域网内的任意一台主机进行直接通信
如果路由器级联的两个局域网采用的是相同的通信标准
例如:局域网1当中的主机A想要和局域网2当中的主机F进行通信,那么主机A可以先将数据发送给路由器,然后路由器再将数据转发给局域网2当中的主机F
路由器级联的局域网可能采用的是不同的通信标准
例如:局域网1采用的是以太网,而局域网2采用的却是令牌环网
由于以太网和令牌环网是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包
这种情况实际是由路由器来处理的,路由器是工作在网络层的一个设备,我们可以认为路由器当中的协议栈是下面这样的
此时当数据要从局域网1发送到局域网2时:
1)路由器收到局域网1的数据后,会先将以太网对应的报头进行解包,然后将剩下的数据向上交付给网络层
2)在网络层进行一系列数据分析后,再将数据向下交付给链路层,此时在链路层当中就会给该数据添加上令牌环对应的报头信息
3)然后再将该数据发送到局域网2当中,此时该数据就能够在令牌环网当中传输了
如下图:
问:一个路由器可能会级联多个局域网,路由器需要将一个局域网的数据转发到另一个局域网时,路由器如何知道该数据应该转发到哪一个局域网的呢
路由器其实是通过IP地址来确定数据的转发方向的,因特网上的每台计算机都有一个唯一的IP地址,而在数据向下进行封装时,在网络层封装的报头当中就会包含两个字段,分别是源IP地址和目的IP地址.
当路由器需要将一个局域网的数据转发到另一个局域网时,在路由器的链路层会先将数据的在当前局域网对应的底层报头去掉,然后将剩下的数据向上交付给网络层,此时在网络层就可以获取到该数据对应的目的IP地址,然后路由器就可以根据该IP地址在路由表当中进行查找,最终就能够确认该数据应该发送到哪一个局域网
屏蔽底层的差异
IP地址的存在除了帮助数据“路由”以外,还有一个很重要的作用,那就是屏蔽了底层网络的差异
因为有路由器的存在,发送端发送的数据和路由器收到的数据和对方主机收到的数据都是一样的. ,底层网络一个是以太网,一个是令牌环网,但是在IP及其IP层往上的所有的协议看不到底层网络的任何差异, 因为有路由器的存在帮我们屏蔽了底层网络的差异,
**对于通信主机双方的IP层及其往上的协议来说,**它们并不需要关心底层采用的是以太网还是令牌环网,它们认为只要填写了源IP地址和目的IP地址就能够将数据发送出去,因此现在主流的网络也叫做“IP网络”
这种类似的技术还有:
- 虚拟地址空间: 屏蔽了内存之间的差别,让所有的进程看到的都是同一块内存,并且这块内存的布局都是一样的
- 一切皆文件: 通过文件结构体和函数指针的方案,让我们能够以对待文件的方式对待某些资源
网络中的地址管理
认识IP地址
- IP地址是在IP协议中,用来标识网络中不同主机的地址
- 对于IPv4来说,IP地址是一个4字节,32位的整数
- 我们通常也使用“点分十进制”的字符串表示IP地址
- 例如192.168.0.1,用点分割的每一个数字表示一个字节,范围是0-255
需要注意的是,IP协议有两个版本,分别是IPv4和IPv6
- IPv4用32个比特位来标识IP地址,而IPv6用128个比特位来标识IP地址
认识MAC地址
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示
- (例如:08:00:27:03:fb:19)
- 在网卡出厂时就确定了,不能修改
- MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突,也有些网卡支持用户配置MAC地址)
每台主机都有它的Mac地址
如何在Linux中查看自己的MAC地址
ifconfig
命令可以查看当前主机所对应的网卡信息
我们用到的大部分局域网都是以太网标准,其中ether
对应就有”以太“的意思,而ether
后面的这个地址就是当前云服务器所对应的MAC地址
但实际云服务器上的MAC地址可能不是真正的MAC地址,该MAC地址可能模拟出来的
以唐僧为例子:
唐僧身上有几套地址呢? 两套!
1.从哪里来,到哪里去 ,这个是几乎一直不变的 ->IP地址
2.上一站从哪里来,下一站到哪里去(一直在变化 -> Mac地址)
为什么传输的时候,Mac地址会一直在变化
因为 在数据链路层,经过路由器,一直在进行封装和解包