【Linux】网络基础

计算机网络背景

网络发展

独立模式: 计算机之间相互独立;

【Linux】网络基础_第1张图片

在早期的时候,计算机之间是相互独立的,此时如果多个计算机要协同完成某种业务,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率非常低下。 

网络互联: 多台计算机连接在一起, 完成数据共享; 

【Linux】网络基础_第2张图片

随着网络的进步,人们开始考虑将不同的计算机连接在一起,实现更高效的数据共享和协同工作。当某个业务需要多台计算机协作时,数据被集中存放在服务器上,进行统一管理。这使得每台计算机都可以轻松访问这些共享数据,从而轻松地在不同业务之间进行切换,提高了工作效率。

局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起;

【Linux】网络基础_第3张图片

随着网络的不断发展和扩大,越来越多的机器被连接进来,形成了局域网的构架。

在这个局域网中,有一种关键设备叫做交换机。它的主要职责是处理局域网内部的数据传输,即确保数据能够从一个主机准确地转发到另一个主机。

而各个局域网之间则是通过路由器相互连接的。路由器的主要任务是管理数据的路由和转发,确保数据能够从源主机经过一系列的网络节点,最终到达目标主机。

广域网WAN: 将远隔千里的计算机都连在一起; 

【Linux】网络基础_第4张图片

局域网之间通过路由器相互连接,形成一个更广泛的网络结构,这就是我们所说的广域网。实际上,局域网和广域网是相对的概念,我们可以将广域网看作是一个大型的局域网。

比如我们学校的校园网,校园网对应的就是在一个校园范围内所建立的计算机通信网。校园网实际也是一种相对的概念,我们都可以将它们看作一个大的局域网。

认识 "协议"

"协议" 是一种约定。通信双方只要曾经做过某种约定,之后就可以使用这种约定来完成某种事情

举个例子:

小李每个月打电话向家里要生活费,由于接通电话就需要产生话费。所以小李和小李爸爸做出了这种约定,电话响一声就是小李没有生活费了,小李爸爸就不需要接电话,只需要往小李银行卡打生活费就可以了。如果电话声大于三声,就说明是有其他事情,这个时候小李爸爸再接电话。

计算机之间的传输媒介是光信号和电信号。通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。

【Linux】网络基础_第5张图片

在Linux网络中,“网络协议”可以被理解为一种约定,用于规定计算机之间如何进行通信。这种约定涉及了数据的格式、传输方式、数据交换规则等方面,以确保计算机之间能够正确地相互理解和交流。 

那么协议应该由谁来定制呢?

在当前这个互联网时代,计算机生产商有很多,计算机操作系统也有很多,计算机网络硬件设备更是多种多样,那我们是如何让这些不同厂商之间生产的计算机能够相互顺畅的通信的呢?这时候就需要有人站出来,约定一个共同的标准,并且让大家都来遵守这个标准,这就是网络协议。

在这个高度互联的世界中,网络协议的定制至关重要。这不仅关乎技术的进步,更关乎行业的未来。因为,制定规则的人往往就是该领域的领头羊。以5G标准的定制为例,华为凭借其在通信领域的深厚实力,成为这个标准的重要制定者。这无疑证明了华为在该领域的卓越地位。

网络协议初识

协议栈 

  • 我们日常在手机或电脑上使用的应用程序,如抖音、快手或淘宝,都属于应用层的服务。当我们在这些应用上发出请求时,这些请求会首先被传递到我们的设备操作系统中。操作系统不仅负责管理设备的进程、文件、内存和驱动,还内嵌了一个重要的组件——软件协议栈。
  • 协议栈的作用是将我们的请求数据进行封装,然后通过网卡发送到网络中。在网络中,数据会经过多个路由器的转发,最终到达提供服务的目标服务器。这台目标服务器其实也是一台运行着Linux操作系统的计算机。
  • 值得注意的是,我们使用的设备可能运行的是Windows、安卓或iOS等不同的操作系统,但这并不影响我们访问目标服务器。因为服务器也有自己的协议栈,能够接收并处理来自各种操作系统的请求。
  • 当目标服务器收到数据后,它的协议栈会进行数据解封装操作,并将解封装后的数据传递给应用层。在应用层,运行着与我们的请求相对应的软件服务器,如抖音服务器、快手服务器或淘宝服务器。这些软件服务器会对收到的请求进行处理,并将处理结果以相同的方式返回给我们的设备。这样,我们就能在手机上看到抖音的视频、快手的直播或淘宝的商品信息了。

