一、网络的发展

计算机发展早期,每一台电脑都是相互独立的个体,数据只能依靠U盘、软盘等硬件设备人工拷贝,传输效率极低,资源完全无法共享,极大限制了计算机的使用价值。为了解决这些问题,计算机网络应运而生。

为了解决近距离计算机互通问题局域网(LAN) 率先问世。上世纪70-80年代,人们通过网线将小范围的计算机连接起来,组建局域网。它覆盖范围小,局限于机房、办公室、校园等近距离区域,传输速率高、延迟低,能够实现电脑之间直接传输文件、共享外设设备。但局域网存在明显短板,只能实现近距离互联,不同地点的局域网依旧无法沟通。
在这里插入图片描述

突破地域阻隔广域网(WAN)开始发展。广域网可以跨越城市、国家,将世界各地分散的局域网连接成整体,实现远距离计算机通信。1969年诞生的阿帕网,是全球第一个广域网,也是互联网的前身,实现了远距离计算机的首次联通。随着网络协议不断标准化,广域网技术日趋成熟,1994年我国正式接入互联网,国内计算机正式接入全球网络。
在这里插入图片描述

步入21世纪,宽带网络升级,有线互联网全面普及,无数局域网依托广域网互联互通。而后移动互联网、5G技术迭代,网络摆脱有线束缚,物联网进一步让电脑、手机、智能设备全部联网。从单机孤立,到局域网近距离互联,再到广域网全球互通,计算机网络彻底打破了数据传输的壁垒。

综上,以计算机技术发展的视角来看,网络的诞生,本质是为了解决独立计算机无法数据互通的痛点


二、初识协议

2.1、认识协议

计算机网络中,最重要的概念之一就是协议,它贯穿于整个网络,学好协议,是掌握计算机网络知识的关键。
那么,什么是协议呢??协议本质上就是一种约定💧
就比如:我们从小就与学校达成一种“协议”:在学校,学生听到上课铃声就必须回到座位上;听到下课铃声就可以自由活动。

在计算机的世界中,以光信号和电信号作为传输媒介,通过 “频率” 和 “强弱” 来表示0和1这样的信息。要想传递各种不同的信息, 就需要约定好双方的数据格式。
但是,只要通信的两台主机, 约定好协议就可以了么?
定好协议,但是你用频率表示01,我用强弱表示01,就好比我说汉语,而你说英语一样,虽然大家可能遵守的同一套通信规则,但是语言不同,即是订好了基本的协议,也是无法正常通信的。

因此,完善的协议,需要更多更细致的规定,并让参与的人都要遵守。
计算机生产厂商有很多;计算机操作系统,也有很多;计算机网络硬件设备,还是有很多… …
如何让这些不同厂商之间生产的计算机能够相互顺畅的通信?必须要有人站出来,约定一个共同的标准,大家都来遵守,这就是网络协议即涉及软件,也涉及硬件


2.2、协议分层

协议可以分为硬件级别的协议软件级别的协议
本栏目所谈论的协议都是软件级别的协议,不涉及硬件。因此,协议可以由软件实现,换句话说,协议本质也是软件
那么,什么又是协议分层呢🤔??

我们在学习C/C++、Linux系统编程时,就已经潜移默化学习到了软件分层的思想。从C语言中初学函数,再到C++中的继承与多态、以及Linux系统中学习到的进程管理,文件管理等,无不充斥着软件分层的思想。事实上,计算机领域中的大部分软件都是层状结构,也因此流传着这样一句话:任何问题,添加一层软件层都能够解决

综上,我们最终得出的结论,协议分层的本质就是软件分层


2.2.1、分层的好处

我们已经知道协议分层的本质,那么,我们为什么需要进行分层呢🤔??

想象一个你和你的朋友打电话的场景,你并没有直接与你的朋友讲话,而是通过某种通讯设备进行传达;而你的朋友也并非直接与你对话,同样是通过他的通讯设备与你通话;这两个通讯设备之间又互相传递信息,以此达到了你与你的朋友好似“面对面交流”的效果。

