网络基础入门

发布时间:2024年01月22日

1. 计算机结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都是遵守冯诺依曼体系。(把数据从输入设备(外设)搬至内存,cpu对数据做处理,加工后写回内存,再把结果从内存写回显示器上(外设):

那么内存、外设、cpu都是硬件,那这些硬件是如何交互的呢?

  • 这些设备间一定要有 “线” 连接起来。这些设备在一台机器上,线比较短。若此时有两台机器呢?这两台计算机要互相通信,那么也需要用一种 “线” 连接起来。


计算机体系结构本质也可以被看做成为一个小型网络,其内部通过 “线” 连接起来,而多主机连接,本质上其实也是通过 “线” 连接起来的,这根线即网线。而在一台计算机里,这些线的对应名称如下:

  • IO总线: 外设和内存连接的线
  • 系统总线:CPU和内存连接的线

主机内,“线” 比较短,会面临信号干扰的问题;跨主机,“线” 比较长,会面临可靠性、效率、寻找到对方的问题。而我们学习网络的相关知识,主要是因为 “线” 变长了。所以需要对应的解决方案。

2. 计算机网络背景

2.1 网络发展

(1)独立模式:计算机之间相互独立

  • 早些年,人们所写的代码,处理某种事情的时候大部分都是单机的,但是架不住一些业务须要协同工作,可是计算机之间是相互独立的,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率非常低下。图示如下

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

  • 这时就有人设法将这些计算机通过一根网线连接在一起,当某个业务需要多台计算机协同完成时,就可以将共享的数据放到服务器中进行集中管理,此时各个计算机就都能获取到这些共享的数据,所以各个业务在处理就能随时进行切换了。

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

  • 后来这样的网络雏形逐渐发展,连入这个网络中的机器变得越来越多,于是就出现了局域网的概念。
  • 在局域网中有一种设备叫做交换机,交换机主要完成局域网内数据的转发工作,也就是在局域网内将数据从一台主机转发给另一台主机。各个局域网之间通过路由器连接起来,路由器主要完成数据的路由转发工作。

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

  • 各个局域网之间通过路由器相互连接在一起,便组成了一个更大的网络结构,我们将其称之为广域网。实际局域网和广域网是一种相对的概念,我们也可以将广域网看作一个比较大的局域网。

当然,还有城域网和校园网这样的概念,城域网实际就是在一个城市范围内所建立的计算机通信网,而校园网对应的就是在一个校园范围内所建立的计算机通信网。城域网和校园网实际也是一种相对的概念,我们都可以将它们看作一个大的局域网。

2.2 认识 “协议”

协议”本质就是一种约定通信双方只要曾经做过某种约定,之后就可以使用这种约定来完成某种事情。而网络协议是通信计算机双方必须共同遵从的一组约定,因此我们一定要将这种约定用计算机语言表达出来,此时双方计算机才能识别约定的相关内容。

计算机中的协议:

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


只要通信的两台主机,约定好协议就可以了吗?

  • 并不是,计算机生产商有很多,计算机操作系统也有很多,计算机网络硬件设备更是多种多样,那我们是如何让这些不同厂商之间生产的计算机能够相互顺畅的通信的呢?这时候就需要有人站出来,约定一个共同的标准,并且让大家都来遵守这个标准,这就是网络协议
  • 正所谓“一流的企业做标准,二流的企业做品牌,三流的企业做产品”。但是标准的定制有一部分是公益性、开源性的,它制定标准的目的是为了让我们的世界变得更好;而标准的定制还有一部分是具有一定盈利性质的,当你需要使用这项技术时就会收取部分专利费,此时就能将曾经做的技术投入进行变现。

3. 网络协议初识

3.1 协议分层

(1)网络协议栈设计成层状结构,其目的就是为了将层与层之间进行解耦,保证代码的可维护性和可扩展性。

  • 就比如我们一开始写的代码都是写在main函数里,后来我们把所有不同的功能封装在一个个函数里头,在main函数调用,再到后来的C++,我们可以使用多态的方式让基类指针指向不同的子类,从而调用不同的方法。上述都是软件分层。

(2)再比如在打电话的时候,站在工程师的角度实际这两个人并不是直接进行沟通的,而是A的电话将A说的话记录下来,经过一系列编码转码后,通过通信网络将信息从A的电话传递到了C的电话,然后信息在C的电话中再经过对应的编码转码,最后C才通过话筒听到了A所说的话。

  • 其中,人与人之间通信使用的是汉语,我们可以将其称为语言层;而电话和电话之间通信使用的是电话系统相关的一些接口,我们可以将其称之为通信设备层。
  • 后来随着科技的发展,发展除了无线电,此时我们下层使用的通信设备变了,或是这部电话卖到了其他国家,此时上层使用的通信语言变了,但我们仍然可以正常沟通。


(3)总结软件分层的好处:

  • 软件在分层的同时,也把问题进行了归类
  • 分层的本质:在软件上解耦
  • 便于工程师进行软件维护

所以网络本身的代码,就是层状结构。层状结构下的网络协议中的同层协议,都可以认为自己在和对方直接通信,而忽略底层的细节。而同层之间,一定都要有自己的协议。

(4)理解各层之间直接通信:

  • 从上述例子我们还可以看出,虽然在打电话时我们并不是直接进行沟通的,但是我们可以认为我们是在直接进行沟通,并且这两台电话也不是直接在进行沟通的,数据经过电话后,还需要各种基站,各种电信网络来进行数据转发,但是这两台电话依旧可以认为是直接在和对方电话进行通信的。
  • 因此对于网络协议我们需要有一个基本的认识:关于通信,同层协议可以认为自己在和对方层直接进行通信,从而达到简化对于网络协议栈的理解。
  • 也就是说,在网络协议栈中我们可以认为通信双方的应用层之间直接在进行通信,也可以认为通信双方的传输层之间直接在进行通信,对于网络层和数据链路层也同样如此。

3.2 OSI七层模型

如上我们说的是TCP/IP四层协议,而实际当初那个站出来的人定的协议叫做OSI七层协议

  • OSI(Open System Interconnection,开放系统互联)七层网络模型称为开方式系统互联参考模型,是一个逻辑上的定义和规范。
  • OSI把网络从逻辑上分为了七层,每一层都有相关的、相对应的物理设备,比如路由器,交换机。
  • OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输,比如手机和电视之间数据的传输。
  • OSI七层模型最大的优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
  • 但是,OSI七层模型既复杂又不实用,所以后来在具体实现的时候就对其进行了调整,于是就有了我们现在看到的TCP/IP四层协议。
分层名称功能每层功能概览
7应用层针对特定应用的协议
6表示层设备固有数据格式和网络标准数据格式的转换
5会话层通信管理、负责建立和断开通信连接(数据流动的逻辑通路)。管理传输层以下的分层
4传输层管理两个节点之间的数据传输、负责可靠性传输(确保数据被可靠地传送到目标地址)
3网络层地址管理与路由选择
2数据链路层互联设备之间传送和识别数据帧
1物理层以“0/”、“1”代表电压的高低、灯光的闪灭。界定连接器和网线的规格

3.3 TCP/IP五层模型

TCP/IP是一组协议的代名词,它还包括许多协议,共同组成了TCP/IP协议簇。TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

  • 物理层负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的WiFi无线网使用的电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)就是工作在物理层的。
  • 数据链路层负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。数据链路层底层的网络通信标准有很多,如以太网、令牌环网、无线LAN等。交换机(Switch)就是工作在数据链路层的。
  • 网络层负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间数据传输的线路(路由)。路由器(Router)就是工作在网络层的。
  • 传输层负责两台主机之间的数据传输。例如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。
  • 应用层负责应用程序间沟通。比如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层的。