【Linux】网络基础_第6张图片

不同操作系统在进程管理、文件管理、内存管理和驱动管理方面的实现细节可能有所不同。例如,Windows和Linux在处理多线程的方式上存在差异:Linux通过轻量级进程来模拟线程,而Windows则采用了真正的线程机制。

然而,协议栈是由网络标准组织统一定义的,具有全球通用性。这意味着无论是哪种操作系统,都必须遵循这些标准来实现协议栈。因此,尽管客户端和服务端可能运行着不同的操作系统,它们在数据封包和解包操作上的方法是相同的。这种一致性确保了数据在不同操作系统之间能够无缝传输,确保了网络通信的顺畅进行。

协议分层

我们先来看下面这个例子:

A和C通过电话机进行通话。在逻辑上,我们认为是人和人,电话和电话在沟通。但是站在工程师的角度。其实两个人不是直接进行沟通的,而是人和电话在进行沟通。A的电话机将A说的话记录下来,经过一系列的编码,通过通信网络将信息传递到C的电话,然后信息在C的电话进行转码,最后C才听到了A的话。

A和C之间的通信,我们称为语言层,他们通话用的是汉语,我们叫汉语协议;而电话机和电话机通信用的是一些电话系统的一些接口,我们将电话机直接的通信称为通信设备层。

【Linux】网络基础_第7张图片

如果将通信设备换成智能手机或者对讲机,这仅仅是在通信设备层变更了;或者两个人通过英语进行交流,这仅仅是在语言层进行变更了,仍然可以正常沟通。

【Linux】网络基础_第8张图片

分层最大的好处在于“封装”,在分层情况下,将某层的协议进行替换后,通信双方之间是不会受到影响的。

我们知道的是,操作系统中包含进程管理、文件管理、内存管理、驱动管理这四大模块,操作系统层与用户层之间有着系统调用层,操作系统层往下是驱动层,而驱动层再往下就是各种硬件设备了。

【Linux】网络基础_第9张图片

操作系统中除了有这四大管理模块,还有与网络协议栈有着密切的关系。网络协议栈主要负责数据的通信,有OSI七层模型和TCP/IP五层(或四层)模型。下面我们来介绍这两种网络协议栈分层模型:

OSI七层模型

  • OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
  • 把网络从逻辑上分为了7层。每一层都有相关、相对应的物理设备,比如路由器,交换机;
  • OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
  • 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
  • 但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解。

【Linux】网络基础_第10张图片

TCP/IP五层(或四层)模型 

TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。自顶向下可分为5层,分别是应用层、传输层、网络层、数据链路层、物理层。

  • 物理层: 负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层.

集线器:电磁信号在长距离传输过程中信号是会衰减的,而集线器的主要功能就是对接收到的信号进行再生放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。

  • 数据链路层: 负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网, 无线LAN等标准交换机(Switch)工作在数据链路层.
  • 网络层: 负责地址管理和路由选择。例如在IP协议中, 通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层
  • 传输层: 负责两台主机之间的数据传输。传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机.
  • 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层. 

【Linux】网络基础_第11张图片

TCP/IP五层模型与OSI七层模型各层的对应关系: 

