🌎初识计算机网络
文章目录:
网络协议
初识协议
制定协议标准的组织或公司
OSI七层模型
操作系统和计算机网络关系
再谈协议
🚀计算机网络背景
- 独立模式: 计算机之间相互独立。
- 网络互联: 多台计算机连接在一起, 完成数据共享。
- 局域网 LAN : 计算机数量更多了, 通过 交换机 和 路由器 连接在一起。
- 广域网 WAN: 将远隔千里的计算机都连在一起。
所谓 “局域网” 和 “广域网” 只是一个相对的概念. 比如, 我们有 “天朝特色” 的广域网, 也可以看做一个比较大的局域网。
🚀网络协议
✈️初识协议
- “协议” 是一种约定。
比如打电话约定电话铃响的次数的约定,而计算机网络协议,是通信双方所遵守的约定。
计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式。
思考: 只要通信的两台主机, 约定好协议就可以了么?
定好协议,但是你用频率表示 01,我用强弱表示 01,就好比我用中国话,你用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了基本的协议,也是无法正常通信的。
所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守。
- 计算机生产厂商有很多。
- 计算机操作系统, 也有很多。
- 计算机网络硬件设备, 还是有很多。
如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是 网络协议。
阿熊在龙国A市B小区C单元住着,阿熊的楼上是卖牙膏的,有一天阿熊的牙膏用完了,直接去楼上买牙膏就行,而阿熊只需要操心到手的牙膏怎么使用即可。
阿熊这天又把牙膏用完了,不同的是,阿熊这次想要试一试国外的牌子,这个时候阿熊点开网络购物,从加拿大买了一款牙膏,下单之后,阿熊只需要静待快递到即可,而发货公司考虑的就多了。
首先,发货公司需要确定目的地址,然后需要确定中途的每一个站点,只有确定了,以及到达每个地方的配送方式,最重要的是,包裹如果出现了以外该怎么办,有哪些补救方法。
在现实生活中有上述的问题,而在计算机网络的世界中同样存在这些问题,通过以上的例子,我们可以将网络当中的所有问题归为以下四类:
- 如何使用数据的问题
- 可靠性的问题
- 主机定位的问题
- 数据报局域网转发的问题
而计算机网络协议的出现就是为了解决以上问题所制定的。
✈️制定协议标准的组织或公司
一般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公司。
能定制协议标准的组织或公司主要有以下几类:
- 国际标准化组织:
- IEEE(电气和电子工程师协会):这是一个由计算机和工程领域专家组成的庞大技术组织,在通信协议领域贡献突出。IEEE 制定了全世界电子、电气和计算机科学领域 30%左右的标准,包括 IEEE 802 系列标准,这些标准涵盖了从局域网(LAN)到广域网(WAN)等多种网络技术。
- ISO(国际标准化组织):ISO 是由多个国家的标准化团体组成的国际组织,它在开放系统互连(OSI)模型方面的工作尤为著名。OSI 模型定义了网络通信的七层协议结构,尽管在实际应用中,TCP/IP 协议族更为普遍,但 OSI 模型仍然在学术和理论研究中占有重要地位。
- ITU(国际电信联盟):ITU 是联合国下属的专门机构,负责制定电信领域的国际标准。ITU-T 制定的标准涵盖了电话和网络通信,与 ISO 合作确保了通信技术的全球兼容性和互操作性。
- 区域标准化组织:
- ETSI(欧洲电信标准学会):由欧洲共同体各国政府资助,是一个由电信行业的厂商与研究机构参加并从事研究开发到标准制定的组织。
- ASTAP(亚洲与泛太平洋电信标准化协会):1998 年由日本与韩国发起成立的标准化组织,旨在加强亚洲与太平洋地区各国信息通信基础设施及其相互连接的标准化工作的协作。
- 公司:
- 某些公司,如泰凌微,也自研各种标准的软件协议栈,包括低功耗蓝牙、zigbee、thread 及 Matter 等,并可进行定制化改动,这是其核心竞争力之一。泰凌微还计划重点发展智能电子价签、智能遥控、智能家居等市场。
- 民间国际团体:
- IETF(互联网工程师任务组):这是一个负责开发和推广互联网协议(特别是构成 TCP/IP 协议族的协议)的志愿组织,通过 RFC 发布新的或者取代老的协议标准。
- 官方机构:
- FCC(联邦通信委员会):美国对通信技术的管理的官方机构,主要职责是通过对无线电、电视和有线通信的管理来保护公众利益。也对包括标准化在内的通信产品技术特性进行审查和监督。以上这些组织或公司都能在一定程度上定制协议标准,以满足特定需求或推动技术发展。
✈️OSI七层模型
在计算机中,很多东西都是分层的,比较常见的就是 软件分层 与 网络分层。相信很多人都听说过这样一句话:任何问题都可以通过添加一层软件层来解决。软件分层能更好的解决问题,但是为什么需要网络分层呢?
实际上,网络分层是为了让层和层之间是松耦合的,这样,如果上层出现问题就去上层解决,下层出现问题就去下层解决。不至于一个小问题导致整个网络瘫痪。
- 协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构的。
在这个例子中, 我们的"协议"只有两层:语言层、通信设备层。
但是实际的网络通信协议,设计的会更加复杂, 需要分更多的层, 但是通过上面的简单例子,我们是能理解,分层可以实现解耦合,让软件维护的成本更低。
-
OSI(Open System Interconnection,开放系统互连) 七层网络模型称为 开放
式系统互联参考模型,是一个逻辑上的定义和规范。 -
把网络从逻辑上分为了 7 层. 每一层都有相关、相对应的物理设备,比如路由器,交换机。
-
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输。
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可 靠的通讯。
虽然OSI提出了七层模型,但是并不负责实现这七层模型,仅仅是提出了定义,而后人们通过工程实践得出,OSI七层模型实现起来比较困难,现实一般需要5层模型即可。而 应用层 表示层 会话层,统一为应用层。同时也可称为 TCP/IP 五层(四层协议):
物理层我们考虑的比较少,我们只考虑软件相关的内容. 因此很多时候我们直接称为TCP/IP 四层模型。TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层。
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线 LAN 等标准. 交换机(Switch)工作在数据链路层。
- 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层。
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机。
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层。
上三层合并为一层,这是因为上三层的不确定性太大,有些通过网络传播的是音频,有些是视频,有些是文字、图片等等。所以不能将这些都内置在OS中,否则就会限制网络的功能。
✈️操作系统和计算机网络关系
如果你学过Linux系统编程,那么在看到OSI七层模型的时候,可能第一时间想到的是操作系统划分的层状结构,那么计算机网络与OS还有关系吗?实际上,他们的关系如下:
上图很清晰的解释了计算机网络相对于操作系统的位置。而传输层和网络层集成在操作系统内部的,所以,网络就是OS的一部分。操作系统在诞生之初,其网络协议栈就已经存在了,因为其集成在内核当中。
所以用户是无法直接访问网络协议栈的,网络势必要像OS那样,提供系统调用接口给上层使用。而基于网络的系统调用接口开发出的程序,就属于应用层。有些人觉得系统调用使用起来比较麻烦,所以又对网络的系统调用接口做了封装,形成网络库。
按照常识,我们都知道,windows的电脑是可以给苹果用户的电脑发消息的,安卓同样可行。实际上,世界上所有的OS只要想入网,就必须遵守TCP/IP协议,保证不同主机之间的数据通信。这就是OS与网络之间的关系。
✈️再谈协议
截止到目前为止,我们并没有真正的接触协议。我们都知道,OS大部分都是由C语言来编写的,而TCP/IP网络协议栈也属于内核的一部分,则TCP/IP网络协议栈也是由C语言来编写的。
仔细观察下图:
问题 :主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?
-
回答:答案是肯定的!因为双方都有同样的结构体类型 struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别对方发来的数据,这不就是约定吗?
-
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。
🚀网络传输的基本流程
✈️局域网通信
假设在一个局域网内,有多台主机,共用这个局域网,那么这些处在同一个局域网当中的主机,是否可以相互通信呢?
按照常识,我们都知道,同一局域网内的主机之间是完全可以相互通信的,但是他们是如何做到的呢?怎么知道我要发送数据的对端是谁呢?
其实很简答,在上课时,老师喊阿熊起来回答问题,明明其他人也都听到了,但是为什么就阿熊站起来呢?因为只有阿熊自己叫做阿熊。而在计算机当中,每台主机都有自己的唯一标识,我们称为 Mac地址。
有关Mac地址的详细原理:
- MAC 地址用来识别数据链路层中相连的节点。
- 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址)
在Linux当中,我们使用 ifconfig
可以查看本机的Mac地址:
尽管如此,它们之间想要通信还有不少的问题。阿熊在上课被叫起来回答问题,这个时候张三肯定不会说,“阿熊,昨天借我的5毛钱赶紧还我”。但是在计算机的世界里,发送数据时可能不止一台主机在发送,而它们处在同一局域网之间,就 有可能会发送数据碰撞。
所以,每台主机为了避免这种情况,内置了碰撞检测和避免方法,当局域网内有其他主机在发送消息时,当前主机就会阻塞等待,等待网络通信状态重新变好,才会继续发送数据。所以,我们又把 一个局域网称为一个 碰撞域。
所以在 任何时刻,在局域网内只能有一台主机发送数据的局域网,我们称为 以太网。
还有一种网络叫做 令牌环网,在一个局域网内,有多台主机,只有一台主机持有令牌时才可发送数据,否则只能等待令牌。
不论是 局域网 还是 令牌环网,本质都是 在同一时刻只有一台主机发送数据。
我们已经初步了解了局域网通信的原理,再来看同一个网段内的两台主机进行收发消息的过程:
现在有两台主机进行通信,上面我们说了,如果两台计算机想要通过网络进行通信,那么他们必须遵守相同的协议,一台主机在发送数据时会自上而下对发送信息进行封装,而收端收到信息需要自下而上解开对信息的封装才能拿到信息。
而不同层协议之间,都认为自己是在和对端同层协议进行通信。每一层协议都会对原有的数据进行封装,形成 报头,除了本层添加的报头,剩下的信息 我们称为 有效载荷。
当应用层对原始文本添加了报头,并不能直接发送给对端同层协议,而是需要向下继续添加下一层协议报头,下一层协议同样需要添加这一层自己的报头,直到数据链路层封装完最后的报头。
这个数据就被封装完成了,然后就可以通过网卡向对端主机发送数据。对端主机收到数据的流程与发送的流程截然相反,自底向上一层一层的解包,最后才接收到数据。
前面我们说了,TCP/IP协议属于内核中的一部分,而每一层封装的报头,实际上就是计算机网络协议的结构化数据报头。说人话就是结构体。两台计算机通过tcp/ip协议通讯的过程如下:
对端主机在收到数据的时候,是需要解包的,从数据链路层往上一层一层解包,但是每一层可能是不同的协议(比如,网络层协议可能不是IP, 有可能是ICMP协议),那么当前层在将数据解包之前,需要先明确将解包过后的有效载荷发送给上层的哪个协议,而这部分工作实际上在本层报头解析时就已经完成了,因为当前层的报头会有下一层协议报信息,这样就可以发送指定层的指定协议了。
上述过程在计算机网络中的专业术语叫做 解包 与 分用:
- 解包:将报头和有效载荷进行分离。
- 分用:将自己的有效载荷交付给上层的那一个协议。
下图为数据封装过程:
下图为数据分用的过程:
✈️跨网络传输流程
现在又两个不同的局域网,它们之间想要通信,所以使用了路由器将两个子网建立连接,这样,处在不同网络之间的数据就可以开始通信了。
跨网段的主机的数据传输,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器。
我们先不着急了解双方是如何跨网络通信的,我们先来看一下唐僧去西天取经的故事:
话说唐僧师徒四人去西天取经,这一回,唐僧一行人刚从女儿国出来,前往黑风岭,熟悉故事的我们都知道,黑风岭的下一站就是火焰山。唐僧一行人刚到了黑风岭,就遇见了黑风岭领主,领主问唐僧:“你是谁,从何而来,到哪里去?” 唐僧回答:“贫僧自东土大唐而来,要到西天取经,敢问施主可知通往西天路的下一站是哪里?” “原来是唐僧,来了就别走了,袈裟留下!”
如果黑熊精是一个好领主,他就会告诉唐僧下一站该前往火焰山。而有意思的是在唐僧身上永远会有两套地址:
- src(自东土大唐而来),dst(西天取经)。
- 上一站从哪来,下一站到哪里去。
唐僧无论去到那个地方,如果有人问唐僧从哪来到哪去,唐僧一定回答:“自东土大唐而来,到西天取经去。” 我们发现,第一套地址无论唐僧在哪里都不会改变。
但是每当唐僧去到了不同的地方的时候,唐僧上一站从哪来,下一站到哪去都会立刻刷新。也就是说,唐僧的第二套地址是一直在变化的。
而在计算机网络当中,上述的两套地址,它们分别对应:
- 源IP地址,目的IP地址
- 源Mac地址,目的Mac地址
其中 目的IP地址给我们提供路径规划的依据,唐僧为什么要去女儿国?因为唐僧要去西天,唐僧为什么要去黑风岭?因为唐僧要去西天。
这里涉及了IP地址的概念,IP地址是什么?以及它与Mac地址有什么区别?
- IP地址是一种点分十进制的地址通常以:xxx.xxx.xxx.xxx 形式出现
在Linux当中可以使用 ifconfig
命令查看IP地址:
- IP地址在整个路由过程中,一直不变(目前知识储备不足,我们只能这样说明,后面在修正)
- Mac 地址一直在变
- 目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依据,mac 地址是局域网转发的重要依据。
路由器一般至少横跨两个子网,所以这里路由器要有两张网卡,有两个Mac地址。
在 网络层IP进行封装协议头时,就已经将源IP于目的IP封装进报头里面。而在最后一层协议封装时,需要将原Mac地址与目的Mac地址封装进数据报头。所以左侧设备的网络源mac地址是自己,目的mac地址是路由器 mac_left 地址。
此时,被封装完的数据通过网卡发送到了路由器,路由器发现目的mac是发给自己的,那么就对第一层协议头进行解包并分用,当有效载荷到达了上层IP网络层,此时源mac和目的mac已经不再重要,此时IP层协议对IP报头进行分析,发现目的IP是 主机B.
路由器作为三层交换机,也有自己的层数划分,不过只有两层。所以路由器的IP网络层会重新对有效载荷进行封装,送达下层协议,当有效载荷到达了下层协议,不论是什么网路,都会对有效载荷进行报头封装,这时,源mac地址变为了 right_mac ,目的地址变为了 IPB。
于是对端主机B就可以收到对应的数据了,因为通信双方遵守相同的TCP/IP协议,所以由路由器转发的数据在主机B也是可以看懂的,在经过一层层的解包和分用,最终把信息呈现给了用户B。
IP层往上,这些协议有区别吗?
实际上IP层往上,双方的协议并没有任何的不同,而IP层往下就有差别了,上面例子中,第一次封装的是以太网的数据报头,发送给了路由器,而路由器发送给对端B时,却变为了令牌环网的数据报头。