如上图可以看到,它们的下面几层几乎是没有区别的,传输层和网络层对应的是操作系统,数据链路层和物理层都是对应在驱动层的,而TCP/IP协议当中的应用层就对应到OSI七层协议当中的应用层、表示层和会话层。物理层这里考虑的比较少。因此很多时候也可以称为TCP/IP四层模型。一般而言:

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

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

4. 网络传输基本流程

4.1 网络协议栈和操作系统之间的关系

操作系统的核心工作就是管理好各种软硬件资源,对上提供一个良好稳定的运行环境。操作系统层与用户层之间有着系统调用层,操作系统层往下是驱动层,而驱动层再往下就是各种硬件设备了。操作系统与网络协议栈有着密切的关系。网络协议栈主要负责数据的通信,其自顶向下可分为四层,分别是应用层、传输层、网络层、数据链路层。

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

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

(2)如果现在有两套主机的话,那么就应该有两套这样的接口。如果这两台主机想要进行通信,那么一定是从用户一发起,持有应用层协议,贯穿下面的协议栈(传输层、网络层……),再通过网络路由转发,被用户二的物理层收到,再经过对方的协议栈(数据链路层……)依次向上提交,最后到达用户二。


(3)同层协议都认为自己在和对方直接通信,并且每一层都要有自己的协议

  • 用户自认为直接和用户进行通信,应用层自认为直接和对方的应用层进行通信……。它们各层之间完全不关心底层怎么操作的。
  • 就好比如你网购了一款鼠标,你在店家那下了单,你在通信时只和店家沟通,沟通完后底下的细节你不关心,只需要等货即可。
  • 而卖家和你沟通完后,调用底层接口(快递员),填好快递单,由快递员邮寄到你手上,你同样是不关心货物如何到你手上的,你只关心什么时候到