【Linux】网络基础_第12张图片可以看到,它们的下面几层几乎是没有区别的,操作系统对应的是传输层和网络层数据链路层和物理层都是对应在驱动层的,而TCP/IP协议当中的应用层就对应到OSI七层协议当中的应用层、表示层和会话层。物理层我们考虑的比较少,因此很多时候也可以称为 TCP/IP四层模型。

网络协议栈各部分所处位置:

  • 应用层是位于用户层的。 这部分代码是由网络协议的开发人员来编写的,比如HTTP协议、HTTPS协议以及SSH协议等。
  • 传输层和网络层是位于操作系统层的。 其中传输层最经典的协议叫做TCP协议,网络层最经典的协议叫做IP协议,这就是我们平常所说的TCP/IP协议。
  • 数据链路层是位于驱动层的。 其负责真正的数据传输。

【Linux】网络基础_第13张图片

一般而言:

  • 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容;
  • 对于一台路由器,它实现了从网络层到物理层;
  • 对于一台交换机,它实现了从数据链路层到物理层;
  • 对于集线器,它只实现了物理层;

但是并不绝对。很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发);

网络传输基本流程 

我们这里以同一个网段两台主机进行文件传输为例,此时各层对应的协议如下:

【Linux】网络基础_第14张图片

同局域网的两台主机通信 

首先需要明确的是,同一个局域网内的主机是能够直接进行通信的,因为最初局域网设计的目的,就是为了让局域网内的主机能够进行通信。 

两台计算机通过TCP/IP协议通讯的过程如下所示:

【Linux】网络基础_第15张图片

当用户需要将文件传输给另一台主机时,这个过程涉及到多个网络协议层次。为了确保数据能够正确、安全地传输,每一层协议都会在数据上添加相应的头部信息,这个过程就叫做“封装”。

  • 从应用层开始,文件数据首先会被处理。在这个层次,数据会加上应用层协议的头部信息,这样接收方就知道如何解析和应用这些数据。
  • 接着,数据会传递到传输层。这一层会给数据加上传输层协议的头部信息,提供端到端的通信服务,例如TCP和UDP。
  • 然后,数据会进入网络层。在这个层次,数据会加上网络层协议的头部信息,例如IP协议,用于确定数据应该如何路由到目的地。
  • 最后,数据会到达链路层。这一层会加上链路层协议的头部信息,例如以太网协议,用于确保数据在本地网络中的传输。

通过这样的封装过程,每个协议层都提供了必要的信息和控制机制,以确保数据能够可靠、有效地传输到目标主机。这种分层结构使得网络通信更加灵活和可扩展,也方便了网络协议的开发和维护。

当数据从发送方主机发送后,接收方主机需要按照网络协议栈的层次结构对数据进行解包与分用,以还原原始数据:

  • 首先,链路层收到数据后,会提取出链路层协议的头部信息,然后将剩余的数据传递给网络层。链路层通过这些头部信息进行必要的错误检测和帧同步。
  • 接着,网络层接收到数据后,会提取出网络层协议的头部信息,然后将剩余的数据传递给传输层。网络层根据头部信息进行数据包的路由和转发。
  • 然后,传输层收到数据后,会提取出传输层协议的头部信息,然后将剩余的数据传递给应用层。传输层通过头部信息进行流量控制、拥塞控制等操作。
  • 最后,应用层收到数据后,会提取出应用层协议的头部信息,还原出原始文件数据。应用层根据头部信息进行应用协议的处理,例如HTTP请求或FTP命令等。

这个解封装和分用的过程是协议栈自底向上的过程,每一层协议都会根据头部信息对数据进行相应的处理,并将数据传递给上一层协议。通过这样的解封装过程,接收方主机能够正确地解析和应用原始数据。

无论是发送方还是接收方,在处理数据时都要遵循协议栈的层次结构,即先封装再分用的过程。这种分层结构使得网络通信更加灵活和可扩展,也方便了不同协议之间的交互和集成。

