目录
0、 前言
1、 计算机网络发展背景
1.1. 局域网(LAN) && 广域网(WAN)
2、 认识并理解协议
3、 初始网络协议
3.1. 协议分层
4、 TCP/IP 五层(或四层)模型
4.1. 简单了解TCP/IP层状体系
4.2. TCP/IP协议层状结构和计算机层状结构的关系
5、 OSI七层模型
6、 网络传输基本流程
6.1、 协议报头 && 封装和解包
6.2、 局域网通信
6.3、 初始MAC地址 && IP地址
0、 前言
因为是刚进入网络,因此这篇文章主要目的:让我们对网络有个基本认识。
1、 计算机网络发展背景
首先,我们要知道,世界是先有计算机,后有网络。
自1946年第一台计算机应运而生, 其命名为 ENIAC (Electronic Numerical Integrator and Computer) ,然后随着各项科学技术的发展,计算机越来越高效化、小型化, 因此,计算机应用的场景也随之变多, 其中不乏需要多个计算机合作的场景, ( 当有了需求, 自然会有解决方案 ),而网络, 也是在这一背景下随之产生。
计算机的发展推动了网络的出现:随着计算机的诞生和发展,人们开始意识到将多台计算机连接起来,实现信息交换和资源共享的重要性。因为单独的计算机难以满足各种需求,多台计算机通过网络连接后可以相互通信、共享数据和资源,从而提高了工作效率和信息交流的便利性。
网络的产生解决了多台计算机合作的需求:随着计算机数量增多和应用场景的多样化,单独的计算机之间需要进行数据交换和协作变得越来越重要。搭建网络使得多台计算机可以相互通信和协作,实现资源共享、数据传输和信息交流,极大地拓展了计算机应用的范围和效果。
1.1. 局域网(LAN) && 广域网(WAN)
局域网是在相对较小的地理范围内建立的网络。
而广域网涵盖的范围更广。
因此,所谓的局域网和广域网只有规模上的差别,且是相对的 (依据参照物而定),在一定程度上,这两个概念只是方便我们更好的描述不同规模和范围的网络。
作为未来计算机行业的从业者,我认为,有一些常识我们也应该要知道,时间线放长,我们会发现,网络是不断壮大的,可是,这个壮大的工作是谁做的呢?
答案是:运营商,或者一些通信企业。
那么运营商为什么要这件事呢?
有人说是利润。 可是,网络是需要基础设施的,例如你要提前征地、还需要搭建一些基站、机房等, 这都是需要前期巨额投入的, 换言之,获取利润周期长,且利润不一定很高, 因此, 利润不能算主要原因。
那到底是为什么呢?
首先,在当今世界下,有网络和没有网络是天差地别的。 因此,我认为,这些企业之所以不留余力且坚持做这件事的主要推动者是国家。国家的布局才是其核心推动力。
也正是因为国家的大力支持,才使互联网行业蓬勃发展, 因此,有人说,互联网是时代的产物, 正是当今时代,当今国家的战略部署、政策引导,才有今天互联网繁荣的景象。
2、 认识并理解协议
协议是什么呢?
在计算机和网络领域中,协议指的是双方之间达成的一种约定或规范。
协议用于规定数据交换、通信或其他方面的行为方式和规则。通过遵守协议,不同的设备、系统或应用程序可以相互通信、交换信息以及实现互操作性。
协议可以包括通信协议、网络协议、应用层协议等,每种协议都定义了特定的规则和格式,确保通信双方能够正确地理解和解释彼此的消息。
那么为什么需要有协议呢?
首先我们应该知道,通信时的数据是有类别的。
比如有些数据就是单纯的数据, 比如文件的内容、文件的大小等等;而有些数据是代表着特殊内容的,这些数据可能在通信时代表着不同的含义。因此,数据类别不同, 其处理方式也会不同。
因此计算机在通信时,由于数据类别导致的处理差异化, 如果不加协议 (约定), 那么这些数据的处理就会变得复杂,成本就会变高。 因此, 之所以有协议这个东西, 其重要原因之一是为了减少通信的成本,提高通信效率。
现在我们知道协议存在的必要性,可是只要通信的两台主机,制定好协议就OK了吗?
首先,计算机之间的传输媒介是光信号和电信号, 通过 "频率" 和 "强弱" 来表示 0、1, 尽管通信双方遵守了制定好的协议, 如果计算机硬件厂商不以同样的规范解决0,1问题,那么此时,通信双方依旧无法正常通信。
其次,我们知道,在计算机世界中,存在着不同的行业领域,而每一个领域也会有不同的企业或者是厂商, 换言之, 生产计算机的厂商有很多, 计算机相关的网络硬件设备也有很多,甚至操作系统也有很多,那么, 如何让这些不同厂商生产的计算机能够相互顺畅的通信呢? 因此, 就需要有一个 " 领头羊 ",站出来, 约定一个共同的标准 (硬件标准、 软件协议)。
而这些共同的标准 (硬件标准、软件协议),我们称之为行业标准, 不论是硬件厂商,还是软件协议,都要遵守行业标准, 以达到可以互相通信的目的。
硬件标准:在硬件层面,不同的计算机和网络设备需要使用相同的标准和规范来处理信号的传输和解读。例如,计算机之间的传输媒介可以是光信号或电信号,它们需要共同遵守频率、强弱等参数的约定,才能正确传输数据。如果硬件厂商之间没有统一的标准,那么即使通信双方遵守了通信协议,仍然无法正常通信。
软件协议:在软件层面,不同的厂商和系统必须遵循相同的行业标准和协议,以确保数据的解释和处理方式一致。例如,操作系统、网络协议和应用程序都需要遵循统一的规范,这样不同的计算机和设备才能相互理解和解释对方发送的数据。如果不同厂商的软件不遵守统一的标准,也会导致通信的障碍和不兼容性。
因此,所谓的行业标准就是为了解决硬件和软件层面的一致性问题而制定的。它们确保不同厂商生产的计算机和设备都能够遵循相同的规范,以实现互相通信和互操作性。只有通过遵守行业标准,不论是硬件还是软件,才能保证计算机之间的顺畅通信和协作。
而我们今天不考虑硬件, 那么当然考虑软件咯, 因此,我们就要来理解一下网络协议。
3、 初始网络协议
3.1. 协议分层
操作系统内是可以存在多个协议的, 那么这么多的协议, 操作系统需不需要将它们管理起来呢?
答案是: 当然要管理咯。
事实上, 所有的协议,在Linux内核层面所呈现出来的都是一个个结构体对象。
1、 操作系统要进行协议管理,那么就必须要先描述再组织。这样可以确保操作系统了解每个协议的功能、数据结构、接口等信息,从而正确地调度和管理这些协议。
2、 协议本质就是软件,而软件是可以分层的。例如Linux的设计理念 (一切皆文件)、 还例如C++中继承多态的基类和派生类的关系等等
3、 网络协议在被设计的时候,是被层状划分的。
那么网络协议为什么要划分成层状结构呢?
原因:
a. 场景复杂。网络通信涉及到不同层次的功能和需求,涉及到多个不同的领域和技术,因此网络协议系统本身就非常复杂。
b. 功能解耦。通过将网络协议划分成层状结构,不同层次可以负责不同的功能,各层之间通过定义各自的接口来进行通信,实现了功能的解耦。这样可以降低系统的复杂度。
c. 便于管理和维护。 层状结构可以使网络协议分解为几个相对独立的部分,使得每个部分的功能更为明确和专一,便于用户进行各种维护和管理工作。
因此,在面对网络通信场景时,通过划分不同的层次,将功能进行解耦,降低了网络协议的管理和维护成本,以便于提供更高效、可靠的网络通信服务,因此我们将网络协议设置成了层状结构。
在日常生活中,我们也可以发现,如果通信双方距离比较短,那么其通信复杂度比较低,例如:两个人面对面的交流; 如果通信双方距离比较长,那么其通信复杂度会变高, 可以设想一下地球和月球的通信。
因此,我们可以简单地认为, 通信的复杂度和通信距离呈正相关。
那么通信的复杂性体现在哪里呢? 而这就是协议栈所要解决的问题。
在这里简单举几个例子:
应用范畴:
0、 如何处理数据。A主机和B主机进行网络通信时,并不是A主机将数据传输给B主机就完事了,而是是获得这个数据之后,还要对数据进行后序处理。
通信范畴:
1、 丢包问题。当进行网络通信时,发生了丢包,即发出的数据,对方没收到,如何处理呢?
2、 定位问题 。A主机要和B主机进行通信,可是对于A主机而言,外面的主机不仅仅只有B主机,还会存在着诸多的其他主机,那么A主机如何定位B主机呢?
3、 下一跳主机的问题。A主机和B主机进行网络通信时,当A主机与B主机有一定距离时,不是说在A主机和B主机拉一根网线就可以传输数据, 而是需要将数据在这个过程中进行转发,通俗点说,A主机和B主机进行通信时, 还需要处理一个问题: 如何将数据正确的转发到中间的设备 (例如路由器)? 即下一跳主机的问题。
因此:
为了解决处理数据问题, 有了应用层;
为了解决丢包问题,有了传输层;
为了解决定位问题, 有了网络层;
为了解决下一跳主机的问题, 有了数据链路层;
当然, 还有一层是物理层,但我们今天不考虑。
而上面这五层, 应用层、传输层、网络层、数据链路层、 物理层, 我们称之为基于TCP/IP协议定制的层状结构。
4、 TCP/IP 五层(或四层)模型
TCP/IP 是一组协议的代名词, 它还包括许多协议, 组成了TCP/IP协议族;
TCP/IP 通讯协议采用了5层的层状结构, 每一层都呼叫它的下一层所提供的网络来完成自己的需求。
4.1. 简单了解TCP/IP层状体系
TCP/IP 协议族中常用的是四层模型,包括应用层、传输层、网络层和数据链路层。物理层我们在这里简单了解即可。
应用层:
- 应用层(Application Layer): 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。
- 常见协议:HTTP、FTP、SMTP、DNS 等。
传输层:
- 传输层(Transport Layer): 负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
- 常见协议:TCP(传输控制协议)和UDP(用户数据报协议)。
网络层:
- 网络层(Network Layer): 负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
- 常见协议:IP(网际协议)、ICMP(Internet 控制消息协议)。
数据链路层:
- 数据链路层(Data Link Layer):负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。数据链路层对应的就是局域网,即局域网就是工作于数据链路层的,就会有不同的网络标准,例如以太网,令牌环网,无线LAN等标准,以太网是最常见的。 即局域网的标准是不一致的。交换机 (Switch) 也工作在数据链路层 (可以完成数据帧的转化) 。
- 常见协议:Ethernet、PPP(点对点协议)、MAC(媒体访问控制)。
- 物理层:
- 负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
4.2. TCP/IP协议层状结构和计算机层状结构的关系
从下往上, 其中, 物理层对应的就是底层硬件;数据链路层对应的就是驱动 (由于是网络,那么这里特指网卡驱动);一般传输层和网络层是在操作系统内部实现的,换言之,传输层和网络层属于操作系统;应用层对应的就是基于系统调用接口的软件应用 (用户层)。
因此,未来我们在实现网络通信时,传输层 (属于操作系统) 对外提供的系统调用接口,用户以系统调用接口就可以完成网络通信了。
可以发现,未来我们如果想要编写网络通信, 我们依旧绕不开系统调用,依旧绕不开操作系统, 所以尽管我们现在是网络编程,但本质依旧是在学习操作系统, 换言之, 网络是操作系统的子集,即网络编程是在操作系统提供的基础上进行的。
传输层中,最重要的一个协议, TCP协议;
网络层中,最重要的一个协议,IP协议。
因此,我们之所以将上面的这个层状结构称之为 TCP/IP协议,原因是因为, 传输层和网络层是在操作系统内实现的,是两个最重要的通信范畴的核心协议, 因此这个层状结构就以此为名。
一般而言:
对于一台主机,它的操作系统内核实现了从传输层到网络层的内容;
对于一台路由器,它实现了从网络层到物理层;
对于一台交换机,它实现了从数据链路层到物理层;
对于集线器,它只实现了物理层;但是,并不绝对,很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发);
5、 OSI七层模型
但是,事实上,网络协议的组织最初并不是按照TCP/IP协议模型来设计的,而是按照OSI(Open Systems Interconnection)七层模型进行设计的。
OSI(Open Systems Interconnection,开放系统互连)是一种网络通信协议体系结构,由国际标准化组织(ISO)在1984年制定的计算机网络协议设计框架,将计算机网络通信的功能划分为七个不同的层次,每个层次负责不同的功能,在设计和实现网络协议时有助于更好地组织和理解。
在OSI七层模型中,从底层到顶层分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,每一层都有特定的责任和功能,负责不同层次的数据处理和传输。
与之不同的是,TCP/IP协议模型是在实际应用中逐渐形成的,将网络通信划分为四(五)个层次,包括应用层、传输层、网络层和数据链路层、(物理层),其中TCP/IP协议栈的设计主要包括了传输层的TCP协议和网络层的IP协议。
这两者的关系就好比,OSI是产品经理的规划,而TCP/IP四层模型是具体实现出来的产品。
其次还要说明一点, 我们以后具体学习是TCP/IP层状体系, 但并不是说OSI这套层状体系不好或者不合理, 它非常合理, 设计得非常完善, 只不过上层软件不太好将应用层、表示层和会话层拆开,但是未来,我们在编写网络代码时,只要业务逻辑完善, 那么这三层都是可以体现出来的。
有人说, OSI结构复杂,因此并不实用。
但是事实上,OSI结构的确复杂,但并不是不实用,因此,如果我们未来编写应用层代码时, 其实是会直接或间接的编写表示层和会话层或者说依赖于表示层和会话层的功能。
6、 网络传输基本流程
首先,说一个常识,以太网是局域网的一种,且在局域网中的两台主机是可以直接通信的。
从逻辑上讲, 我们认为应用层和对方的应用层在直接通信。
在物理上讲, 应用层无法将数据直接发给对方的应用层,而是通过底层的网络协议栈来完成数据传输。
每层都有自己的协议定制方案,每层协议都要有自己的协议报头。
从上到下交付数据的时候,要添加报头信息,并将数据交付给下一层。
从下到上递交数据的时候,要去掉报头信息,并将数据递交给上一层。
如图所示:
6.1、 协议报头 && 封装和解包
协议报头是网络通信中数据包头部的一部分,用于在数据传输过程中携带控制信息。报头包含了一系列的字段和值,用来描述和控制数据传输的过程。报头中的信息可以包括源地址、目标地址、数据类型、数据长度、校验和以及其他控制信息,不同的网络通信协议会定义不同的报头格式和内容。
协议报头的作用主要包括以下几点:
- 识别数据包的类型和所属协议:报头中的信息帮助接收方识别数据包的类型,以便正确地解释和处理数据内容。
- 控制数据传输流程:报头中包含一些控制信息,如序列号、确认号、标志位等,用来管理数据包的传输流程,实现可靠的数据传输。
- 检测和纠正错误:报头中可能包含校验和等信息,用于检测数据传输过程中的错误,并进行必要的纠正和重传。
为了更好地理解,我们可以以从应用层传输数据到数据链路层举例:
从上图,我们也可以看出,当上层协议将数据交付于下层时, 下层会根据自己的协议需要在数据前面添加一些额外信息,而这些额外信息我们称之为协议报头,除去协议报头的部分,我们称之为有效载荷,也就是实际传输的数据部分。这种层层包裹的方式有助于不同层级的协议对数据进行解析和处理。
因此,我们的总结就是:
从上到下交付数据的过程,我们称之为封装。
从下到上递交数据的过程,我们称之为解包。
封装的本质: 添加报头信息,随后将数据整体交付于下一层;
解包的本质: 去掉报头信息 && 展开分析,随后将数据递交给上一层。
如果我们将协议层状结构理解为一个协议栈。
那么从上到下 (封装) 的本质就是一个压栈的过程; 从下到上 (解包) 的本质就是一个弹栈的过程。
不同的协议层对数据包有不同的称谓。在传输层叫做数据段(segment),在网络层叫做数据报 (datagram),在链路层叫做数据帧(frame)。 都是数据,只不过不同的叫法罢了。
同时,我们要注意,封装和解包是发生在整个数据转发过程中的。不仅在源主机和目标主机之间的通信中发生,在转发路由器进行数据包转发时也会发生。
那么会不会存在着这样的情况呢?
数据链路层将数据交付给了网络层呢? 具体如图所示:
答案是:不会, 因为协议在逻辑上只和同层协议直接通信。
最后,再补充一点, 当进行解包时, 先将数据帧的报头和有效载荷进行分离,再根据数据帧中的报头数据解析出来需要将有效载荷向上交付于哪一个协议 (这是由报头决定的)。 如图所示:
因此,未来在学习某个具体协议时,我们需要解决两个共性问题:
1、 既然报文是要被封装的,那么未来要面对的一个问题:如何解包?
2、 解决我们的有效载荷交付给上层的哪一个协议的问题?
这两个问题是每一个协议要考虑的。
每一个协议都要有一定的方式解决这两个公共问题。
6.2、 局域网通信
目前,我们已经了解了上层协议到下层协议 (封装),以及下层协议到上层协议 (解包) 的大概过程,可是我现在就有疑问了, 如何理解局域网 (以太网是局域网的一种) 通信的原理呢?
事实上,局域网通信就类似于我们生活中的上课过程。
我们在这里假设一个场景,方便理解:
A、B、C、D、E、F六名同学在一个教师中上课,张三老师问了一句: A同学作业为什么没有交? A就站起来回答, 老师,作业我放宿舍了,下课就交给你。
上面这个短暂的场景中, 我就要提出一个问题了, 当张三老师问A同学作业为什么没交时, 单纯这条信息, B、C、D、E、F同学听到了没有呢? 答案是:听到了。 可是为什么只有A同学站起来回答呢? 为什么不是B同学、F同学站起来回答呢? 因为这个信息是发送给A的, 而不是发送给B或者F的。
而我们的局域网的通信过程就类似于上面这个场景, 当A和B主机在这个局域网进行通信时, 我们看似是一对一进行通信的,但实际上是该局域网内所有的主机都会收到通信信息,但是其他主机会进行分析数据,发现这些数据不是给我的,因此将数据丢弃即可。
在局域网中,发送方主机发送的数据会被整个局域网内的主机接收到,但每个主机会根据目标MAC地址来判断数据是发给自己的还是其他主机的。
具体讲,在接收数据时,每台主机都会检查数据帧中的目标MAC地址,如果不是自己的MAC地址,那么就会丢弃这个数据帧,只有目标MAC地址与自己匹配的主机才会处理这个数据帧。这种方式有效地实现了局域网内主机之间的一对一通信。
如果你对上面的场景有了一定的理解之后, 那么可以设想一下, 当局域网内有多个主机同时发送数据时,不同主机的信息可能会被互相影响,例如数据被揉在一起,导致数据紊乱等问题。这种现象我们称之为数据碰撞。这是因为数据在传输介质(如以太网)上是以电信号的形式传输的,而不同主机同时发送数据时,它们的信号可能会相互干扰并产生冲突。
为了解决数据碰撞问题,常用的方法是采用碰撞检测和重发的机制。当检测到数据碰撞发生时,发送方会停止发送,并等待一个随机的时间间隔后重新发送数据。这样的机制可以通过错开发送时间,降低数据碰撞的概率,从而提高数据传输的稳定性。
如果你理解了上面所说的, 那么再设想一下, 如果我想破坏 (攻击) 一个局域网,那么我们只需要绕过数据链路层 (例如绕过以太网驱动程序),直接向该局域网发送垃圾数据,不就达到了破坏的目的吗? 那么这种方案可行吗?
从技术角度讲,有一些工具支持我们这样操作,换言之,我们是可以将数据从网络层直接发给局域网的。
但是从法律和道德角度讲, 如果这个局域网是我们自己搭建的,用于测试,那没有问题; 但如果这个局域网是属于其他人所有的, 那么我们一定不要这样做, 因为这种行为非常不负责任, 甚至可能触犯法律。在未经授权的情况下向他人的局域网发送垃圾数据是一种攻击行为,可能会导致网络瘫痪和数据丢失等问题,对网络安全造成严重威胁。
因此,我们应该遵循法律和道德规范,不进行未授权的网络攻击和测试。
6.3、 初始MAC地址 && IP地址
以太网的简单了解
在物理学中," 以太 " 一词曾用来描述一种假定存在于宇宙中传播电磁波的介质,即所谓的" 以太 "。后来,当网络通信技术被发明和实践时,计算机科学家们设计了一种局域网技术,并将其命名为以太网 "Ethernet"。
上面我们说了一个概念, 主机唯一标识。 可是在计算机世界中使用什么来标识主机的呢?
答案是:MAC地址(Media Access Control Address) ,在局域网中, MAC地址标识主机的唯一性。
以太网地址,俗称MAC地址, 它由厂商预设,不会随网络的改变而改变。
MAC地址是一个由48位二进制数组成的地址,通常以16进制显示,确保了网络中每台设备具有唯一性。
一般情况下, 一个网卡一个MAC地址 , 但并不排除某些策略虚拟化出来的MAC地址。
我们在云服务器中可以通过 ifconfig命令 查看 我们的 MAC地址:
ether(以太):代表的就是MAC地址;
inet: 对应的就是我们主机的IP地址。
如何理解MAC地址和IP地址呢?
在这里我们还是举一个场景:
有两条路径,分别是 A -> B -> C -> D -> E 和 A -> B -> F -> G;我们假设这里的每一个字母都代表着一个地理位置。
张三要去旅游, 从A出发,要去E景点。
因此 A 我们称之为源IP,E 我们称之为目的IP;
当A走到B时,那么B我们称之为源MAC地址。 而张三要去E,因此,那要从B -> C, 而不是从B -> F, 而这个过程我们称之为路由,C我们称之为目的MAC地址。
总结:
源IP,就是起始位置。 目的IP,就是目标位置。
源MAC地址, 我们称之为当前位置; 目的MAC,根据目的IP地址和源MAC地址 ,路由的下一个地址。
我们发现,自始至终,源IP和目的IP不会变化。而源MAC地址和目的MAC地址会在路由的过程中不断发生变化。
具体讲:
IP协议有两个版本,IPv4和IPv6,若没有特殊说明的,默认都是指IPv4
IP地址是用来在网络中标识主机或网络设备的逻辑地址,是在网络层(IP协议)中使用的。
对于IPv4来说,IP地址是一个4字节,32位的整数;
我们通常也使用 "点分十进制" 的字符串表示IP地址,例如 10.1.26.4;用点分割的每一个数字表示一个字节,范围是 0 - 255;就目前而言, IPv4依旧是当前世界主流协议, 原因之一, IPv6和IPv4不兼容。
MAC地址是用来在局域网中唯一标识网络设备的物理地址,是在数据链路层中使用的。
长度为48位,即6个字节。一般用16进制数字加上冒号的形式来表示(例如:52:47:00:db:4a:13)
在网卡出厂时就确定了,不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突,也有些网卡支持用户配置mac地址)。
源IP和目的IP在整个通信过程中保持不变;
源MAC地址和目的MAC地址在路由的过程中会随着数据包的传输而改变。
在使用TCP/ IP协议的网络中,IP及其向上的协议,同层协议看到的报文都是一样的。
差异化主要体现在数据链路层 (例如:MAC帧协议),但是这些底层的差异 (例如MAC地址的变化),最终都经过网络层 (IP协议) 给屏蔽掉了。