1.协议
1.1.什么是协议/协议的由来?
这个就要回到我们说的阿帕网了!!
在阿帕网(ARPA)产生运作之初,通过接口信号处理机实现互联的电脑并不多,大部分电脑相互之间不兼容。
在一台电脑上完成的工作,很难拿到另一台电脑上去用,想让硬件和软件都不一样的电脑联网,也有很多困难。
当时美国的状况是:陆军用的电脑是DEC系列产品,海军用的电脑是Honeywell中标机器,空军用的是IBM公司中标的电脑
每一个军种的电脑在各自的系里都运行良好,但却有一个大弊病:不能共享资源。
正是因为底层软硬件之间的差异,所以才需要一个适用于网络传输的统一的规则
也就是不管有何差别,只要大家遵循统一的网络通信协议,就能够实现通信。
我们可以再深入理解一下
在此举一个简单的例子。有三个人A、B、C。A只会说汉语、B只会说英语而C既会说汉语又会说英语。现在A与B要聊天,他们之间该如何沟通呢?若A与C要聊天,又会怎样?这时如果我们:
- 将汉语和英语当作“协议”
- 将聊天当作“通信”
- 将说话的内容当作“数据”
那么A与B之间由于各持一种语言,恐怕说多久也无法交流。因为他们之间的谈话所用的协议(语言)不同,双方都无法将数据(所说的话)传递给对方接下来,我们分析A与C之间聊天的情况。两人都用汉语这个“协议”就能理解对方所要表达的具体含义了。也就是说A与C为了顺利沟通,采用同一种协议,使得他们之间能够传递所期望的数据(想要说给对方的话)。
如此看来,协议如同人们平常说话所用的语言。
虽然语言是人类才具有的特性,但计算机与计算机之间通过网络进行通信时,也可以认为是依据类似于人类“语言”实现了相互通信”。
2.协议分层
2.1.为什么要协议分层
网络在传输过程中面临诸多问题:
- 数据如何组织,如何解析的问题
- 长距离传输,数据丢失的问题
- 如何在众多主机中定位目标主机的问题
- 如何进行数据转发、路径选择的问题
010101
硬件级别的协议问题
如何解决这些问题呢?
很简单,将问题分类,逐个击破
这些问题之间是存在先后关系的,比如只有先把信息组织好了,才需要考虑数据传输过程中的丢失问题,丢失问题得到保障后,就要考虑把数据发送给谁、如何发送,最终通过硬件完成发送
基于 解耦、可维护性、可扩展性 这三点出发,采用 协议分层 的解决方案,将不同的问题解决策略归入不同模块中,模块之间互不影响
此时网络的 层状结构 呼之欲出,不同分层中包含了各种协议,负责解决不同的问题
在进行 分层 后,上层无需关心下层的具体实现,只需要使用下层提供的功能即可,分层 思想很好的体现了计算机领域的设计哲学:任何计算机问题都可以通过添加一层软件层解决
2.2.理解分层
我们先看看软件有没有分层的例子。
有啊,
- 在学习 继承 时,子类继承自父类,当前出现了 父类 和 子类 这两层结构,父类可以不必关心子类的具体实现,需要时可以直接通过父类指针对子类成员或函数进行访问
- Linux的系统调用接口
- .......
我们来举个例子来了解分层
拿日常生活举例,假设 A 想给 B 打电话,只需要拿起电话并拨通 B 的号码,待 B 接通电话后,双方可以通话,在通话过程中,真实的情况是人和电话沟通,但是逻辑上A 与 B 都认为自己在直接与对方通话,电话在和电话通信。
这是因为 A、B 同处 语言层,任务是 进行通话,而通话的具体实现属于 通信设备层,用于 实现通话;语言层 依赖 通信设备层 的功能,但并不关心它的具体实现,因为没必要
语言层和通信设备层之间通过 接口 进行连接,有点类似于Linux操作系统中的系统调用
假设某天 通信设备层 中的电话机坏了,可以将其更换为无线电,继续向 语言层 提供通话的服务,即便设备更换了,A
、B
依旧可以正常通话
不仅 通信设备层 可以更换设备,语言层 也可以更换角色,比如现在变成 B
、C
两个外国人进行通话,通信设备层 依旧可以正常提供服务
上述例子中,很好的体现出 分层 的好处:分层之后,每一层都只关注自己层的功能,使用下层提供的接口,任何一层出问题,都不会直接影响其他层
这样子一下子就明白了分层的好处吧!!!
2.3.分层的好处
分层的好处很多,主要归于下面这几点
1.各层次之间是独立的。某一层并不需要知道它的下一层是如何实现的,而仅仅需要知道该层通过层间的接口所提供的服务。这样,整个问题的复杂程度就下降了。也就是说上一层的工作如何进行并不影响下一层的工作,这样我们在进行每一层的工作设计时只要保证接口不变可以随意调整层内的工作方式。
2.灵活性好。当任何一层发生变化时,只要层间接口关系保持不变,则在这层以上或以下层均不受影响。当某一层出现技术革新或者某一层在工作中出现问题时不会连累到其它层的工作,排除问题时也只需要考虑这一层单独的问题即可。
3.结构上可分割开。各层都可以采用最合适的技术来实现。技术的发展往往不对称的,层次化的划分有效避免了木桶效应,不会因为某一方面技术的不完善而影响整体的工作效率。
4.易于实现和维护。这种结构使得实现和调试一个庞大又复杂的系统变得易于处理,因为整个的系统已经被分解为若干个相对独立的子系统。进行调试和维护时,可以对每一层进行单独的调试,避免了出现找不到、解决错问题的情况。
5.能促进标准化工作。因为每一层的功能及其所提供的服务都已有了精确的说明。标准化的好处就是可以随意替换其中的某一层,对于使用和科研来说十分方便。
分层 是解决大量问题的最优解(高内聚、低耦合)
- 能否不进行分层?
从技术层面来说是可以的,但这对于整个系统的设计都是非常不友好的,比如你可以把所有的代码都写到一个 main 函数中,程序依旧可以运行,但如果程序运行出现了问题,或者说需要对某个功能进行改动,会变得十分麻烦
所以随着编程思想的深入,不同的功能由不同的函数实现,对功能(函数)进行聚合,也就形成了类;分层也是如此,分层之后,无论是进行功能维护,还是进行功能扩展,都可以在不影响其他层的情况下进行
3.协议的标准化
在计算机通信诞生之初,系统化与标准化并未得到足够的重视。每家计算机厂商都出产各自的网络产品来实现计算机通信。对于协议的系统化、分层化等事宜没有特别强烈的意识。
1974年,IBM公司发布了SNA,将本公司的计算机通信技术作为系统化网络体系结构公之于众。从此,计算机厂商也纷纷发布各自的网络体系结构,引发了众多协议的系统化进程。
然而,各家厂商的各种网络体系结构、各种协议之间并不相互兼容。
即使是从物理层面上连接了两台异构的计算机,由于它们之间采用的网络体系结构不同,支持的协议不同,仍然无法实现正常的通信。
这对用户来说极其不便。
因为这意味着起初采用了哪个厂商的计算机网络产品就只能一直使用同一厂商的产品。若相应的厂商破产或产品超过服务期限,就得将整套网络设备全部换掉。
此外,因为不同部门之间使用的网络产品互不相同所以就算将它们从物理上相互连接起来了也无法实现通信,这种情况亦不在少数。灵活性和可扩展性的缺乏使得当时的用户对计算机通信难以应用自如。
为了解决上述问题,ISO制定了一个国际标准OSI,对通信系统进行了标准化。
4.OSI模型
前面只是将协议简单地分为了两层进行了举例说明。然而,实际的分组通信协议会相当复杂。
OSI参考模型将这样一个复杂的协议整理并分为了易于理解的7个分层。
OSI参考模型对通信中必要的功能做了很好的归纳。网络工程师在讨论协议相关问题时也经常以OSI参考模型的分层为原型。对于计算机网络的初学者,学习OSI参考模型可以说是通往成功的第一步。
不过,OSI参考模型终究是一个“模型”,它也只是对各层的作用做了一系列粗略的界定,并没有对协议和接口进行详细的定义。它对学习和设计协议只能起到一个引导的作用。因此,若想要了解协议的更多细节,还是有必要参考每个协议本身的具体规范。
许多通信协议,都对应了OSI参考模型7个分层中的某层。通过这一点,可以大致了解该协议在整个通信功能中的位置和作用。
虽然要仔细阅读相应的规范说明书才能了解协议的具体内容,但是对于其大致的作用可以通过其所对应的OSI模型层来找到方向。这也是为什么在学习每一种协议之前,首先要学习OSI模型。
现在,OSI所定义的协议虽然并没有得到普及,但是在OSI协议设计之初作为其指导方针的OSI参考模型却常被用于网络协议的制定当中。
接下来来了解一下OSI参考模型的分层情况
4.1.OSI参考模型通信处理举例
下面举例说明7层网络模型的功能。假设使用主机"A的用户A要给使用主机B的用户B发送一封电子邮件。
不过,严格来讲OSI与互联网的电子邮件的实际运行机制并非图例所示那么简单。此例只是为了便于读者理解 OSI参考模型而设计的。
我们先举寄快递的例子来理解网络通信,我们寄快递的时候,是不是要填一个快递单,上面记录了收件人和发件人的个人信息,没有这个信息,这个快递是不能送到收件人手上的!!但是收件人收到了这个快递,也收到了这张快递单。 也就是说我们传递数据的时候会有额外的数据传过去,这个额外的数据就是协议(快递单),而在Linux里面,快递单就是一个结构体(因为Linux是用c语言实现的)!!!!
也就是说我们网络通信的时候也是需要像这样子的一个快递单,才能进行通信,而这个快递单就是协议最直观的表示
4.1.1.七层通信
在7层OSI模型中,如何模块化通信传输?
分析方法可以借鉴图1.17语言与电话机组成的2层模型。
- 发送方从第7层第6层到第1层由上至下按照顺序传输数据,而接收端则从第1层、第2层到第7层由下至上向每个上一级分层传输数据。
- 每个分层上,在处理由上一层传过来的数据时可以附上当前分层的协议所必须的“首部”信息。(类似我们说的快递单)
- 然后接收端对收到的数据进行数据“首部”与“内容”的分离,再转发给上一分层,并最终将发送端的数据恢复为原状。
假定用户A要给用户B发送一封内容为“早上好”邮件。网络究竟会进行哪些处理呢?我们由上至下进行分析。
- 应用层
用户A在主机A上新建一封电子邮件,指定收件人为B,并输入邮件内容为早上好”。
收发邮件的这款软件从功能上可以分为两大类:一部分是与通信相关的,另一部分是与通信无关的。
例如用户A从键盘输人“早上好”的这一部分就属于与通信无关的功能,而将“早上好”的内容发送给收件人B则是其与通信相关的功能。
因此,此处的“输入电子邮件内容后发送给目标地址”也就相当于应用层。从用户输入完所要发送的内容并点击“发送”按钮的那一刻开始,就进入了应用层协议的处理。该协议会在所要传送数据的前端附加一个首部(标签)信息。该首部标明了邮件内容为“早上好”和收件人为“B”。这一附有首部信息的数据传送给主机B以后由该主机上的收发邮件软件通过“收信”功能获取内容。
主机B上的应用收到由主机A发送过来的数据后,分析其数据首部与数据正文并将邮件保存到硬盘或是其他非易失性存储器"以备进行相应的处理。如果主机B上收件人的邮箱空间已满无法接收新的邮件,则会返回一个错误给发送方。对这关异常的处理也正属于应用层需要解决的问题。
主机A与主机B通过它们各自应用层之间的通信,最终实现邮件的存储。
- 表示层
表示层的“表示”有“表现”、“演示”的意思,因此更关注数据的具体表现形式”。此外,所使用的应用软件本身的不同也会导致数据的表现形式截然不同。例如有的字处理软件创建的文件只能由该字处理器厂商所提供的特定版本的软件才来打开读取。
那么,电子邮件中如果遇到此类问题该如何解决呢?如果用户A与用户B所使用的邮件客户端软件完全一致,就能够顺利收取和阅读邮件,不会遇到类似的问题。但是这在现实生活当中是不大可能的。让所有用户千篇一律地使用同一款客户端软件对使用者来说也是极不方便的一件事情
解决这类问题有以下几种方法。首先是利用表示层,将数据从“某个计算机特定的数据格式”转换为“网络通用的标准数据格式”后再发送出去。接收端主机收到数据以后将这些网络标准格式的数据恢复为“该计算机特定的数据格式"然后再进行相应处理。
在前面这个例子中,由于数据被转换为通用标准的格式后再进行处理,使得异构的机型之间也能保持数据的一致性。这也正是表示层的作用所在。即表示层是进行“统一的网络数据格式”与“某一台计算机或某一款软件特有的数据格式”之间相互转换的分层。
此例中的“早上好”这段文字根据其编码格式被转换成为了“统一的网络数据格式”。即便是一段简单的文字流,也可以有众多复杂的编码格式。就拿日语文字来说,有EUC-JP、Shit_JIS、IS0-2022-JP、UTF-8以及 UTF-16 等很多编码格格式,如果未能按照特定格式编码,那么在接收端就是收到邮件也可能会是乱码表示层与表示层之间为了识别编码格式也会附加首部信息,从而将实际传输数据转交给下一层去处理。
- 会话层
下面,我们来分析在两端主机的会话层之间是如何高效地进行数据交互、采用何种方法传输数据的。
假定用户A新建了5封电子邮件准备发给用户B。这5封邮件的发送顺序可以有很多种。例如,可以每发一封邮件时建立一次连接",随后断开连接。还可以一经建立好连接后就将5封邮件连续发送给对方。甚至可以同时建立好5个连接,将5封邮件同时发送给对方。
决定采用何种连接方法是会话层的主要责任。会话层也像应用层或表示层那样,在其收到的数据前端附加首部或标签信息后再转发给下一层。而这些首部或标签中记录着数据传送顺序的信息。
网络通信到了这里还只是完成了何时建立连接,何时发送等问题,还不具备真正的网络通信能力
- 传输层
主机A确保与主机B之间的通信并准备发送数据。这一过程叫做“建立连接”。有了这个通信连接就可以使主机A发送的电子邮件到达主机B中,并由主机B的邮件处理程序获取最终数据。此外,当通信传输结束后,有必要将连接断开。
如上,进行建立连接或断开连接的处理",在两个主机之间创建逻辑上的通信连接即是传输层的主要作用。此外,传输层为确保所传输的数据到达目标地址会在通信两端的计算机之间进行确认,如果数据没有到达,它会负责进行重发。例如,主机A将“早上好”这一数据发送给主机B。期间可能会因为某些原因导致数据被破坏,或由于发生某种网络异常致使只有一部分数据到达目标地址。假设主机B只收到了“早上”这一部分数据,那么它会在收到数据后将自己没有收到“早上”之后那部分数据的事实告知主机A。主机A得知这个情况后就会将后面的“好”重发给主机B,并再次确认对端是否收到。
由此可见,保证数据传输的可靠性是传输层的一个重要作用。为了确保可靠性,在这一层也会为所要传输的数据附加首部以识别这一分层的数据。然而,实际上将数据传输给对端的处理是由网络层来完成的。
- 网络层
网络层的作用是在网络与网络相互连接的环境中,将数据从发送端主机发送到接收端主机。
如图所示,两端主机之间虽然有众多数据链路,但能够将数据从主机A送到主机B也都是网络层的功劳。
在实际发送数据时,目的地址至关重要。
这个地址是进行通信的网络中唯一指定的序号。也可以把它想象为我们日常生活中使用的电话号码。只要这个目标地址确定了,就可以在众多计算机中选出该目标地址所对应的计算机发送数据。
基于这个地址,就可以在网络层进行数据包的发送处理。而有了地址和网络层的包发送处理,就可以将数据发送到世界上任何一台互连设备。网络层中也会将其从上层收到的数据和地址信息等一起发送给下面的数据链路层,进行后面的处理。
注意:有的时候网络层不一定能准确传输,这个时候会借助传输层来传输
- 数据链路层、物理层
通信传输实际上是通过物理的传输介质实现的。数据链路层的作用就是在这些通过传输介质互连的设备之间进行数据处理。
物理层中,将数据的0、1转换为电压和脉冲光传输给物理的传输介质,而相互直连的设备之间使用地址实现传输。这种地址被称为MAC地址,也可称为物理地址或硬件地址。采用MAC地址,目的是为了识别连接到同一个传输介质上的设备。因此,在这一分层中将包含MAC地址信息的首部附加到从网路层转发过来的数据上,将其发送到网络。
网络层与数据链路层都是基于目标地址将数据发送给接收端的,但是网络层负责将整个数据发送给最终目标地址,而数据链路层则只负责发送一个分段内的数据。
- 主机B端的处理
接收端主机B上的处理流程正好与主机A相反,它从物理层开始将接收到的数据逐层发给上一分层进行处理,从而使用户B最终在主机B上使用邮件客户端软件接收用户A发送过来的邮件,并可以读取相应内容为“早上好”
如上所述,读者可以将通信网络的功能分层来思考。每个分层上的协议规定了该分层中数据首部的格式以及首部与处理数据的顺序。
这个例子可以让大家明白这个网络通信是个什么情况了吧
4.2.总结
综上
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机; OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七 个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
但是, 它既复杂又不实用; 所以我们按照TCP/IP五层模型来讲解.我们先不急,先来了解TCP/IP
5.TCP/IP
从字面意义上讲,有人可能会认为TCP/IP是指TCP与IP两种协议。实际生活当中有时也确实就是指这两种协议。
然而在很多情况下,它只是利用IP进行通信时所必须用到的协议群的统称。具体来说,IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP的协议。它们与TCP或IP的关系紧密,是互联网必不可少的组成部分。TCP/IP一词泛指这些协议,因此,有时也称TCP/IP为网际协议族
5.1.TCP/IP五层模型
为什么是五层?
这是因为开发人员在使用 OSI
七层模型 的过程中,发现这个标准设计的过于麻烦了,应用层、表示层、会话层 可以合为一层:应用层,加上剩下的四层,也就是变成了五层模型
- 为什么叫做 TCP/IP 五层模型?
这是因为其中的 TCP、IP 协议非常经典、非常重要,具有代表意义,于是就命名成了 TCP/IP 五层模型
注意: TCP/IP是一组协议的代名词,其中包含了许多协议,共同组成了 TCP/IP 协议簇
TCP/IP 五层模型 也可以称为 TCP/IP 四层模型,这是因为 物理层 不是我们开发人员关注的重点
TCP/IP
五层模型 的不同分层功能如下(自底向上)
- 1.物理层
负责光电信号的传递方式,以太网 中采用 同轴电缆、双绞线、光纤、电磁波 等传递信号,不同材质决定了信号最大传输速率、传输距离、抗干扰性等,如果信号传递过程中出现衰减,还可以使用 集线器 进行信号增强
- 2.数据链路层
负责设备之间的数据帧的传送和识别,比如网卡设备的驱动、帧同步、冲突检测、差错校验等工作, 数据链路层 中有很多不同的实现标准:以太网、令牌环、无线 LAN 等,具体是什么标准,取决于网卡,用于连接多台设备,实现网络数据传输与交换的 交换机 就工作在 数据链路层
- 3.网络层
负责地址管理和路由选择,比如在 IP 协议 中,通过 IP 地址来标识主机,可以通过查询路由表的方式规划出源主机与目标主机之间的传输路线,这正是 路由器 的工作职责
- 4.传输层
负责两台主机之间的数据传输,通过诸如 TCP 协议 等传输协议,实现高效、可靠的数据传输,数据传输不一定成功,可以通过 重传 相关机制重新传输数据
- 5.应用层
负责应用程序间沟通,比如 简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet) 等,在进行网络编程时,主要针对的就是 应用层
我们以后就只讲四层!!!物理层不学
一般而言
- 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
- 对于一台路由器, 它实现了从网络层到物理层;
- 对于一台交换机, 它实现了从数据链路层到物理层;
- 对于集线器, 它只实现了物理层
但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发);
5.2.网络协议栈和操作系统的关系
那么问题来了,网络协议栈和我们操作系统有什么关系?
系统、网络 不分家,看似设计复杂的网络标准模型其实和系统设计有着千丝万缕的联系,比如 网络层、传输层 这四层属于 操作系统内核部分,剩下的 应用层 属于 用户层,因为我们最终是需要通过操作系统来进行网络通信,所以网络标准模型必然会被融入操作系统中
应用层中的 应用、表示、会话 不属于系统体系结构,也不能属于系统体系结构,因为他们由用户定义并实现,由于实现方式不固定,也就统称为 应用层,网络编程就是在 应用层 中进行的
网络层和传输层就是Linux内核部分的东西 。
网络标准模型融入操作系统后,为了让用户能使用网络,操作系统就为网络相关操作提供了一批 系统调用接口,也就是后面学习的 socket
套接字编程
操作系统具有四大管理模块:内存管理、进程管理、文件管理、驱动管理,压根就没有 网络管理,那么操作系统是如何网络进行管理的?
Linux 中一切皆文件,网络需要借助网卡通信,而网卡在操作系统看来,不过是一个提供了读方法与写方法的硬件设备而已,所以操作系统只需要通过 「文件管理」 那一套来对网络进行管理就行了
其实 socket 本质上就是一个文件描述符,一个专门对于 网络资源(文件) 进行操作的句柄而已,这也就意味着系统提供的网络相关系统调用接口,必然与文件相关接口操作类似
网络本质上是挂接至文件系统中的一个重要子功能
网络与系统也有一些区别:系统可以有很多种,但网络中的核心协议栈必须一致,无论是哪种系统,如果核心协议栈不一致,就无法进行网络通信
因为有标准的限制,所有主流操作系统都必须实现基于 TPC、IP 实现的核心协议栈(工作在操作系统层中),所以所有操作系统的网络协议栈都是一样的。
5.3.再次理解协议
TCP/IP
模型中的不同层都有自己的协议每一层都有自己的 协议 很好理解,毕竟每层需要解决的问题都不同,用来解决问题的 协议 自然就不同
而协议最直观的表现部分叫做 「协议报头」 ,还记得我们上面说的OSI模型吗?
我们先举寄快递的例子来理解网络通信,我们寄快递的时候,是不是要填一个快递单,上面记录了收件人和发件人的个人信息,没有这个信息,这个快递是不能送到收件人手上的!!但是收件人收到了这个快递,也收到了这张快递单。 也就是说我们传递数据的时候会有额外的数据传过去,这个额外的数据就是协议(快递单),而在Linux里面,快递单就是一个结构体(因为Linux是用c语言实现的)!!!!
也就是说我们网络通信的时候也是需要像这样子的一个快递单,才能进行通信,而这个快递单就是协议最直观的表示,这个快递单也就是我们的协议报头
协议报头 在数据传输过程中,用于承载一些控制信息;协议报头 提供了关于数据包或帧的元信息,以便在网络中正确地路由、传递和处理数据
比如下面这个就是经典的
TCP
协议报头这个是不是和快递单很像啊!!!
6.局域网通信
6.1.同一个局域网通信原理
两台计算机通过TCP/IP协议进行通信
- 以太网
以太网是一种使用共享介质访问控制方法的局域网(LAN)技术,它在1970年代初由施乐帕克公司(Xerox PARC)首先提出并开发。以太网标准由IEEE 802.3定义,确保了不同厂商生产的设备能够相互兼容和通信。
以太网位于OSI七层模型的数据链路层和物理层
这里就只是想告诉大家:同一局域网内两台机器可以直接通信的!!!
- 以太 是什么东西?为什么能跟网络扯上关系?
以太 这个名词源于物理学中的 以太假说:认为光在太空中通过 以太 传播,但物理实验证明其根本不存在,最终沦为物理学界的笑柄。而我们网络中正是通过 光电信号 传输数据的(光电信号中有光),因此就把该标准称为 以太网,用来 “致敬” 物理学
我们这个了解到这里就行。不必深究
- 有效载荷
有效载荷是一个相对的概念
网络中传输的 数据 可以看作商品,称为 有效载荷,传输过程中选择的 协议 可以看作快递公司,协议报头 自然就是快递单了,实际在进行网络传输时,也是遵循 打包 + 传输 + 解包 这三步走的,只不过在传输过程中还需要再 打包,在众多 协议报头 的保驾护航之下,可以确保数据在网络世界中成功递达
- 快递单1 + 商品 —> 这个的协议报头( 快递单1)+ 有效载荷(商品)
- 快递单2 + (快递单1+商品) —> 协议报头(快递单2) + 有效载荷((快递单1+商品)
所以现在可以理解为什么不同层中的协议可以共同完成数据传输工作了,因为对于同层来说,协议是用来解决问题的,问题解决后,会用自己的 协议报头 将数据打包,传给下层;或者把自己本层的协议报头与有效载荷分离后,把有效载荷传给上层
- 传给下层时:解决完问题后,将上层传过来的有效载荷,与自己层的协议打包后,继续传给下一层,这个过程称为 封装
- 传给上层时:上层得到的是一个自己能看懂的数据包,把自己本层的协议分离后,把有效载荷继续往上传就好了,这个过程称为 分用
封装 与 分用 是不同网络层中必须面对的重要问题,只有把这两个问题解决了,整个传输过程才会通畅,关于更多实现细节可以接着往下看
有了 局域网内直接通信 和 协议报头 的前置知识后,接下来演示 同一个局域网内两台主机如何通信
通信过程:应用层将自己的 协议报头 与用户想发送的 信息 封装成一个 数据包,传给下一层,传输层将自己的 协议报头 与 数据包 封装成一个新的 数据包,传给下一层,不断重复,直到 数据包 来到对端主机网络中;
- 在链路层,这个数据包的协议报头是链路层的协议报头,链路层从数据包中分离出链路层的协议报头和 有效载荷,向上交付有效载荷
- 在网络层,这个数据包的协议报头是网络层的协议报头,网络层从数据包中分离出网络层的协议报头和 有效载荷,向上交付有效载荷,
- ……
- 最终 有效载荷 为 主机A 发送的 信息,成功交给了 主机B
解铃还须系铃人,
XXX
层 封装 的协议报头,只有同层才能进行 解包
得益于 协议分层,看似 主机A 与 主机B 在直接通信,实际上数据至少经历了九次传输
这里我们要来复习一下我们的有效载荷,大家看下面这个表
层 | 协议报头 | 有效载荷 |
应用层 | FTP报头 | 主机A 发送的信息 |
传输层 | TCP报头 | FTP报头+主机A 发送的信息 |
网络层 | IP报头 | TCP报头+FTP报头+主机A 发送的信息 |
链路层 | 以太网报头 | IP报头+TCP报头+FTP报头+主机A 发送的信息 |
通信的本质就是不断的封装和解包!!!!
从上面主机通信的例子中,可以产出以下结论:
- 每一层都有自己的协议报头
- 向下传输时,每一层都要有将自己的「协议报头」与「有效载荷」封装,传给下一层的能力
- 向上传输时,每一层都要有将自己的「协议报头」与「有效载荷」分离,识别并交付给上一层的能力
- 在逻辑上,同一层中使用的都是同一个协议,都认为自己在于对端直接通信
- 1.向上交付时,如何从数据包中将自己的 「协议报头」 与 「有效载荷」 分离呢?
「协议报头」中一般都包含了当前报头的大小,用数据包总大小 - 协议报头大小,得到的就是「有效载荷」;除此之外有的「协议报头」与「有效载荷」之间存在特殊分隔符,可以轻松识别并分离
- 2.可是协议有很多,在向上交付时,如何知道 「有效载荷」 该传递给哪个 协议 呢?
如果要交给上一层,「有效载荷」中必然包含上一层协议报头,而协议报头中包含了协议信息,自然能知道将「有效载荷」交付给谁了
综合一下就是:
- 几乎任何协议层都需要一种将协议报头和有效载荷进行分离的能力。
- 几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交给上层哪一个协议的能力。——这个是为了分用!!!
这样子面对封装和解包就不会困惑!!!
这个是大部分协议的共性,未来学习协议的时候,我都会提及这两个点!
6.2.以太网通信
我们来了解一下以太网通信的原理
每台主机在局域网都有有自己唯一的“编号”,正如我们的名字一样
局域网中通信的具体实现方式这里不详谈,通过一个例子来辅助理解
某天,张三正在上课,王老师定了一个规矩:在我上课期间,其他人不允许讨论,如果想发言,需要举手示意
张三听着听着就走神了,突然王老师看着张三想起了一件事,并直接问到:“张三,你的作业为什么没交?”,因为此时全班只有王老师的声音,其他同学听到后发现王老师叫的是 [张三],而不是自己,选择无视了王老师的发言,当张三听到王老师在叫自己名字后,打起精神并站了起来,开始分析王老师传达的信息:[为什么没交作业?],张三想了半天,想出一个理由:[王老师] [作业我写了,但在家里忘带了,下次带给你],其他同学听到张三的发言依旧选择无视,王老师收到张三的信息后表示:“[张三] [你能忘记作业,为什么不能忘记吃饭呢?]”,全班发出笑声,张三收到信息后尴尬坐下
故事结束,在上面的故事中,张三所处的环境正是一个 局域网,同学和老师们可以直接通信,但任何时刻,都只允许一人通信,其中每个人的名字可以看作自己的 标识符,王老师发出的信息中只包含了 [张三] 这个 标识符,因为在一个教室里,所以除张三外的其他同学也能收到王老师发出的信息,但他们选择无视,因为 [张三] 这个 标识符 与自己对不上,当张三与王老师在进行对话时,虽然全班人都能听到,但本质上只有张三与王老师在进行通信,而这就是 局域网 中 以太网 的通信原理
我们再来谈谈我们的以太网通信
为协助确定以太网中的源地址和目的地址,创建了称为介质访问控制 (MAC) 地址的唯一标识符。这个就像上面的名字一样。
下面就是一个简易的以太网通信体系
每台电脑都有一个单独的MAC地址,每张网卡出厂的时候都有一个全球唯一的标识,这个地址就是MAC地址。
那么现在我们MAC1想发给MAC7一条消息,那么过程是怎么样的?
首先肯定需要一个以太网协议报头,上面会写发件方和收件方,但是这个消息整个局域网内的设备都会收到,这个收到是指网卡在硬件层面收到了,但是不会处理,只有MAC7会传给上层的网络层处理。
这个和教室的例子差不多。
既然局域网中的数据包可以被所有人收到,也就意味着通信过程可能被干扰,导致自己的消息 丢失/混乱
如果我们不断往局域网中发送大量无用的数据包,会导致 网络碰撞,影响局域网中的正常通信,发生 网络碰撞 后,未递达的数据会重新发送,此时再发送就会变得特别慢,因为此时局域网中都是垃圾数据包,大部分时间都用在甄别垃圾数据包上了
这就也解释了大部分学校的校园网在晚上打游戏的时候会很卡,因为大家处于同一个局域网中,大家都在打游戏,都在发送数据包,容易发生 数据碰撞,从而导致数据 延迟递达,也就是 网络延迟。
上面这个同一时间只能一台机器使用这个局域网,那么多台机器使用则会造成数据碰撞,为了改进这个问题,我们引入了交换机
- 交换机的核心工作就是划分碰撞域
交换机是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。交换机工作于OSI参考模型的第二层,即数据链路层。交换机拥有一条高带宽的背部总线和内部交换矩阵,在同一时刻可进行多个端口对之间的数据传输。交换机的传输模式有全双工,半双工,全双工/半双工自适应。
当交换机收到数据时,它会检查它的目的MAC地址,然后把数据从目的主机所在的接口转发出去。交换机之所以能实现这一功能,是因为交换机内部有一个MAC地址表,MAC地址表记录了网络中所有MAC地址与该交换机各端口的对应信息。某一数据帧需要转发时,交换机根据该数据帧的目的MAC地址来查找MAC地址表,从而得到该地址对应的端口,即知道具有该MAC地址的设备是连接在交换机的哪个端口上,然后交换机把数据帧从该端口转发出去。
我们来重新理解一下局域网通信
局域网是共享资源,我们只要交换机来保证只有1个主机在使用这个局域网,所以我们可以将这个局域网看作一个临界资源,交换机和我们说的那个互斥锁是不是一样的啊!!!我们网络通信的本质就是进程访问临界资源
7.跨网络的远端通信
首先我们需要了解跨网络跨的可是局域网,本质是两个局域网间的通信!!!
我们要进行跨网络的通信,就必须要通过路由器。
令牌环网是什么东西?
令牌环(Token Ring)是一种局域网(LAN)的通信协议,最初由IBM在1984年开发并标准化为IEEE 802.5标准。在令牌环网络中,所有的计算机或工作站被连接成一个逻辑或物理的环形拓扑结构。网络中数据的传输是通过一个特殊的控制信号,即“令牌”来管理的。
(1)令牌的传递
网络中有一个特殊的帧叫做“令牌”,它沿着环形网络从一个工作站传到另一个工作站。通常情况下,令牌是一个空闲状态的特殊帧,表示网络上的任何工作站都可以使用网络进行传输。
(2)数据发送
当一个工作站想要发送数据时,它必须等待令牌的到来。收到令牌的工作站检查其状态,如果令牌处于空闲状态,那么该工作站可以将其状态改为忙,并附加上它要发送的数据。这样,令牌就变成了一个数据帧,包含有源地址、目的地址和实际的数据负载。
(3)数据接收和转发
数据帧沿着环形网络继续传递,每个工作站接收到这个帧后,都会检查目的地址是否与自己的地址匹配。如果不匹配,工作站会将数据帧原封不动地转发给下一个工作站。如果目的地址与工作站的地址匹配,那么该工作站会复制数据帧的内容,并将其从网络上移除。
(4)令牌恢复
发送数据的工作站在数据帧完成一圈并返回时,会检查确认信息,确保数据被正确接收。一旦数据帧被接收并验证无误,原始发送工作站会从网络上移除该帧,并重新生成一个空闲状态的令牌,以便其他工作站可以使用。这个是不是特别像我们Linux里面的互斥锁啊。
令牌环网和以太网都属于数据链路层。 它们是差不多一样的东西。
- 路由器是什么东西?
路由器 主要工作在 网络层,但它也具备 数据链路层、物理层 的工作能力,并且 路由器 也可以可以看作一台 主机(节点),作为远端通信的桥梁,路由器 至少需要级联两个子网,至少要提供两个网络接口
它用来串联起两个局域网
主机A 与 主机B 不处在同一个局域网中,如果想要进行通信,需要让 路由器 与 主机A 处于同一个子网,同时让 路由器 与 主机B 也处在同一个子网,主机A 把数据交给 路由器,路由器 把数据转发给 主机B,主机A 与 主机B 完成了通信,就像下面这样子
假设 主机A 与 路由器 所在子网标准为 以太网,主机B 与 路由器 所在子网标准为 令牌环,同样可以演示两台主机如何进行跨路由器的远端通信
好了,了解完令牌网和路由器,该进入正轨了
主机A 正常将信息封装后,向下传递,当数据包来到 网络层 时,发现此时有很多主机,自己该如何将数据包正确传递给路由器呢?
有人说可以用MAC地址来标识,这个理论上是可以的,但是 MAC地址只应用于局域网,无法保证全网的唯一性。这个时候就要使用新的地址——IP地址
好了,知道大家疑惑,我现在就来好好讲讲IP地址和MAC地址
7.1.网络地址
7.1.1.IP地址
就目前的知识水平来说,IP
地址 是 公网环境下每个主机的唯一标识
- IP地址在仅仅是网络层中用于标识一个节点(或者网络设备的接口)。网络标识唯一节点,便于数据包转发。
- IP地址用于IP报文在网络层中的寻址。
- IP地址就像现实中的地址,可以标识网络中的一个节点,数据就是通过它来找到目的地。类似我们人的身份证号码一样。
目前的 IP 地址 有两种:IPv4、IPv6,凡是没有特殊说明的,IP 地址 都是指 IPv4
IPv4 由一个 4 字节的无符号整数 构成,占 32 比特位,可表示的最大地址数为 42亿+
为了让 IP 地址 更便于阅读,可以将整数中的四部分转为十进制后通过符号连接,以 点分十进制 的形式展现,比如 192.168.0.1
IPv4 标准于 1981 年推出,在那个联网设备都还极度匮乏的年代,使用一个无符号整型(最大表示 42 亿+)就足够了,IPv4 在当时看来确实可以标识网络中的主机所有主机,然而谁也没有意料到网络发展如此之快,快到 42 亿个地址根本不够用,IPv4 标准中的所有地址于 2019 年全部分配完毕,这就导致 IPv4 标准现在并不能标识所有主机,只能标识公网环境下的所有主机
为了应对 IPv4 地址不够用的窘境,推出了 IPv6、NAT 等技术,IPv6 足足使用了 16 字节,长度为 128 位,是 IPv4 的四倍,可以标识 340 亿亿亿台设备,是一个天文数字,称可以为全世界的每一粒沙子编上一个地址,目前 IPv6 标准尚未全面普及;而 NAT 技术则是引入了 地址转换 的概念,简言之就是在公网与内网间建立映射关系,使得内网中允许地址重复,NAT 技术提供了一定的安全保护
我们普通人使用的网络一般都是内网,地址普遍都是 192.168.xxx.xxx,这种情况下即使你的 IP 暴露,也无法直接定位至你的主机设备
7.1.2.MAC地址
- MAC地址(Media Access Control Address)也称为硬件地址或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。
- 在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址 。MAC地址用来识别数据链路层中相连的节点
- MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。
- MAC 地址 用一个 6 字节的整数表示,占 48 比特位,可表示的最大地址数为 百万 亿+
- MAC 地址 一般用十六进制数字加上冒号的形式来表示,例如: 08:00:27:03:fb:19
- MAC 地址 在网卡出厂时就确定了,不能修改. MAC 地址 通常是唯一的(虚拟机中的 MAC 地址 不是真实的 MAC 地址,可能会冲突,也有些网卡支持用户配置 MAC 地址)
IP 地址很紧张,MAC 地址就不一样,作为数据包转发的节点,同一个局域网内,MAC 地址重复的可能性几乎为0,48 比特位显得有点浪费,这就好比你每个月要1000生活费,但你爸每个月都给你1000w,足够用,但过于夸张了
7.1.3.IP地址和MAC地址的区别
IP 地址 与 MAC 地址 最大的区别在于:传输过程中,IP 地址不会改变,MAC 地址会改变,随着传输距离的增加,MAC 地址改变的次数也会增加
如何理解 IP 地址 与 MAC 地址 的关系?
IP 地址 分为 源IP地址、目标IP地址,MAC 地址 也分为 源MAC地址、目标MAC地址
假设有一天,张三考上了大学,临近上学日,一向谨慎的张三选择规划好自己的报名路线。因为张三家住江西南昌,而他的学校在上海,途径多个省份,张三需要坐高铁从江西南昌到浙江杭州,再从浙江杭州到上海,分为两程:南昌西站->杭州东站,杭州东站->上海虹桥站,虽然中途涉及换乘,并且每一程的始发地和目的地也不一样,但张三的最终目的地始终没有改变
- 源IP地址:张三家
- 目标IP地址:张三考上的学校
- 源MAC地址:第一趟是南昌西站,第二趟是杭州东站
- 目标MAC地址:第一趟是杭州东站,第二趟是上海虹桥站
张三只需要带够钱,并且明确自己的目的地,就一定能抵达
张三的报名之路类似于数据包在网络中的传输之路,IP 地址始终没有改变,但 MAC 地址可能发生改变,当 主机A 将数据包交给路由器后,路由器分析 IP 地址得知需要将数据包转交给 主机B,于是数据包中的 目的 MAC 地址 会变成 MAC-主机B,然后路由器再根据这个数据包发给主机B,主机B 收到数据包后,经过不断解包分用,主机B 将会收到 主机A 发送的信息 lo
所以 IP 地址 用来表示始发地与目的地,MAC 地址 用来表示途中需要经过的中转区间,通常把 MAC 地址 的改变称为 下一跳,就是从一个 子网 跳转到另一个 子网 中。
IP 地址 和 MAC 地址 共同协作,确保数据能够从源设备传输到目的设备。
IP 地址 提供了端到端的逻辑标识,而 MAC 地址 则在局域网中提供了物理设备之间的唯一标识。这种分层的设计有助于网络的灵活性和可扩展性
好了,了解完网络地址,快回归这个跨网络的远端通信这个过程
首先我们得知道IP地址存在于网络层发出的协议报头里面,而MAC地址存在于数据链路层的协议报头里面!!
我们可以把这个过程看作是两个局域网在通信
1.首先来看看A主机所在局域网的通信过程
数据包从网络层进入数据链路层,数据链路层会分析IP地址,然后得出路由器的MAC地址,并将其写入数据链路层的协议报头里面去,然后再转交给以太网。每台主机就会解包以太网的协议报头,根据MAC地址来确认是不是发给自己的
- 如果是发给当前局域网下的一台主机,则那台主机解包并往上层传递即可
- 如果确定不是发给当前局域网的主机之后,然后最后将数据传递给路由器。(将数据包丢给路由器的行为称为 默认路由)
2.然后看看路由器的工作过程以及后面的情况
路由器的数据链路层解包我们数据包的以太网的协议报头,确定是发给自己的,然后往上传递给网络层,网络层解包协议报头,获取IP地址。在路由器中存在一张 路由表,其中包含了A,B主机当前局域网网中已有路径信息,以及之前通信过的路径信息,路由器会先到 路由表 中查询目标路径是否存在于B主机当前所在局域网,如果存在,就按照路由表里记录的路径传递。也就是网络层再进行封装加上协议报头,然后往下传给令牌环,令牌环再将MAC地址加入它自己的协议报头,然后进入B主机所在局域网——这里是令牌网,根据MAC地址找到主机B,然后再往上传递即可。
整个过程就像下面这样子
我们这里就知道,主机需要解包,路由器等中间设备也需要具备解包能力,因为路径规划依赖于 IP,而查看IP协议报头,需要先将以太网等链路层协议报头去除
IP协议屏蔽了底层网络的差异化,靠的就是工作在IP层的路由器。IP实现的全球主机的软件虚拟层,一切皆是IP报文!!!!
我们回过头来理解这个图
我们把IP层拉出来看,我们有没有发现数据从A主机的IP层到了路由器的IP层,再从路由器的IP层到主机B的IP层。 这跟我们上面说的高铁站是一样的道理啊!A主机的IP层相当于南昌西站,路由器的IP层相当于杭州东站,B主机的IP层相当于上海虹桥站。这样子也没有理解MAC地址和IP地址呢?
此外我们发现网络通信最终都是需要通过网卡这个硬件设备来进行通信的!!!!!所以必须来到数据链路层/物理层才可以进行网络通信。