数据包封装和分用

  • 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
  • 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
  • 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息.
  • 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理。

下图为数据封装的过程:

【Linux】网络基础_第16张图片

下图为数据分用的过程:

【Linux】网络基础_第17张图片

 下面我们通过一个例子来理解这个过程:

【Linux】网络基础_第18张图片

当一个用户通过微信发送信息给另一个用户时,为了确保信息在不同的版本之间传递无误,并在传输过程中保持顺序和来源的准确性,数据包会经过一系列的封装过程。

首先,应用层会添加一个v1版本的报头,以区分不同的微信版本。然后,传输层会给每个信息添加序号放在报头,以确保信息的顺序正确。接下来,网络层会添加src和dst报头,以指示信息来自哪里以及要发送给哪个主机。最后,链路层添加src mac和dst mac报头,以确定数据包的目标接收者。

经过这一系列的封装过程,数据包被发送出去,通过网卡和以太网到达接收方。在接收方,每一层协议都会进行相应的解包操作,从链路层开始,一直到应用层,最终将信息传递给接收方的用户。

从逻辑上看,每一层协议都在与对方的同层协议进行直接通信,实现数据的传递。通信的本质就是不断的封装和解包的过程。

每层都要添加报头

报头本质也是一种数据,报头一般是通过结构体实现的,因此协议栈的每一层都有一个对应的结构体来表示当前层的报头。

报头与有效载荷

  • 当我们讨论网络通信中的协议栈时,每一层协议都有其特定的功能和职责。当数据从一个主机发送到另一个主机时,这些数据需要经过协议栈的每一层。每一层都会对数据进行一些处理,比如添加报头信息,然后将其传递给下一层。
  • 在数据传递过程中,每一层协议只关心与自己相关的报头信息,而忽略其他层添加的报头。这些被忽略的报头信息,以及实际的数据内容,都被视为“有效载荷”。
  • 有效载荷是数据中除了当前层协议添加的报头之外的部分。例如,当应用层添加了自己的报头信息后,将数据传递给传输层时,传输层只会关注其对应的报头信息,而忽略应用层添加的报头。对于传输层来说,应用层添加的报头和实际的数据内容都是有效载荷。
  • 简单来说,有效载荷是数据中除了当前层协议报头以外的部分。每一层协议都只关心自己的报头信息,而忽略其他层添加的报头,这些被忽略的部分就构成了有效载荷。 

如何将报头与有效载荷进行分离?

在协议栈中,每一层都需要从接收到的数据中提取出对应的报头信息。为了实现这一点,每一层都必须明确报头与有效载荷之间的界限,这样才能将它们分开。而为了达到这个目的,协议在添加报头时通常会将报头放在数据的开头,这样我们就可以根据报头的大小来区分报头和有效载荷。

获取报头大小的方法主要有两种:

  1. 结构体:这意味着报头的大小是固定的,不随实际数据内容的变化而变化。
  2. 自描述字段:报头中包含一个字段,用于指示报头的长度。这意味着报头的大小是可变的,但通过这个字段,接收方可以知道报头的实际长度。

无论采用哪种方法,每一层协议都必须提供一种方式来让我们获取报头的长度,以便在解包数据时正确地区分报头和有效载荷。这样,协议栈才能从底层到顶层依次进行数据的解包和分用,实现网络通信的正常进行。

当前层如何知道应该将有效载荷交付给上层的哪个协议?

  • 在网络协议栈中,每一层都可能对应多种协议。即使我们已经成功地将报头与有效载荷分离,我们仍然需要确定当前层应该将有效载荷传递给上层哪个协议。
  • 实际上,在每种协议的报头中,通常都会包含一个字段,用于指示应将分离出的有效载荷传递给上层的哪个协议。这个过程就是所谓的“分用”。通过这个字段,接收方可以明确知道应该将数据传递给哪个上层协议,从而确保数据能够正确地被上层协议处理。
  • 简而言之,分用过程是协议栈中的关键步骤之一,它确保了数据能够被正确地传递给相应的上层协议。

