网络基础知识
网络发展
在计算机发展历程中,经历过下面四个阶段:
-
独立模式:计算机之间相互独立,每台计算机做自己的事情,彼此之间没有直接信息传递。如果两台计算机需要通信就需要将当前计算机的数据通过某种方式拷贝到另一台计算,如下图所示:
-
网络互联:多台计算机连接在一起,完成数据共享。示意图如下:
-
局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起
-
广域网WAN:将远隔千里的计算机都连在一起
所谓「局域网」和「广域网」只是一个相对的概念
之所以会逐渐发展为大范围的网络可以理解为主要原因是计算机是人的工具,人要协同工作
何为协议
「协议」本质上可以理解为一种约定。计算机之间的传输媒介是光信号和电信号。通过「频率」和「强弱」来表示0和1这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式,只有每一方都保证交互的数据格式是相同的,那么此时就可以进行通信。在网络中用于规范这种数据格式的就是网络协议
一般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公司,下面是常见的标准指定组织:
-
国际标准化组织:
- IEEE(电气和电子工程师协会):这是一个由计算机和工程领域专家组成的庞大技术组织,在通信协议领域贡献突出。IEEE制定了全世界电子、电气和计算机科学领域30%左右的标准,包括EEE 802系列标准,这些标准涵盖了从局域网(LAN)到广域网(WAN)等多种网络技术
- ISO(国际标准化组织):ISO是由多个国家的标准化团体组成的国际组织,它在开放系统互连(OS)模型方面的工作尤为著名。OSI模型定义了网络通信的七层协议结构,尽管在实际应用中,TCP/IP协议族更为普遍,但OS模型仍然在学术和理论研究中占有重要地位
- ITU(国际电信联盟):ITU是联合国下属的专门机构,负责制定电信领域的国际标准。ITU-T制定的标准涵盖了电话和网络通信,与ISO合作确保了通信技术的全球兼容性和互操作性
-
区域标准化组织:
- ETSI(欧洲电信标准学会):由欧洲共同体各国政府资助,是一个由电信行业的厂商与研究机构参加并从事研究开发到标准制定的组织
- ASTAP(亚洲与泛太平洋电信标准化协会):1998年由日本与韩国发起成立的标准化组织,旨在加强亚洲与太平洋地区各国信息通信基础设施及其相互连接的标准化工作的协作
-
公司:某些公司,如泰凌微,也自研各种标准的软件协议栈,包括低功耗蓝牙、 zigbee、thread及Matter等,并可进行定制化改动,这是其核心竞争力之一。泰凌微还计划重点发展智能电子价签、智能遥控、智能家居等市场。
-
民间国际团体:IETF(互联网工程师任务组):这是一个负责开发和推广互联网协议(特别是构成TCP/IP协议族的协议)的志愿组织,通过RFC发布新的或者取代老的协议标准
-
官方机构:FCC(联邦通信委员会):美国对通信技术的管理的官方机构,主要职责是通过对无线电、电视和有线通信的管理来保护公众利益。也对包括标准化在内的通信产品技术特性进行审查和监督
以上这些组织或公司都能在一定程度上定制协议标准,以满足特定需求或推动技术发展
OSI七层模型
OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范。把网络从逻辑上分为了7层,每一层都有相关、相对应的物理设备,比如路由器、交换机等。OSI七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输,它的最大优点是将服务、接口和协议这三个概念明确地区分开来,慨念清楚理论也比较完整。通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。在实际开发中,更关注的是TCP/IP五层(或四层)模型,因为使用范围更广。但是尽管如此,OSI七层模型还是一个很伟大的模型,尽管一些教材中说OSI模型太过于复杂,因为在实际操作的过程中,会话层和表示层是不可能接入到操作系统中的
下面是OSI七层模型的每一层和对应的功能:
TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求,下面是每一层的介绍:
- 物理层:负责光电信号的传递方式.比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层
- 数据链路层:负责设备之间的数据帧的传送和识别.例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层
- 网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(outer)工作在网路层
- 传输层:负责两台主机之间的数据传输。如传输控制协议TCP,能够确保数据可靠的从源主机发送到目标主机
- 应用层:负责应用程序间沟通,如简单电子邮件传输SMTP、文件传输协议FTP、网络远程访问协议Telnet等。后续的网络编程也会主要聚焦于应用层
下面是OSI七层模型和TCP/IP五层模型的对比图:
但是实际上,物理层在网络编程中考虑的比较少,所以很多时候称五层模型为四层模型
一般而言对于一台主机来说,它的操作系统内核实现了从传输层到物理层的内容;对于一台路由器,它实现了从网络层到物理层;对于一台交换机,它实现了从数据链路层到物理层;对于集线器,它只实现了物理层
但是,也存在一些其他情况,例如很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发)
协议分层
前面在了解介绍操作系统在计算机组成中所处的位置时可以看到一台计算机本质也是分层的,本次在协议部分可以发现不论是OSI模型和TCP/IP模型都是分层的,所以现在的问题是为什么需要分层这个概念
以一个例子为例:
在上面图的上半部分中,一个人另外一个人直接交流就属于一层,称为语言层,而电话机和电话机之间通信属于另外一层,称为通信层。两个人之间直接通信只要保证语言相通就可以实现信息交换,同样,电话机和电话机之间直接通信也需要保证两者的数据格式一致。如果现在让两个人之间通信不能直接通信只能借助电话机,那么此时二者依旧可以通信,因为两个人通过电话机进行通信本质上还是电话机和电话机之间的通信,只要保证数据格式一致,两个人之间就可以产生信息交换。但是,假设两个人使用不同的语言,但是两台电话机使用相同的通信数据格式,那么此时电话机彼此之间能认识出数据格式并正确解析,但是另外一个人听不懂前一个人说的信息,此时就是人与人之间的数据传递问题而不是电话机的问题,同样如果电话机使用不同的通信数据格式,那么尽管两个人使用同一个语言,他们还是无法进行通信
从上面的例子中可以发现,采用分层结构可以保证出现的问题聚焦于一层,只要由下层至上层,每一层使用的数据格式相同那么就可以实现通信,一旦某一层出现问题就可以最大可能只需要聚焦出现问题的层,这也是为什么在TCP/IP协议中每一层都呼叫它的下一层所提供的网络来完成自己的需求
除了可以保证每一层只需要考虑当前层是否使用同一数据格式外,分层还可以保证可维护性,也就是上面图的下半部分,如果两个人通信的语言相同,那么不论通信层工具种类怎么换,只要通信层两个设备使用的同一种数据格式,那么一定就可以实现通信
所以,综上所述,之所以需要分层这个概念,主要原因是分层可以保证层与层之间解耦合,进而保证可维护性强
网络协议
为什么需要有网络协议&&为什么协议可以分层
即便是单机的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:SATA、IDE、SCSl等,只不过不容易感知到罢了。而且这些协议都在本地主机各自的硬件中,通信的成本、问题比较少
其次,网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议
以下图为例:
在上图中,当两台计算机需要通信时,势必要保证二者之间的数据格式是相同的。如果一台计算机只和他自己范围内的计算机通信,那么此时这两台计算机就处于同一个局域网,在这个局域网中,只要保证彼此之间数据格式一致即可完成通信。但是,如果当前局域网的计算机需要和其他局域网的计算机通信,那么此时就需要保证远端计算机和当前计算机数据格式要一致,但是远端计算机不一定和当前计算机数据格式一致,所以此时就需要一个协议保证不论是局域网内通信的计算机还是不同局域网的计算机相互通信都使用相同的数据格式
有了协议之后就可以进行通信,但是这个协议的设计为什么可以是分层的,从上图中也可以看出,局域网内的计算机之间需要通信需要考虑发送、多个局域网中的计算机之间需要通信该如何找当前计算机需要通信的计算机、又该如何传递信息、信息传递过程之中如果存在信息丢失又该如何解决等问题本质都属于不同层的问题,所以TCP/IP能分层是因为问题可以分层
网络协议与操作系统
为什么TCP/IP协议叫这个名字而不是单单的五层模型,这些问题的本质原因就是因为TCP协议和IP协议在整个开发中最关键,以下图为例:
每台计算机都会装有操作系统,如果两个计算机想要通信,就需要通过操作系统,因为操作系统是整个计算机的管理者,但是不同的计算机可能使用的是不同的操作系统,此时就会出现操作系统不同,发送的数据格式就不同。为了解决这个问题,就需要一个标准解决这个问题,也就是说,需要一个网络协议栈规定每一层需要遵守的标准,而在操作系统所在层,在网络协议栈总对应的就是传输层和网络层,这两层使用的协议最主要的分别就是TCP协议和IP协议,因为这两个协议最重要,所以叫TCP/IP协议
所以,到底什么是协议。在上面已经在意思理解层面上做了解释,现在从实际开发层面理解,两台计算机想要通信,就必须要保证数据格式相同,而以为操作系统底层都是相同的语言,所以所谓的数据格式实际上就是一个结构体,这个结构体就是由TCP/IP协议规定的,所以协议其实就是通信双方都认识的结构化的数据类型
网络传输基本流程
局域网内数据传输流程图
在局域网内,两台计算机可以直接通信,本质就是因为两台计算机可以直接看到彼此,而在局域网内的每台计算机都需要一个唯一标识符,这个标识符称为MAC地址
MAC地址用来识别数据链路层中相连的节点;长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19
)在网卡出厂时就确定了,不能修改,所以MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)
在Linux下查看一台计算机的MAC地址可以使用下面的命令:
ifconfig
在显示出的结果中,ether
的信息就是MAC地址
在Windows下查看一台计算机的MAC地址可以使用下面的命令:
ipconfig /all
在数据链路层传输数据时就需要使用到MAC帧协议
以下图为例了解同一局域网内的计算机如何进行通信:
以太网中,任何时刻,只允许一台机器向网络中发送数据。如果有多台同时发送,会发生数据干扰,这个数据干扰称为数据碰撞。所有发送数据的主机要进行碰撞检测和碰撞避免。没有交换机的情况下,一个以太网就是一个碰撞域,局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标MAC地址判定。这里可以试着从线程访问共享资源与互斥角度来理解局域网通信原理
下面将视角聚焦于同一局域网内两台正在通信的计算机,以下面的简化图为例:
根据TCP/IP协议,不同层有不同层的协议,所以在上面的数据传递流程中涉及到每一层对数据的封装和解包与分用,如下图所示:
聚焦于一台计算机上的封装过程,如下图所示:
在上图中,报头部分,就是对应协议层的结构体字段,一般叫做报头。除了报头,剩下的叫做有效载荷故。而每一层的完整数据被称为报文,所以有报文=报头+有效载荷
但是,不同层对报文的叫法又不尽相同:在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的「上层协议字段」将数据交给对应的上层协议处理
所以,在网络传输的过程中,数据不是直接发送给对方主机的,而是先要发送方自顶向向下将数据交付给下层协议,最后由底层发送,然后由接收方主机的底层来进行接受,在自底向上进行向上交付
对于解包也是类似的过程:
所谓的分用如下图所示:
不同局域网数据传输流程图
在同一个局域网下需要使用MAC地址唯一标识一台计算机,而在不同局域网下,又对每一台计算机用IP地址进行标识,所以实际上,不同局域网内的计算机需要通信会有两套地址:
- 源IP地址到目标IP地址
- 源MAC地址到目标MAC地址
IP协议有两个版本,IPV4和IPv6。在后面的讲解中,凡是提到IP协议,没有特殊说明的,默认都是指IPV4
IP地址是在IP协议中,用来标识网络中不同主机的地址。对于IPV4来说,IP地址是一个4字节,32位的整数。通常也使用「点分十进制」的字符串表示IP地址,例如192.168.0.1
,用点分割的每一个数字表示一个字节,每一个值范围是0-255
一般来说,同一局域网内的计算机IP地址前三位是相同的,不同局域网前三位是不同的
跨局域网的主机的数据传输中,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器,如下图所示:
在上图中,左右两侧分别是不同局域网下的计算机,现在二者需要进行网络通信,因为是不同局域网,所以需要经过中间的路由器,整个过程示意图如下:
结合封装和解包完善上图如下:
网络通信的整体流程示意图如下:
MAC地址与IP地址的区别
在局域网内使用MAC地址,在跨局域网时使用IP地址,既然都有了IP地址为什么还需要用MAC地址,实际上是因为历史的原因,前面提到过,先有局域网内计算机的通信,再有的跨局域网的通信,所以一开始只有MAC地址,随后才有的IP地址
在跨局域网传输时,第一套地址,也就是源IP地址到目标IP地址,一般来说在传输过程是不变的,但是在同一个局域网内,使用的是第二套地址,即源MAC地址到目标MAC地址,不同设备的MAC地址是不同的的,即从当前局域网传递到另一个局域网时都会涉及到MAC地址的改变