4.2 什么是报头

在计算机网络通信中,报头(Header)是一部分数据包的固定结构,它包含了关于该数据包的元信息和控制信息。报头位于数据包的前部,用于标识和管理数据包的传输。报头通常由多个字段组成,每个字段用于存储特定类型的信息。下面是一些常见的报头字段及其功能:

  • 目标地址字段:指示接收数据包的目标设备或主机的地址。这个地址可以是物理地址(如MAC地址)或逻辑地址(如IP地址)。
  • 源地址字段:标识发送数据包的源设备或主机的地址。
  • 协议字段:指示数据包使用的协议类型,例如TCP(传输控制协议)或UDP(用户数据报协议)。
  • 长度字段:指明整个数据包的长度,包括报头和数据部分。
  • 校验和字段:用于校验数据包在传输过程中是否出现了错误。接收端可以通过计算校验和来验证数据包的完整性。
  • 服务质量字段:用于指示数据包的优先级和处理要求,例如差错检测、传输延迟、带宽需求等。
  • 标记字段:存储一些额外的控制或标识信息,用于特定的协议或网络处理。

当用户要将数据(例如一个文件)从一个主机传输到另一个主机之前,数据需要被网络协议栈封装,也就是图中左边添加报头信息的步骤;相对地,当对端主机接收到数据以后,需要通过对应的网络协议栈对数据将报头提取出来,即进行解包与分用。

自顶向下通过协议栈封装数据的过程中,每一层协议都会添加对应的报头信息;自底向上通过协议栈完成数据包的解包与分用的过程中,每一层协议都会将对应的报头信息提取出来。


所以我们把自顶向下添加包头的过程称之为封装,把自底向上对协议解析,再向上交付的过程就称之为解包

4.3 网络传输流程图

同一个网段内的两台主机进行文件传输,此时各层对应的协议如下:

4.4 相同局域网的两台主机通信

(1)处在同一个局域网内的主机是能够直接进行通信的,因为最初局域网设计的目的,就是为了让局域网内的主机能够进行通信。
如下图所示:

上述以太网,就是一种局域网的标准 ,而以太网站在系统角度来看,他是被共享的,即临界资源。

(2)当用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装:

  • 文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层。
  • 传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。
  • 网络层收到数据后,再添加上对应网络层协议的报头信息,接着将数据再交给链路层。
  • 链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕。

(3)数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:

  • 链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。
  • 网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付。
  • 传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。
  • 应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据的解包与分用。

也就是说,任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,每一层协议都会添加上对应的报头信息;而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包和分用,每一层协议都会将对应的报头信息提取出来。

(4)局域网通信的原理:(以太网)
①首先每台主机在局域网通信都要有唯一标识,以上课的例子来解释:在一间教室里头,老师点名张三站起来回答问题。其它学生都听到了老师的声音,但是没有站起来是因为叫的不是我。随后张三和老师进行了沟通回答问题。在张三和老师的沟通中,台下的学生都听到了声音。在教室里头,可以认为老师和张三在单独通信,在通信的过程其他同学也能听到声音。所以网络也是如此。

MAC地址:正如教室里每一个人都有对应的名字一般,每一台主机都要有唯一的标识:该主机对应的MAC(网卡)地址。

②同样的场景,当老师喊张三回答问题时,台下的同学非常吵闹,以至于老师和张三无法正常沟通。

  • 碰撞域:任何一台主机,在任何时刻,都可以随时向局域网发消息。我们称之为碰撞域,而导致无法准确的听到对方的消息。
  • 碰撞检测,碰撞避免:为了防止因碰撞与而无法准确的听到对方的消息,从而识别发生了碰撞(碰撞检测)。以太网站在系统角度来看,他是被共享的,即临界资源。任何人访问此临界资源若发生了冲突,那就让双方延迟一下再重新发送,这就是碰撞检测和碰撞避免。

4.5 跨网络的两台主机通信

跨网段的主机的文件传输,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器。

(1)当局域网1当中的主机A想要发送消息给局域网2当中的主机H,那么主机A可以先将数据发送给路由器,然后路由器再将数据转发给局域网2当中的主机H。