大部分协议的共性 

1.几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力。
2.几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力。(分用)

以太网通信原理

局域网内传输数据时,该局域网内的所有主机都能收到

我们来通过一个故事来帮助理解

【Linux】网络基础_第19张图片

我们看上面这张图,教室里坐满了人,老师正在讲台上发作业。老师每叫一个人上去拿作业,班里所有同学都是可以听到的。那每个学生是如何知道是自己的作业呢?通过名字!比如当老师念到张三的名字,班里每个同学都可以听到,但由于作业不是自己名字,因此只有张三会上去拿作业。

局域网(例如以太网)中的通信遵循广播机制。当一个主机想要发送数据时,该数据会被发送到局域网内的所有主机。那么在一个局域网当中,除了当前正在进行通信的两台主机以外,还有其他的主机。

【Linux】网络基础_第20张图片

那么每个主机如何判断该数据是否是发送给自己的?

  • 在局域网中发送的数据实际叫做MAC数据帧,在这个MAC数据帧的报头当中会包含两个字段,分别叫做源MAC地址和目的MAC地址。
  • 每个主机都有自己的MAC地址,并且能够识别接收到的数据帧中的目的MAC地址是否与自己的MAC地址匹配。
  • 每一个主机在收到一个MAC数据帧后,都会提取该MAC数据帧的报头,找到对应的目的MAC地址与自己的MAC地址进行比对。如果目的MAC地址与某个主机的MAC地址不匹配,该主机就会丢弃该数据帧,因为它知道该数据不是专门发送给它的。只有当目的MAC地址与某个主机的MAC地址匹配时,该主机才会处理该数据帧,并提交给上层协议(如TCP/IP)进行处理。
  • 因此,虽然局域网内的所有主机都“收到”了任何发送的数据,但只有目标主机才会真正处理这些数据。其他主机会根据MAC地址的匹配情况丢弃不相关的数据帧,从而确保只有发给它们的数据被处理。

以太网发生数据碰撞的问题

  • 在同一局域网中,所有主机共享一个通信信道。这意味着当多台主机同时进行通信时,它们发送的数据可能会在信道中相互干扰,导致数据传输出现问题。
  • 局域网可以被视为一个碰撞域,因为在该域中,如果两台主机的数据传输发生冲突,我们就说这两台主机发生了碰撞。这种碰撞是由于多个主机同时使用同一通信信道造成的。

如何判断发送出去的数据是否发生了碰撞?

  • 在局域网中,当一个主机发送数据时,它不仅仅将数据发送给目标主机,同时所有的主机都能接收到这个数据包。这意味着,发送数据的主机在发送数据后,也会接收到自己发送出去的数据。
  • 为了检测碰撞,该主机可以对发送的数据进行标记或添加一些校验信息。然后,当它再次收到这个数据时,它会将这些信息与原始数据进行比较。如果数据在传输过程中发生了改变(例如由于碰撞),那么收到的数据与原始数据就不匹配。

如何处理数据碰撞的问题?

  • 当一个主机检测到自己发送的数据发生了碰撞时,它会启动“碰撞避免”算法。这种算法的核心思想是,为了避免再次发生碰撞,主机在重新发送数据之前会等待一段时间。
  • 这种等待时间的长度是根据某种算法来确定的,以确保不同主机之间的数据传输不会再次发生碰撞。这种等待时间的选择是基于网络通信的当前状况和碰撞的严重程度。
  • 与现实生活中两个人同时说话的情境类似,当发生碰撞时,不同的主机会选择等待一段时间,以确保下一次数据传输不会再次发生碰撞。这种等待机制类似于人们日常交流中的礼让行为,例如一方等待另一方先说话。
  • 需要注意的是,在低通信压力下,碰撞发生的概率相对较低。计算机的高速处理能力和网线的快速数据传输能力都大大降低了碰撞的可能性。
  • 碰撞避免算法在网络通信中扮演着重要的角色,它确保了数据传输的可靠性和效率,避免了不必要的冲突和重传。通过合理的等待时间和算法选择,局域网能够有效地处理碰撞情况,确保通信的顺利进行。

