1 简介
OSI: Open System Interconnection.
OSI参考模型,全称为开放系统互连参考模型(Open Systems Interconnection Reference Model),是由国际标准化组织(ISO)在1984年提出的一个概念框架。该模型旨在为不同计算机系统之间的通信提供一个标准化的分层结构,使得不同厂商的设备和软件能够在网络中相互通信。其将网络通信过程从逻辑上划分为七个不同的层次,每个层次都有特定的功能和服务。这些层次从低到高分别是:
- 物理层(Physical Layer):
- 定义物理介质的电气、机械和操作特性。
- 负责在通信信道上以比特流的形式传输原始数据。
- 数据链路层(Data Link Layer):
- 负责在相邻节点之间建立可靠的数据传输链路。
- 进行数据帧的封装和解封装,处理物理地址(如MAC地址),以及错误检测和纠正。
- 网络层(Network Layer):
- 处理数据包的路由选择和转发。
- 定义逻辑地址(如IP地址),负责数据包在网络中的寻址和路径选择。
- 传输层(Transport Layer):
- 提供端到端的可靠数据传输服务。
- 负责端口号的分配,以及数据的分段和重组。
- 支持面向连接(如TCP)和无连接(如UDP)的传输服务。
- 会话层(Session Layer):
- 管理不同设备之间的会话(Session)。
- 负责建立、管理和终止会话连接,支持数据同步和检查点设置。
- 表示层(Presentation Layer):
- 处理数据的表示、加密和压缩等问题。
- 确保不同系统之间的数据格式能够相互理解。
- 应用层(Application Layer):
- 提供网络应用程序与用户之间的接口。
- 支持各种网络应用协议,如HTTP、FTP、SMTP等。
OSI参考模型的分层目的是为了解决异种机互连的问题,包括互连时所遇到的兼容性问题。分层的最大优点是将服务、接口和协议这三者明确地区分开。在这个参考模型的数据传输过程当中,不同主机对等层之间会按照协议进行通信,同一主机的不同层之间通过接口进行通信。在这个模型中,每一层将上一层传递过来的通信数据加上若干控制位后再传递给下一层,最终由物理层传递到对方物理层,再逐级上传,从而实现了对等层之间的逻辑通信。
OSI参考模型的每一层都依赖于其下层提供的服务,并向其上层提供服务。这种分层结构便于网络设计和实现,同时也促进了网络协议的标准化和互操作性1。
2 物理层
物理层是OSI第一层,该层作为七层网络中的最低层,是整个网络通信的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的真实物理环境。它的主要功能是为终端设备提供传送数据的通路。
物理层的传输媒体包括架空明线、平衡电缆、光纤、无线信道等。通信用的互连设备指将DTE、DCE连接起来的装置,如各种插头、插座。DTE即数据终端设备,又称物理设备,如计算机、终端等。而DCE则是数据通信设备或电路连接设备,如调制解调器等。数据传输通常是经过DTE——DCE,再经过DCE——DTE的路径。
物理层主要定义了物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换),这一层的数据叫做比特。
集线器属于在这一层的设备,它仅仅是无脑的将电信号转发到所有出口(广播),不做任何处理。
由于通过集线器,数据包被发给了连接到集线器的所有设备上,那怎么确定数据包是发给哪一台设备的呢?所以需要一个全局唯一的名字作为每台设备的唯一标识,即MAC地址。MAC地址作为数据链路层中的定义,其源MAC和目标MAC作为头部结构被拼接在每一个数据包头部。这样每台终端设备就根据头部的目标 MAC 地址信息,判断这个数据包是不是发给自己的。若和自己的MAC地址一致,则收下该数据包,若不一致,则丢弃该数据包。
虽然集线器可以使线路布局简洁,但是由于其以广播的方式发送数据包,这样既不安全,也不节约网络资源。因此,需要一个更加智能的设备可以只将数据包发送给目标 MAC 地址指向的那台设备,这个设备就叫做交换机,其属于数据链路层。
主要协议、数据格式:802.3、802.5、FDDI、E1A/T1A、232、V.35、V.24
3 数据链路层
数据链路层,是OSI模型的第二层,要实现的就是MAC地址寻址,以找到帧要发送的目标物理终端设备。
物理层只是单纯负责把计算机连接起来,并且在计算机之间传输0,1这样的电信号。但是如果这些0,1组合的传送毫无规则的话,计算机是解读不了其中包含的数据的,因此,我们需要制定一套规则来进行0,1的传送。例如多少个电信号为一组,每一组信号应该如何标识才能让计算机读懂,于是有了以太网协议。以太网协议规定,一组电信号构成一帧。每一个桢由标头(Head)和数据(Data)两部分组成。帧的大小一般为 64 – 1518 个字节。假如需要传送的数据很大的话,就分成多个帧来进行传送。
帧就是定义在数据链路层的数据传输单元。每一帧中标头部分的字节固定为18个字节,用以存储源MAC和目标MAC,MAC地址由48位二进制数构成。
想要连入网络的每一台终端设备,都需要网卡的协助,而每一张网卡,在出厂时都会被烧录一个全球唯一的地址,这个地址就是上面提到的 MAC 地址。MAC地址作为一台终端设备的唯一标识,用以区分不同的终端设备,而终端设备之间的数据传送,就是通过 MAC 地址来唯一寻找、传送的。
在子网中的终端设备,通过交换机连接在一起,其内部维护一张MAC地址表,记录每一个MAC地址的设备连接在交换机哪一个端口。
这样,从源MAC地址设备发出的每一帧都先发送到交换机,交换机先读取每一帧的目标MAC,然后依据其内部维护的MAC地址表,找到目标MAC地址设备连接在哪个端口,然后将帧发送给目标MAC设备。以上这种传输方式是基于交换机的,这种通过交换机构成的小范围网络,叫做以太网。也就是互联网中的子网。
但是在最开始的时候,交换机中的MAC地址表是空的,因此,想要在交换机中逐步建立MAC地址表,需要利用ARP协议。
通过OSI模型第三层网络层的帮助,我们可以确定每台终端设备的IP地址与子网掩码,从而判断它们是否处于同一个子网之中。假如它们处于同一个子网之中,终端A要给终端B发送数据时,就可以先通过ARP协议来得到终端B的MAC地址。
ARP协议是通过广播的形式给同一个子网中的每台终端发送一个数据包,这个数据包会包含接收方的IP地址。当其他终端收到这个数据包后,会取出IP地址与自身对比,如果相同,则把自己的MAC地址回复给对方,否则就丢弃这个数据包。这样,同一个子网中的终端设备就可以知道其他终端设备的MAC地址了。其实在询问MAC地址的数据包中,在对方的MAC地址这一栏中,填的是一个特殊的MAC地址,其他终端看到这个特殊的MAC地址之后,就能知道这个广播的数据包想干嘛了。假如两台终端的IP不是处于同一个子网之中,这个时候,数据包就会被发送给网关,然后让网关进行转发传送。网关,是一个在网络层定义的概念,可以理解为它是每一个子网的门户,通过网关,就可以将许许多多的子网连接在一起,从而构成互联网。
在数据链路层,通过以太网协议,可以将从网络层接收到的数据包组合成可被物理层传输的帧,并按帧发送给物理层。帧是数据链路层中的数据单元,它不仅包括原始数据,还包括发送方和接受方的MAC地址以及相关纠错和控制信息。其中的地址确定了帧来自何处,将发到何处,而纠错和控制信息则确保帧无差错到达(也就是信息位和校验位)。如果在传送数据时。接收点检测到所传数据中有差错,就会通知发送方重发这一帧。
交换机处于数据链路层,内部维护MAC地址表,用于映射不同MAC地址与它的多个端口。
主要协议、数据格式:Frame Relay、HDLC、PPP、IEEE802.3/802.2、FDDL、ATM
4 网络层
互联网中的终端设备成千上万,交换机无法记录如此庞大的映射关系,也难以构建如此庞大的网络系统。
因此,在网络层中,出现了一个新的设备,即路由器。它的功能就是作为一台独立的拥有 MAC 地址的终端设备,可以将数据包做一次转发。
从上图可以看出,路由器在网络中起的作用就是作为子网的网关,其每一个端口,都有独立的MAC地址。
在网络层,需要理解子网这个概念。实际上我们所处的网络,是由无数个子网络构成的。广播的时候,也只有同一个子网里面的终端设备能够收到。假如没有子网这种划分的话,计算机 A 通过广播的方式发一个数据包给计算机 B , 其他所有计算机也都能收到这个数据包,然后进行对比再舍弃。世界上有那么多台计算机,每一台计算机都能收到其他所有计算机的数据包,那就不得了了,网络系统肯定会崩溃。
如何确定哪些 MAC 地址是属于同一个子网的呢?假如是同一个子网,那我们就可以用交换机将数据发送给目标MAC,如果不是同一个子网的,我们就会把数据发给网关,让网关进行转发。为了解决这个问题,于是有了IP协议。
IP协议,它所定义的地址,则称之为IP地址。IP协议有两种版本,一种是 IPv4,另一种是 IPv6。不过我们目前大多数用的还是 IPv4,现在也只讨论 IPv4 这个版本。这个版本的IP地址由 32 位的二进制数组成,一般把它分成4段的十进制表示,地址范围为0.0.0.0~255.255.255.255。每一台想要联网的计算机都会有一个IP地址。这个IP地址被分为两部分,前面一部分代表网络部分,后面一部分代表主机部分。并且网络部分和主机部分所占用的二进制位数是不固定的。而若两台计算机的网络部分是一模一样的,则称这两台计算机是处于同一个子网中。例如 192.168.43.1 和 192.168.43.2, 假如这两个 IP 地址的网络部分为 24 位,主机部分为 8 位,那么他们的网络部分都为 192.168.43,所以他们处于同一个子网中。
但是只从两台终端设备的IP地址,是无法判断它们是否处于同一个子网中的,因为网络部分和主机部分所占用的二进制位数是不固定的。这就引申出了另一个关键词————子网掩码。子网掩码和IP地址一样也是 32 位二进制数,不过它的网络部分规定全部为 1,主机部分规定全部为 0。也就是说,假如上面那两个IP地址的网络部分为 24 位,主机部分为 8 位的话,那他们的子网掩码都为 11111111.11111111.11111111.00000000,即255.255.255.0。所以只要知道子网掩码,就相当于知道网络部分是几位,主机部分是几位。故只需要把 IP 地址与它的子网掩码做与(and)运算,就可以得到其所在的子网。例如,192.168.43.1和192.168.43.2的子码掩码都为255.255.255.0,把IP与子码掩码相与,可以得到他们都为192.168.43.0,进而他们处于同一个子网中。
在网络层,通过IP协议,我们可以得到IP地址,子网掩码,子网,网关等相关概念,而在网络层之间的俩个设备的数据传输,除了加上数据链路层的头部之外,还要再增加一个网络层的头部,即用于包含源IP与目标IP。路由器作为网关,通过IP地址,可以找到目标设备所在的子网。在数据包到达子网之后,交换机通过MAC地址,可以找到具体的目标设备。因此,在网络层中传递的数据包应该包含两部分,即网络层头部+数据包,它们一起构成网络层的数据传输单元报文。
若A希望将数据包发送到C,当A通过子网掩码判断出自己与C不在同一个子网内,就会把自己的数据包发送给默认网关,让默认网关来进行转发。所以这就需要提前设置子网的默认网关。对 A 来说,A 只能直接把包发给同处于一个子网下的某个 IP 上,所以发给路由器还是发给某个电脑,对 A 来说也不关心,只要这个设备有个 IP 地址就行。所以默认网关,就是 A 在自己网卡配置的一个 IP 地址,以便在发给不同子网的设备时,发给这个 IP 地址。而在一般情况下,这个默认网关就是路由器。
然后当数据包从A发送到路由器之后,路由器又怎么知道,收到的这个数据包,该从自己的哪个端口出去,才能直接(或间接)地最终到达目的地 C 呢?
不要忘记路由器收到的报文包含目标 IP 地址,因此需要转化成从自己的哪个端口出去,很容易想到,应该有个表,就像 MAC 地址表一样,这个表就叫路由表。
路由表通过路由算法得到。而路由,就是指路由器通过路径选择算法,依据网络层IP协议定义的IP地址,进行逻辑地址(IP地址)寻址,解决使报文通过各网络节点传送的问题,实现在不同子网络之间的路径选择,为报文通过通信子网选择最适当的路径,最后将报文送到目的地。
路由器处于网络层,内部维护路由表,用于映射不同IP地址和它的多个端口。路由器的每一个端口都有独立的 MAC 地址与IP地址,且该IP地址就是对应子网的默认网关。
交换机中的MAC表指明了子网中设备的MAC地址与其每个端口的对应关系,而路由器中的路由表指明了互联网中子网IP地址与其每个端口的对应关系。
这样会存在一个问题,即设备A发送给设备C数据时,可能只知道设备C的IP地址,不知道设备C的MAC地址,这样当数据被路由器发送到设备C所在的子网时,其子网的交换机没办法通过MAC地址找到设备C。故我们还需要一张表可以记录IP地址与MAC地址的关系,这就是ARP缓存表。有了ARP缓存表,交换机就可以通过IP地址查表得到对应的MAC地址,从而将数据包发送到对应的设备上。
此时可以再次回顾一下ARP协议。在数据链路层,我们介绍过通过ARP可以得到每个设备的MAC地址。而这些MAC地址,其实就是缓存在每个设备的ARP缓存表中,表中记录着每个设备的 IP 与 MAC 地址的对应关系。
一开始的时候这个表是空的,设备 A 为了知道设备B(192.168.0.2)的 MAC 地址,将会广播一条 arp 请求,B收到请求后,带上自己的 MAC 地址给 A 一个响应。此时 A 便更新了自己的 arp 表。这样通过大家不断广播 arp 请求,最终所有设备里面都将 arp 缓存表更新完整。
再讨论一个问题,IP地址是由网络服务商分配的,每个终端设备的IP地址也有可能是动态的,那么该如何才能知道其他终端的IP地址呢?当我们想要访问某个网站的时候,我们可以输入IP来进行访问,但是绝大多数人是输入的网址域名。其实当输入网址域名时,DNS服务器会来帮助解析这个域名,其返回的解析值就是这个域名对应的IP地址。因此,网络层的功能就是让我们在茫茫互联网系统中,能够找到另一台计算机在哪里,是否属于同一个子网。
主要协议、数据格式:IP、IPX、Appletalk、DDP
5 前三层总结
电脑视角
- 首先我要知道我的 IP 以及对方的 IP
- 通过子网掩码判断我们是否在同一个子网
- 在同一个子网就通过 arp 获取对方 mac 地址直接扔出去
- 不在同一个子网就通过 arp 获取默认网关的 mac 地址直接扔出去
交换机视角
- 我收到的数据包必须有目标 MAC 地址
- 通过 MAC 地址表查映射关系
- 查到了就按照映射关系从我的指定端口发出去
- 查不到就所有端口都发出去
路由器视角
- 我收到的数据包必须有目标 IP 地址
- 通过路由表查映射关系
- 查到了就按照映射关系从我的指定端口发出去
- 查不到则返回一个路由不可达的数据包
网络层(IP协议)本身没有传输包的功能,包的实际传输是委托给数据链路层(以太网中的交换机)来实现的。
涉及到的三张表分别是:
- 交换机中有 MAC 地址表用于映射 MAC 地址和它的端口
- 路由器中有路由表用于映射 IP 地址(段)和它的端口
- 电脑和路由器中都有 arp 缓存表用于缓存 IP 和 MAC 地址的映射关系
这三张表是怎么来的:
- MAC 地址表是通过以太网内各节点之间不断通过交换机通信,不断完善起来的。
- 路由表是各种路由算法 + 人工配置逐步完善起来的。
- arp 缓存表是不断通过 arp 协议的请求逐步完善起来的。
6 简单的网络拓扑示例
目的:设备A发送数据包到设备F
路由器1的路由表:
详细过程文字描述:
1. 首先 A(192.168.0.1)通过子网掩码(255.255.255.0)计算出自己与 F(192.168.2.2)并不在同一个子网内,于是决定发送给默认网关(192.168.0.254)
2. A 通过 ARP 找到 默认网关 192.168.0.254 的 MAC 地址。
3. A 将源 MAC 地址(AAAA)与网关 MAC 地址(ABAB)封装在数据链路层头部,又将源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.2.2)(注意这里千万不要以为填写的是默认网关的 IP 地址,从始至终这个数据包的两个 IP 地址都是不变的,只有 MAC 地址在不断变化)封装在网络层头部,然后发包
4. 交换机 1 收到数据包后,发现目标 MAC 地址是 ABAB,转发给路由器1
5. 数据包来到了路由器 1,发现其目标 IP 地址是 192.168.2.2,查看其路由表,发现了下一跳的地址是 192.168.100.5
6. 所以此时路由器 1 需要做两件事,第一件是再次匹配路由表,发现匹配到了端口为 2,于是将其封装到数据链路层,最后把包从 2 号口发出去。
7. 此时路由器 2 收到了数据包,看到其目的地址是 192.168.2.2,查询其路由表,匹配到端口号为 1,准备从 1 号口把数据包送出去。
8. 但此时路由器 2 需要知道 192.168.2.2 的 MAC 地址了,于是查看其 arp 缓存,找到其 MAC 地址为 FFFF,将其封装在数据链路层头部,并从 1 号端口把包发出去。
9. 交换机 3 收到了数据包,发现目的 MAC 地址为 FFFF,查询其 MAC 地址表,发现应该从其 6 号端口出去,于是从 6 号端口把数据包发出去。
10. F 最终收到了数据包!并且发现目的 MAC 地址就是自己,于是收下了这个包。
前三层实现了设备外的数据传输(网卡—–>交换机—–>路由器—–>路由器—–>交换机—–>网卡)
后四层实现了设备内的数据传输(设备内部各个应用程序之间的信息传输)
7 传输层
OSI模型的第四层,是OSI中承上启下层。OSI模型下三层面向网络,确保信息准确传输;上三层面向用户主机,为用户提供各种服务。传输层与使用的网络无关。数据包一旦离开网卡即进入传输层。
通过物理层、数据链路层以及网络层,数据已经可以成功从终端A传送到终端B了,可是,终端B里面有各种各样的应用程序,该如何知道数据包具体交给哪个程序(进程)呢?为了解决这个问题,就需要用到端口(Port)。
端口号,定义于传输层,就是给每个进程分配的一个数字编号,用于将通信的进程区分开。因此在传输层,在要发送的数据包上,还需要增加传输层头部,即源端口号与目标端口号。
也就是说,数据在从终端A传给终端B的时候,还得指定一个端口,以供特定的应用程序来接受处理。所以类比于网络层的功能是建立主机到主机的通信,传输层的功能就是建立端口到端口的通信。只有有了IP地址和端口,数据才能准确通信。对于一些传输协议,已经设定了一些默认端口。例如,http的传输默认端口是80,这些端口信息也会包含在数据包里。
这样原本主机到主机的通信,升级为了进程和进程之间的通信。
实际上这就是 UDP 协议的实现!(当然 UDP 协议不光有源端口和目标端口,还有数据包长度和校验值)
同时,传输层也会通过传输协议进行数据流量控制,或基于接收方可接收数据的快慢程度规定适当的发送速率。例如,以太网不能传输超过1500个字节的数据包,对于长字节的数据,传输层将数据分割成较小的数据片,并且对分割后的片标上序号,进行排序,最终实现无差错传输。
主要协议、数据格式:TCP、UDP、SPX
8 会话层
OSI模型的第五层,该层功能是在网络中的两个节点之间建立和维持通信。具有自动收发包,自动寻址的功能。
主要协议、数据格式:RPC、SQL、NFS、AppleTalk、ASP
9 表示层
OSI模型的第六层,主要用于处理在两个通信系统中的交互信息的表示方式,将应用层处理的信息转换为适合网络传输的格式,或者将来自下一层的数据转换为上层能处理的格式。它包括数据的格式变换、数据加密与解密、数据压缩与恢复等功能。
主要协议、数据格式:TIFF、GIF、JPEG、ASCII、MPEG、MIDI、HIM
10 应用层
OSI模型的的第七层,其作为计算机用户,以及各种应用程序和网络之间的接口,它为OSI模型以外的应用程序提供服务,完成用户希望在网络上完成的各种工作。
在应用层可以收到传来的各种数据,这些数据的格式五花八门,有html格式的,有mp4格式的,各种各样。因此需要提前指定好这些数据的格式规则,以便收到后解读渲染。
主要协议、数据格式:FTP、NFS、SMTP、mail,HTTP、FTP、TFTP、SNMP、DNS、TELNET、HTTPS POP3、DHCP