(2)如果路由器级联的两个局域网采用的是相同的通信标准,那么通信过程大致就是上述那样。但路由器级联的局域网可能采用的是不同的通信标准,比如局域网1采用的是以太网,而局域网2采用的却是令牌环网。


(3)由于以太网和令牌环网是不同的通信标准,所以给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包。这种情况实际是由路由器来处理的,路由器是工作在网络层的一个设备,我们可以认为路由器当中的协议栈是下面这样的。


(4)此时当数据要从局域网1发送到局域网2时,路由器收到局域网1的数据后,会先将以太网对应的报头进行解包,然后将剩下的数据向上交付给网络层,在网络层进行一系列数据分析后,再将数据向下交付给链路层,此时在链路层当中就会给该数据添加上令牌环对应的报头信息,然后再将该数据发送到局域网2当中,此时该数据就能够在令牌环网当中传输了。

(5)重新认识IP地址和MAC地址:

  • MAC地址:用来在局域网中,标定主机的唯一性
  • IP地址:用来在广域网(公网),标定主机的唯一性

(6)路由器是怎样“认路”的:

当IPA(以太网)要把数据发送到IPB(令牌环网)时,数据自顶向下流动(应用层、网络层……),并添加对应的报头(协议),向下走到以太网,通过以太网被数据链路层的以太网驱动程序拿到,解包链路层的协议,继续向上交付给自己的IP层,当走到IP网络层时,发现要去的是IPB,并识别到IPB和自己IPA不是一个网段,所以继续向下交付到链路层:令牌环驱动程序,并添加此网段的报头(协议),把数据再经过令牌环发送到对方的令牌环驱动程序链路层,解包,再自底向上流动数据。


所有的IP层向上的协议,发送和接受主机看到的数据是一模一样的。 所以一般把网络也称之为IP网络。其屏蔽了底层网络的差异。

  • 当数据到达局域网(以太网)时,套上局域网的报头,经过路由器时又去掉局域网的报头,转到下一个局域网(令牌环)的时候再重新添加报头。

(7)这种类似的技术还有:

  • 虚拟地址空间: 屏蔽了内存之间的差别,让所有的进程看到的都是同一块内存,并且这块内存的布局都是一样的。
  • Linux系统下一切皆文件: 通过文件结构体和函数指针的方案,让我们能够以对待文件的方式对待某些资源。

(8)网络通信的基本轮廓:


我们在进行数据转发的时候,所有的数据都必须在“网线”上跑,每一个设备都必须到达它所在的局域网,通过路由器的解包封包再重新转发。

4.6 数据包封装和分用

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

(1)下图为数据封装的过程:

数据包添加报头的时候,也要考虑未来解包的时候,将自己的有效载荷(去掉报头后的数据包)交付给上层的哪一个协议。我们把决定自己向上交付给那一层协议的过程叫做有效载荷的分用。

  • 一般而言,任何报头属性里面,一定要存在一些字段支持,支持进行封装和解包。
  • 一般而言,任何报头属性里面,一定要存在一些字段支持,支持进行分用。

(2)下图为数据分用的过程:


总结:

  • 报头:报头本质也是一种数据,报头一般是通过位段实现的,因此协议栈的每一层都有一个对应的位段来表示当前层的报头。
  • 封装:实际就是不断给数据加上各种对应的报头,这些报头里面填充的就是对应的各种协议细节。
  • 解包:实际就是不断从数据中提取对应的报头,并对提取出来的报头进行数据分析。
  • 有效载荷:将数据中除当前层的报头以外的数据叫做“有效载荷”。

5. 网络中的地址管理

5.1 认识IP地址

需要注意的是,IP协议有两个版本,分别是IPv4和IPv6。IPv4用32个比特位来标识IP地址,而IPv6用128个比特位来标识IP地址。

  • IP地址是在IP协议中,用来标识网络中不同主机的地址。
  • 对于IPv4来说,IP地址是一个4字节,32位的整数。
  • 我们通常也使用“点分十进制”的字符串表示IP地址,例如192.168.0.1,用点分割的每一个数字表示一个字节,范围是0-255。

5.2 认识MAC地址

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

Linux中使用ifconfig命令查看自己的MAC地址:


我们用到的大部分局域网都是以太网标准,其中ether对应就有”以太“的意思,而ether后面的这个地址就是当前云服务器所对应的MAC地址。但实际云服务器上的MAC地址可能不是真正的MAC地址,该MAC地址可能模拟出来的。

文章来源:https://blog.csdn.net/m0_65558082/article/details/135711419
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。