一个局域网中,是不是主机越多碰撞的概率就越高?

  • 在局域网中,随着主机数量的增加,发生碰撞的概率确实会相应增加。在以太网中,主机通过监听网络上的数据包并尝试发送自己的数据包来进行通信。如果更多的主机同时尝试发送数据包,就会发生碰撞。碰撞可能导致数据包损坏或丢失,需要重新发送,这会降低网络性能。
  • 在这种情况下,交换机起到了重要作用。通过将局域网中的主机连接到交换机上,可以实现点对点的连接,划分了碰撞域,减少了碰撞发生的概率。

【Linux】网络基础_第21张图片

  • 例如H1和H3要进行通信,交换机收到报文,发现H1和H3都在左边的区域,因此就不需要再把报文转发到右边的区域,这样交换机就实现了防止报文的更大的局域网当中扩散。降低了碰撞的概率。
  • 因此,随着主机数量的增加,需要更高级的网络设备(如交换机)来确保网络的稳定性和性能。

跨网络的主机的文件传输

上面说的都是同一局域网内的主机之间的通信,那跨局域网的两台主机之间是如何进行通信的呢? 

当一个主机想要将文件传输到另一个位于不同网段的主机时,数据会经过一个或多个路由器。这是因为局域网是通过路由器连接的,因此一个路由器可以横跨多个局域网。在每个局域网看来,路由器就像是自己局域网中的一台主机。因此,路由器可以直接与局域网内的任何一台主机通信。

例如,如果主机H1在局域网1中想要与主机H8在局域网2中通信,主机H1会将数据发送给路由器。然后,路由器会将数据转发给主机H8所在的局域网2。通过这种方式,两个不同网段的主机之间实现了文件传输。

【Linux】网络基础_第22张图片

采用不同通信标准的两个局域网内的主机通信

上面的通信过程适用于路由器级联的两个局域网采用的是相同的通信标准。那么,如果这两个局域网使用的是不同的通信标准,例如局域网1使用以太网,而局域网2使用令牌环网,那么通信过程会有所不同。在这种情况下,路由器需要能够处理这两种不同的通信标准,以确保数据能够正确地在两个局域网之间传输。

【Linux】网络基础_第23张图片

由于以太网和令牌环网是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包。

这种情况实际是由路由器来处理的,路由器是工作在网络层的一个设备,我们可以认为路由器当中的协议栈包括了网络层和链路层。

【Linux】网络基础_第24张图片

我们来看下面这个图

【Linux】网络基础_第25张图片

  • 当需要将数据从局域网1发送到局域网2时,路由器首先接收到来自局域网1的数据。然后,路由器会对以太网的报头进行解包,提取出其中的数据部分。接下来,数据被提交给网络层进行一系列的数据分析。
  • 在网络层完成处理后,数据被转交给链路层。在链路层,为了使数据能在令牌环网中传输,会为其添加令牌环网所需的报头信息。最后,修改后的数据被发送到局域网2,从而实现在令牌环网中的传输。

一个路由器可能会级联多个局域网,当路由器需要将一个局域网的数据转发到另一个局域网时,路由器如何知道该数据应该转发到哪一个局域网的呢?

  • 路由器之所以能够“认路”,是因为它依赖于IP地址来确定数据的转发方向。在因特网上,每台计算机都有一个唯一的IP地址。当数据在网络层进行封装时,报头中会包含源IP地址和目的IP地址两个字段。
  • 当路由器需要将一个局域网的数据转发到另一个局域网时,它首先会在链路层去掉数据在当前局域网的底层报头。然后,数据被提交给网络层,此时可以获取到该数据的目的IP地址。
  • 接下来,路由器会根据目的IP地址在路由表中进行查找,以确定数据应该发送到哪个局域网。通过这种方式,路由器能够准确地确定数据的转发方向,确保数据能够正确地传输到目标位置。