我们可以将这个场景高度抽象为一种简单的协议:你与你的朋友可以被抽象成语言层,而对应的通讯设备可以被抽象为通讯设备层。当你们更新了通讯设备,比如买了新款手机,这并不会影响你与你朋友之间的通信,因为仅仅修改了通讯设备层,并不会影响上层的语言层;或者当语言层做替换,比如两个美国人进行通话,他们也依旧可以使用原来的通讯设备,因为仅仅在语言层进行了变更。
在这里插入图片描述
上述例子中,不就是一个简单的“分层”嘛!!!只不过我们的“协议”只有两层:语言层与通信设备层。 实际的网络通信协议,设计得会更加复杂,需要分更多的层。
但是通过上面的简单例子,我们是能理解,💧分层可以实现解耦合,降低软件维护的成本💧


2.2.3、OSI七层模型

接下来,我们开始正式讲解分层协议模型

OSI(Open System Interconnection 开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范,简单来说,就是一个标准标准的制定者与最终项目的建造者并不是同一个人,因此,我们所学习的网络协议并非完全向它看齐
它把网络从逻辑上分为了7层. 每⼀层都有相关、相对应的物理设备,比如路由器,交换机等。 OSI 七层模型是一种框架性的设计设计,其最主要的功能使就是帮助不同类型的主机实现数据传输。它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。 通过七个层次化的结构模型使不同的系统、不同的网络之间实现可靠的通讯。

但是,它相对来说比较复杂,并且很少投入实际使用中,因此我们未来都将按照 TCP/IP四层模型来讲解。
其实在网络角度,OSI定的协议7层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是5层协议
在这里插入图片描述


2.2.4、TCP/IP五层模型🌟🌟

在正式讲解该模型前,我们需要回答以下问题:

问题1️⃣:两个主机通过网络互相访问会产生什么问题呢🤔??

在这里插入图片描述

如果主机A想将数据发送给主机B,首先得考虑到:能否将数据在两个相邻设备之间传递,比如说路由器,如果连这种短距离传输都做不到,更别说远在千里的主机B了。其次,一个路由器可以链接多台设备,因此整个网络的结构一定复杂的,此时不得不考虑到目标主机定位与路径选择问题。解决以上两个问题后,仅可以保证数据能够从主机A到主机B,但是无法保证数据的安全性问题,传输距离如此遥远,我们必须要保证数据在传输过程中没有丢失。

以上三个问题解决完后,我们就能够保证数据能够安全地从主机A发送到主机B。这样足够了吗??还不够。思考:数据是谁发送的??当然是我们用户,在我们使用QQ发送消息的时候难道不是你输入的文字、点击发送的嘛?!那我们用户为什么要发送数据呢??一定是为了解决某一个问题的,用户一定是带着某种目的才选择发送数据,而不是无聊地让数据在两个主机上来回跑。我们先前讲的三个问题只是保证数据安全抵达的手段。而最终目的是为了完成某种任务

综上,我们可以总结出网络通信会遇到的以下4️⃣个问题🔥:

  1. 能否将数据在两个相邻设备之间传递
  2. 目标主机定位与路径选择问题
  3. 数据丢失问题
  4. 使用数据的目的

问题2️⃣:为什么会产生这些问题呢🤔??

事实上,计算机内部本质也是一个网络结构(小型网络),各个设备之间也具有协议,由于设备都集成在一起,两设备距离最大也就几厘米,因此几乎不会产生上述的问题。

而两台主机的距离相比来说可就要远了不止一星半点,往短了说,可能也就几米,往远了说,可能就横跨几个国家也说不定。因此,这种客观上物理距离拉长,进而引发以上新的问题。

先前说过,在计算机的世界中,任何问题只需要加一层软件层就可以解决。因此,为了解决上述四个问题,网络通信协议:💧TCP/IP协议💧便诞生了。

该协议,本质上来说就是一种解决方案,我们需要解决四个问题,于是便引入了4️⃣层软件层。问题是分层的,于是协议分层
在这里插入图片描述
其中,由于人的需求多种多样,因此应用层的协议相对来说也会多一些。

了解了**TCP/IP协议** 诞生的意义后,我们将正式介绍 TCP/IP五层模型

TCP/IP五层(四层)模型。TCP/IP是一组协议的代名词,它还包括许多协议,组成了 TCP/IP协议簇,或者称为 TCP/IP协议栈。它是我们网络学习中的重中之重🔥!!

TCP/IP通讯协议采用了5️⃣层的层级结构,每一层都呼叫它的下一层所提供的网络来完成完成的需求。

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

在这里插入图片描述


2.3、TCP/IP协议与操作系统之间的关系

所有的主机上安装的操作系统是可以不同的,事实也的确如此,但是根据平日里的观察,这些搭载不同操作系统的主机之间却可以通过网络相互通信,比如windows用户可以传文件给MacOS用户或者Linux用户,这是为什么呢🤔??

因为这些主机上面的协议栈都是按照相同的标准实现。如今的网络通信中,大家基本上都遵循着 TCP/IP协议栈 (它已成为事实上的国际标准)

在学习Linux系统编程时,我们知道操作系统是由C语言与汇编语言编写的。而事实上,协议栈的部分内容也是被设计到内核之中,那么也就是说协议栈也是由C语言与汇编编写的咯。请看下图:
在这里插入图片描述
TCP/IP协议中的网络层与传输层两者被集成在内核中,既然存在于内核中,那么一定具有相对应的系统调用,未来我们学习网络编程相关系统调用,也主要是围绕着这两层。

应用层处于操作系统上一层,由用户实现,它也是我们学习网络编程的核心之一。

数据链路层本质上是与驱动程序相关,其中与网络关联密不可分的就是网卡驱动,所以数据链路层就是与网卡驱动强相关

网卡,就是我们实现网络通信的最最最主要的底层硬件设备,而它则隶属于物理层范畴。

可以看出,整个协议既涉及到硬件,又涉及到驱动,又涉及到操作系统,甚至是用户,所以,这样一个协议一定是IT各行各业一起配合与托举的

综上,我们最终可以得出一个结论:💧网络实际上属于操作系统的一部分!!💧


2.4、协议的朴素理解

在前文我们已经认识了协议本质就是一种约定。但是我们并不能很透彻地理解它,毕竟我们仅仅处于一种“听说过”的状态,没有真正地“看见过”。

来看这样下面这张图,回答这样一个问题:主机B能识别data,并且准确提取a=10,b=20,c=30吗🤔?

  • 答案是肯定的!因为双方的某一层中都有同样的结构体类型struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有共识,能够识别对方发来的数据,这不就是一种 “约定” 吗!!

在这里插入图片描述
因此,我们可以得到关于协议的朴素理解💧所谓协议,就是通信双方都认识的结构化的数据类型💧这仅仅是一个朴素的理解,并不是100%准确,但是能够帮助我们理解协议。
因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。

接下来,还将补充协议报头的相关知识。
我们平时或多或少都有网购🚚的例子,比如我今天打算买副耳机,快递员交付到我手里仅仅只有一个耳机吗??当然不是,一定是由一个快递盒将我们的耳机包裹住,此外,快递盒上面一定会有一张快递单!!而快递单上面一定会存在这几样东西:寄件地址,收件地址,收件人的电话号码,姓名等相关信息,这是一个大家约定俗成的“协议”,只有这样子才可以将物品安全地交付给收件人。

从上面的例子中,我们不难察觉快递单的格式,不久相当于一个结构体嘛!!而一个具体的快递单不就是一个结构体变量嘛!!我们在进行网络通信的时候,一定是将对应协议的结构体的结构体变量发送出去!!而这个变量就被称作为协议报头。因此,💧协议报头的本质就是一个结构体变量💧


三、网络传输基本流程

3.1、局域网通信

3.1.1、认识mac地址

在正式讲解局域网通信前,我们首先得要了解两个结论:

  • 结论1️⃣同一局域网下的两台主机是能够直接通信的

换句话说,如果两台主机不在同一局域网下,它们就不能够直接通信,而是需要依靠其他手段。

  • 结论2️⃣:每一台主机,都要有mac地址来保证主机的唯一性

其中,mac地址是一个与网卡强关联的一个地址,在网卡出厂的时候就确定了,无法修改,mac地址通常是唯一的。(虚拟机中的mac地址不是真实的mac地址,可能会产生冲突;此外,有些网卡也支持用户自己配置mac地址)

mac地址的长度为48bit,即6Byte。一般用十六进制数字加上冒号的形式来表示。
在Linux下我们可以通过ifconfig指令查看主机相关的网络信息,Windows>ipconfig
在这里插入图片描述


3.1.2、局域网通信原理

以太网就是一种典型的局域网,它是当今最主流的局域网之一。除了以太网,还有其他的局域网通信标准:令牌环网、无线LAN等。我们在讲解时以以太网为主。
在这里插入图片描述
当以太网内的一台主机A向局域网1内发送一条数据,该以太网内所有的主机都能够收到这条数据,这是局域网的特性。
就好比我们在学校上课,老师与学生就相当于一台台主机;教室就相当于一个以太网,我们都处于同一个以太网内,当老师在台上讲课时,就相当于向整个以太网内发送数据,所有的学生都能够收取到这个数据。

局域网通信的过程中,所有主机都能够收到主机A发送的保文,但是报文中的协议报头中存放着目标主机的mac地址和源主机的mac地址。当主机发现收到的报文不是发给它的,便会丢弃;相反,如果是发给它的,便会收下。即局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定

我们都知道,当老师在台上讲课的时候,学生不能够在台下叽叽喳喳,因为这样会干扰老师发出的数据,从而导致其他想听课的同学收到干扰。我们以此类推,当以太网内的主机A发送消息的时候,其他主机不能够发送消息,如果此时主机B发送了消息,就可能和主机A的消息产生碰撞,从而造成信息干扰。
因此,以太网中,任何时刻,只允许一台机器向网络中发送数据。如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞

关于数据碰撞问题,是无法完全避免的,因为任何一台主机都是不知道局域网内是否有数据发送。为了解决这个问题,我们就必须让每一台主机都能够进行碰撞检测碰撞避免算法 。当主机A发送的数据与主机B发送的数据在网内发送碰撞后,会立即返回告知主机A与主机B你们发送碰撞了,然后,主机A与主机B便会开始各自进行休眠,错开发送。在这段期间,其他的主机就可以趁空发送。理论上来说, 同局域网内,主机数越多,发生碰撞的概率就越大

综上,我们对局域网做一个简单的总结📖:

  1. 以太网中,任何时刻,只允许一台主机向网络中发送数据。
  2. 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
  3. 所有发送数据的主机要进行碰撞检测碰撞避免
  4. 没有交换机的情况下,一个以太网就是一个碰撞域
  5. 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定 。

在此,为了更好地理解上述内容,我们还可以换种视角来看待以太网:
Linux下一切皆文件,那么网络也是文件!!所有的主机都能够访问以太网,究竟是如何访问,相必一定是通过进程/线程访问的吧!!此时,以太网不就相当于一个共享资源嘛!!
碰撞避免算法与碰撞检测,用于保证,任意时刻以太网只能被一台主机访问。即保证了数据在局域网中的原子性

在这里插入图片描述

此处仅仅是对以太网的一个简单了解,关于以太网更加详细的内容,会在后期文章中专门讲解。


3.1.3、数据包的封装与解包分用

初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程。而其中每层都具有协议,所以当我进行下图述传输流程的时候,要进行封装和解包
在这里插入图片描述
下面我们明确一下概念:
报头部分,就是对应协议层的结构体字段,我们一般叫做报头。除了报头,剩下的叫做有效载荷。故报文 = 报头 + 有效载荷
在这里插入图片描述

然后,我们在明确一下不同层的完整报文的叫法:

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

各个层的报头与用户发送的消息本质上都属于数据,在内存中,我们封装数据的过程就如同压栈一般。如下图:
在这里插入图片描述
由于我们需要一层一层不断填入新的数据,因此我们必须在内存中申请一个 “缓冲区” 将已有的数据保存。我们先前聊过,报头的本质就是一个结构体变量,因此,封装的本质就是在报文的头部拷贝结构体变量

与之相对的解包过程,无非就是将报文头部的报头不断分离解析的过程。此过程如同弹栈一般。

综上,封装和解包的过程,本质上就是一个 “压栈”“弹栈” 的过程这也解释了协议栈这个名字的由来。
在这里插入图片描述

对于接收方,每层收到的报文,都必须面临两个问题:

  1. 报头与有效载荷的分离问题(解包)。根据不同的协议,报头可能是固定长度,也可能是变长的。
  2. 解决自己的有效载荷向上交付给哪一个协议的问题!!(分用)

每一层协议都必须解决以上两种问题。这也是我们学习任何一个协议的核心。


3.2、跨网通信

有时候,目标主机与源主机也许不在同一局域网下,此时就需要通过路由器进行主机定位路由选择帮助我们找到目标主机,而这一切的前提是必须要得到目标主机的 IP地址

IP协议有两个版本,分别为IPv4IPv6。未来文中凡是提到 IP协议,没有特殊说明的,默认都是指IPv4

  1. IP地址是在IP协议中,用来标识网络中不同主机的地址
  2. 对于IPv4来说,**IP地址是一个4Byte,即32位的整数;对于IPv6来说,IP地址**是一个16Byte,即128位的整数来表示,原理上与IPv4类似,主要是用于解决IPv4地址不足等问题
  3. 我们通常也使用点分十进制字符串表示 IP地址,例如:192.168.0.1;用点分割的每一个数字表示一个字节,范围是0~255

我们先前引入过Mac地址的相关知识,它也能用来唯一地标识一台主机,那么,我们为什么还需要引入IP地址这个概念呢🤔??

今天,我们仅从它们的使用上进行区分。
数据报中的Mac地址记录的是当前的所处地址以及下一跳地址,解决的是局域网转发的问题;而IP地址则是记录数据报最终的目标主机的地址,用于路径选择的依据。
干巴巴地这么讲,肯定无法很好地理解,我们可以联想唐僧取经的故事:《西游记》中,唐僧从东土大唐而来,前往西天取经。由于路途遥远,师徒们在这期间必然会经过许多国家。当唐僧师徒到达车迟国时,便会询问当地的国王“贫僧自东土大唐而来,前往西天取经,那么下一站我们应该去哪??”,“女儿国… …”,于是,他们便会重新启程前往女儿国。到达女儿国后,便又会询问一样的问题。这样循环往复,直至到达灵山。

在这段故事中,唐僧师徒“从哪里来,到哪里去”是一直都没有变过的;而“上一站从哪里来,下一站到哪里去”是一直在变化的。
我们数据报中的IP地址与Mac地址也是如此。数据报中的IP地址就如同故事中的“东土大唐”和“灵山”,在发送数据的途中始终不会改变;而Mac地址就相当于“车迟国”和“女儿国”这样的地址,他们会在发送途中不断改变

关于更加具体的IP地址与Mac地址存在的原因,将在后续文章说明。
在这里插入图片描述
由于IP地址的出现,我们便可以进行跨网络通信,如图以太网中的主机A与令牌环网的主机B跨通过路由器实现跨网通信:
在这里插入图片描述

在这里插入图片描述
由上图可以看出,对于网络层而言,它们收发的都是同一种报文,数据链路层做的任何事情都是透明的。
而对于数据链路层来说,由于局域网的标准并不统一,进而导致各个局域网的实现方式不同,这显然是阻碍了互联网的发展的,如何解决呢🤔??

当然是在上层封装一层软件层🤪,及我们现在看到的网络层。任何格式不统一问题都能够靠封装一层软件层来解决🤪。

网络层的出现,保证了网络层及其上层都只能看到同一种网络:IP网络,屏蔽了最底层的网络差异,统一互联网的通信标准。而路由器是实现IP通信的底层最重要的硬件。


完🌍🌏🌎

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