目录
1. 协议
1.1. 站在日常生活的角度初始协议
1.2. 网络分层结构 (OS vs 网络)
1.2.1. 软件分层
1.2.2. 网络分层
1.3. 站在语言的角度理解协议
1. 协议
对于协议,我们可以用一句话概括它:协议本质上就是一种约定。
1.1. 站在日常生活的角度初始协议
现在,由于国家和社会的高速发展,出国留学的人日益增多,小东就是一个海外留学的学生,出门在外,时常需要与父母打电话联系,但由于海外与国内打电话成本比较高且小东家庭的经济情况不是很好,为了减少成本,于是小东与父母就达成了一个约定,这个约定就是:
- 如果小东打电话,电话铃声响了一声就挂断电话,那么代表的是小东没钱了,需要父母转钱;
- 如果小东打电话,电话铃声响了两声就挂断电话,那么代表的是小东一切安好,报平安,望父母勿忧;
- 如果小东打电话,电话铃声响了三声就挂断电话,那么代表的是小东与父母需要谈事情,此时小东父母才会与小东通过电话沟通。
上面这个例子,小东通过与父母达成的一个约定,达到了减少 (经济) 成本且与父母完成交互的目的。
而上面这种约定在网络我们称之为协议,其本质就是减少通信成本,提高通信效率。
1.2. 网络分层结构 (OS vs 网络)
谈到网络分层,我们也需要理解一下什么叫软件分层。
1.2.1. 软件分层
事实上,对于软件分层这个概念,我们并不陌生,比如:
- 在学习系统时,我们知道进程的虚拟地址空间本质上就是进程和 (物理) 内存的一层中间软件层;
- 在学习文件系统时,我们谈过一切皆文件,即在内核看来,所有的硬件 (显示器、网卡、磁盘等等) 都被看做为一个一个的 struct file 结构,换言之, struct file 这个结构就是内核与底层硬件驱动程序之间的一层中间软件层,而我们以前也提过,struct file 这一层我们称之为 VFS (virtual file system);
- 在学习计算机宏观体系时,也知道计算机体系也是被分层的,自底向上分别为硬件、驱动、内核、system call、语言(以及各种库)、用户代码。
事实上,软件分层是计算机的一种设计理念 --- 任何问题都可以通过添加一层中间软件层来解决。
可是有一个疑问,软件分层为什么可以做到这样呢?换言之,软件分层的好处是什么呢?
我们还是通过一个实例来理解:在学习操作系统时,我们说过,操作系统是为了管理软硬件资源的 (对下),同时也需要为上层用户提供高效的、稳定的、安全的运行环境 (对上),对下我们就不谈了,我们主要谈谈OS如何对上层用户提供服务的,换言之,上层用户是如何使用OS提供的各种功能的呢?
站在用户的视角,最简便的方案就是用户直接访问OS提供的功能,这是最方便直观的,但是有一个致命的问题,用户可不一定完全了解内核,且用户行为可能带有攻击性,简而言之,这种方案对内核自身的安全产生了威胁,如果内核自身安全都无法得到保证,何谈内核为上层用户提供服务呢?
在遇到困难时,我们或许可以考虑换个视角思考问题,因此,站在OS的视角,在OS为用户提供服务时,其首要前提是,内核自身需要保证安全,不能让用户影响到内核,故设计者在内核和上层用户添加了一层中间软件层,即 system call,上层用户通过 system call 这一层中间软件层访问内核,这样带来的好处就是,将上层用户和内核进行了解耦,换言之,上层用户的行为无法影响到内核,内核只需要将服务以系统调用接口的形式对外提供,这样就降低了系统的复杂度,以便于后续维护和扩展。
对于软件分层而言,我们也可以用一句话概括它,软件分层就是为了让层与层之间进行解耦,以达到降低系统复杂度,减少后续维护成本和可扩展的目的。
1.2.2. 网络分层
有了软件分层的理解,那么对于网络分层,我们是可以有一个大概的认识的,尽管我们未见过它,但可以预见到,网络是一个比较大的模块,为了降低系统复杂度,以便于后期的维护、扩展等等目的,设计者们对网络进行高度抽象为各个模块,这些模块以层状结构体现。
再有了上面的认识后,我们首先提出一个问题,为什么会有网络呢?
首先,我们要清楚一点,网络本质上是为了通信,即数据交互。而为什么会有网络,我们可以从生活中的例子来理解 (艺术来源于生活嘛~~~):
在古代中,我们的祖先是如何通信的呢? 如果两个人距离非常近,那么直接交谈就行了,但如果两个人距离非常远,比如一个人在西域,另一个人在长安,那么这两个人直接交谈是无法成功的,因为距离太远了,因此,古人就通过书信的方式来进行通信,而这里的书信就相当于当下的网络。
那么为什么会有书信通信呢,如果两个人近在咫尺,需不需要通过书信来沟通呢? 一般情况下是不需要的,因为此时较于直接交流就显得成本过高了。
但如果两个人距离非常遥远,那么就必须要通过书信这种方式进行通信,因为此时直接交流是无法完成通信的,只能通过书信的方式来进行数据交互,换言之,之所以会有古代的书信通信以及当下的网络通信,其根本原因就是因为,通信双方的距离变长了。
一旦通信双方距离变长,那么就会引发新的问题,诸如:
- 如何转发数据:数据是需要进行转发的,可不是从 src 一下就到了 dest,而是需要进行中转的,既然要进行中转,那么数据是如何进行转发的呢?
- 将数据转发到哪里:既然数据要进行转发,那么也需要考虑将数据转发到哪里呢? 即从 src 到 dest 这个转发路线是怎样的?
- 数据在转发过程中的可靠性问题:数据在整个转发过程中,有没有可能出现数据丢失的可能呢? 答案是有的,因此,在数据转发过程中,数据的可靠性是怎样保证的?
- 通信数据如何使用:首先,我们要明确一点,通信可不是目的,获取数据以及对数据的处理才是目的,通信只是为了获取数据的一种手段,那么数据如何使用呢?
简而言之,上面想说的就一句话:通信双方距离变长,一定会引发新的问题,而网络就是解决这些新产生的问题的。
那么网络是如何解决这些新问题的呢?
网络通过各种协议解决上述问题,这些协议我们可以称之为 TCP/IP 协议,换言之,网络协议就是为了解决由于通信双方距离变长产生新的问题的一种解决方案,这就是其存在的主要原因。
既然网络协议是一种解决方案,而对于解决方案而言,那么必然会存在好的解决方案,以及坏的解决方案,那么如何区分它们呢?
一个好的解决方案体现出来的特点:整体体系复杂度低,可扩展、后期维护成本低。
因此,网络的设计者们将网络协议设计成为了层状结构。
至于具体的层状结构 (OSI七层模型 (理论上) 和 TCP/IP五层协议模型 (实际工程中)),我们就不说了,后续过程中,我们主要谈论的是 TCP/IP 五层协议模型。
但在这里,我们仍需强调一点,计算机体系的层状结构 vs 网络协议的层状结构,如图所示:
可以看出,网络协议层状中的传输层和网络层本质上是属于OS的,换言之,传输层和网络层中的协议本质上就是OS源码中的一部分。
在这里存在一个问题,既然传输层和网络层是由OS内部自身实现的,那么上层用户 (应用层) 可以直接使用这两层的协议吗?
答案是不能的,因为OS不相信任何用户,但同时OS又需要为上层提供网络服务,故OS也必须要有与网络通信相关的 system call,当有了与网络相关的 system call,上层用户就可以基于这些系统调用进行网络开发,同时,也有人对这些系统调用进行再次封装,形成网络库。
关于网络协议栈和操作系统的关系:TCP/IP四层模型 (不考虑物理层) 的下三层属于操作系统及驱动,其操作是是由操作系统和网络驱动程序自动处理的,上层应用通常不需要关心这些底层细节,只需通过操作系统提供的系统调用进行网络通信即可。
接下来,我们需要强调一下多主机的通信细节:
对于一台Linux机器和一台Windows机器而言,在内核管理中 (内存管理、进程管理、文件管理、驱动管理等等)肯定是不一样的,事实也是如此,同时,我们也知道,一台Linux机器是可以和Windows机器进行网络通信的,这是为什么?
原因是因为它们的网络协议栈是一样的,它们都遵守同一个标准 (TCP/IP 协议模型),故而可以进行网络通信,换言之,如果一台设备 (无论是手机、手表、汽车等等),只要想入网,那么其前提条件就是必须遵守 TCP/IP 协议模型,只要遵守了这个标准,那么就可以进行网络传输,与机器是什么操作系统无关。
总的来说,对于一台机器而言,只要想入网,那么其内核可以是个性化的,但网络标准必须是共性化的,只有遵守共性化的网络标准,才可以进行网络通信。
1.3. 站在语言的角度理解协议
首先,我们知道,Linux操作系统是由C编写的,而传输层和网络层又隶属于OS,那么换言之,传输层和网络层这些协议以及对上层用户提供的系统调用都是由C实现的,同时,我们知道,传输层和网络层可不仅仅只有一个协议,换言之,系统内存在着大量的网络协议,网络协议如此之多,那么内核需不需要管理它们呢?
答案是毋庸置疑的,必须要管理,如何管理? 先描述在组织。
既然是C实现的协议,那么如何描述? 当然是 struct ,换言之,这么多的协议,本质上就是一个一个的 struct 罢了,我们以下面这个结构体举例:
struct AAA
{
int a;
int b;
int c;
};
当两台主机进行通信时,比如主机A和主机B,A向B发送这个结构化的数据,当B收到了这个结构化的数据,请问B可以解释这个结构化的数据吗?
当然可以解释,因为任何一台设备,只要想入网,必循遵守相同的网络协议标准,换言之,它们遵守的是相同的网络标准,其协议细节完全一样,而这个结构化的数据类型本质上就是通信双发达成的 "约定", 即协议。
在未来,我们学习到的任何一种网络协议,其本质上就是一个 struct 结构体类型, 由于网络标准的共性化,通信双方都可以认识并解释这些数据,这就是我们对于协议的认识和理解。