IP协议屏蔽了底层网络的差异化

  • IP地址的存在除了帮助数据“路由”外,还发挥了另一个关键作用,那就是屏蔽了底层网络的差异化。对于通信双方的主机的IP层及其以上的协议来说,它们无需关心底层网络是使用以太网还是令牌环网。它们只需要知道源IP地址和目的IP地址,就能发送数据。因此,现在主流的网络也被称为“IP网络”。
  • 换句话说,IP地址提供了一种抽象层,使得应用程序和操作系统无需关心底层网络的细节,只需通过源和目的IP地址进行通信。这种设计简化了网络的复杂性,使得不同类型和结构的网络能够无缝地连接在一起,形成一个统一的全球网络。
  • 而这一切,都是通过工作在IP层的路由器实现的!

除了IP地址,还有以下类似的技术:

  1. 虚拟地址空间:这种技术屏蔽了物理内存之间的差异,使所有进程都认为它们正在访问相同的内存空间,且该空间的布局一致。这种设计简化了内存管理,使得不同进程能够无缝共享和访问内存资源。
  2. “一切皆文件”: 通过文件结构体和函数指针的方案,将各种资源抽象为文件,我们可以使用标准的文件操作(如读取、写入、打开、关闭等)来处理这些资源。这种设计使得应用程序能够以统一的方式处理各种资源,简化了资源的访问和管理。

网络中的地址管理

认识IP地址

  • IP协议有两个版本, IPv4和IPv6。我们整个的课程, 凡是提到IP协议,没有特殊说明的,默认都是指IPv4IP地址是在IP协议中,用来标识网络中不同主机的地址;
  • 对于IPv4来说,IP地址是一个4字节,32位的整数;
  • 我们通常也使用 "点分十进制" 的字符串表示IP地址,例如 192.168.0.1; 用点分割的每一个数字表示一个字节,范围是 0 - 255;

认识MAC地址

  • MAC地址用来识别数据链路层中相连的节点;
  • 长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
  • 在网卡出厂时就确定了,不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突; 也有些网卡支持用户配置mac地址)。

IP地址VSMac地址

在计算机网络中,IP地址和MAC地址确实有着不同的特性和用途。

  1. IP地址:IP地址是用来标识网络中设备的一种逻辑地址,它由网络地址和主机地址两部分组成。IP地址通常在互联网通信中起到关键的作用,因为它们可以帮助路由器和交换机等网络设备确定数据包的路径,并确保数据能够正确地到达目的地。而且,一旦设备被分配了一个IP地址,通常是不会改变的,除非人为地进行更改或者重新分配。
  2. MAC地址:MAC地址(也称为物理地址或硬件地址)是用于标识网络中设备的物理地址,通常由设备的网卡决定。MAC地址是硬编码到网卡中的,而且全球唯一。在局域网内部,MAC地址主要用于确定设备之间的通信路径然而,一旦数据包离开局域网,源MAC地址和目的MAC地址通常会被丢弃。这是因为路由器等网络设备主要关心IP地址而不是MAC地址,它们会根据IP地址重新封装数据包。

【Linux】网络基础_第26张图片

 最后我们用ifconfig查看一下自己当前主机所对应的网卡信息。【Linux】网络基础_第27张图片

我们看到inet后的地址就是该主机的IP地址,而ether就是“以太”的意思,后面的地址就是MAC地址。实际云服务器上的MAC地址可能不是真正的MAC地址,该MAC地址可能模拟出来的。

你可能感兴趣的:(Linux网络,linux,网络,c++,开发语言,服务器)