目录
OSI 七层协议
OSI:即 Open System Interconnection,开放系统互连
OSI 七层网络模型是一个逻辑上的定义和规范:把网络从逻辑上分为了 7 层
OSI 七层模型是一种框架性的涉及方法,其最主要的功能就是帮助不同类型的主机实现数据传输。
OSI 七层模型划分如下:
OSI 是最初的大佬们仅仅是为了统一管理协议而提出的,并没有考虑到一些实用性和成本的问题,所以后面在实施过程中,太麻烦了,简化成了 5 层 ==》 TCP / IP 五层网络协议
TCP / IP 五层模型
TCP / IP 是一组协议的代名词,它里面包括了许多协议,组成了 TCP / IP 协议簇。
TCP / IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 应用层:负责应用程序间的沟通,如简单电子邮件传输(SMTP),文件传输协议(FTP),网络远程访问协议(Telnet)等等。我们的网络编程主要就是针对应用层。
- 传输层:负责两台主机之间的数据传输。如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。
- 网络层:负责地址管理和路由选择。例如在 IP 协议中,通过 IP 地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Rounter)工作在网络层。
- 数据链路层:负责设备之间的数据帧的传输和识别。例如网卡设备的驱动,帧同步(就是说从网线上检测到什么信号算作新帧的开始),冲突检测(如果检测到冲突就自动重发),数据差错校验等工作。有以太网,令牌环网,无线 LAN 等标准。交换机(Switch)工作在数据链路层。
- 物理层:负责光 / 电信号的传递方式。比如现在以太网通用的网线(双绞线),早期以太网采用的同轴电缆(现在主要用于有线电视),光纤,现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率,传数据率,抗干扰性等。集线器(Hub)工作在物理层。
简单来讲:
TCP / IP 的五层协议:
应用层:表示了传输的数据在应用程序中如何使用
传输层:关注的是通信的起点终点
网络层:关注的是通信中的路线规划
数据链路层:关注的是相邻节点之间的通信细节
物理层:网络通信的基础设施
因为物理层考虑的比较少,所有很多时候也可以称为 TCP / IP 四层模型。而且,虽然有五层,但是实际上,下面的四层都是在操作系统内核,硬件,驱动程序中就已经实现好了,即计算机内置已经实现了,我们程序要在网络编程过程中可以影响到的也就只有应用层了。
网络设备所在分层
对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,即是 TCP/IP 五层模型的下四层。
对于一台路由器,它实现了从网络层到物理层,即是 TCP/IP 的下三层。
对于一台交换机,它实现了从数据链路层到物理层,即是 TCP/IP 的下两层。
补充:注意我们这里说的路由器和交换机,都是传统意义上的路由器和交换机,也称为二层交换机(工作在 TCP/IP 五层模型的下两层),三层路由器(工作在 TCP/IP 五层模型的下三层)。随着现在网络设备技术的不断发展,也出现了很多 3 层或 4 层交换机,4 层路由器...我们以下所提到的网络设备都指的是传统意义上的交换机和路由器。
网络分层对应
网络数据传输时,经过不同的网络节点(主机,路由器)时,网络分层需要对应。以下为同一个网段内的两台主机进行文件传输:
两台计算机通过 TCP/IP 协议通讯的过程如下所示:
此处可以再理解以下:上层协议调用下层协议的功能,下层协议给上层协议提供服务。
跨网段的主机进行文件传输:数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器
封装和分用(网络传输数据过程中,最核心的流程)
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(datagram),在数据链路层叫做帧(frame)。
应用层数据通过协议栈发到网络上的时候,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。
首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等等信息。
数据封装成帧后发到传输介质上,到达目的主机之后,每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据提交给对应的上层协议处理。
下面为数据封装的大概流程:
下面是数据分用的大概流程:
用一个具体例子来梳理以下封装和分用的过程
封装
A 要通过 QQ 给 B 发送一个 hello
1. 应用层(应用程序) -- QQ
QQ 从消息输入框获取到用户输入的 hello,就要把这个字符串构造成一个应用层的数据包,QQ 这样的程序内部就设置了一个应用层协议,应用层数据包就是按照这个应用层协议约定的格式(字符串拼接)来构造的。(应用层协议,往往是实现这个程序的程序员,自己定义的~~)。
假设约定格式如下:
应用程序就会调用操作系统提供的 API,把这个数据包交给传输层。
2. 传输层
传输层就会把上述数据作为一个整体,再构成一个传输层的数据包。(传输层涉及到的协议,最主要的就是 TCP 和 UDP)
此处假定是使用 UDP 来进行通信,就会构成一个 UDP 的数据包
形如上述,添加报头的过程,就叫做“封装”,其实就是字符串拼接~~ 只不过拼的是包头,具有一定的结构,将上一层传下来的数据叫做“载荷”。
UDP 报头,虽然不能保护数据,但是可以起到寄快递的时候“贴标签”的类似效果,可以承载一些关键的用来转发数据的信息。 对于 UDP 报头来说,承载的最重要的信息就是 源端口 和 目的端口。
拼好传输层数据包之后,就要把这个数据包进一步的交给下一层了,网络层继续进行封装。(交给下层,指的是,下层协议提供一组 API(函数),上层调用这个 API,并且把刚才构造好的数据通过参数传过去,下层协议就可以来处理这个数据了)
3. 网络层
在网络层中涉及到的最核心的协议 -- IP 协议
网络层 IP 协议,把刚才的传输层的 UDP 数据包作为一个整体,再拼上 IP 协议的报头,构成一个 IP 数据包。
IP 协议中,相当于是把整个 UDP 数据包视为是一个整体了。
IP 报头中,也会包含一些辅助转发的关键信息,此处最关键的信息就是源 IP 和目的 IP 了。
(将完整的 IP 数据包构造完成之后,IP 协议继续调用数据链路层的 API,把数据再交给数据链路层中的协议进行处理)
4. 数据链路层
数据链路层这里涉及到的核心协议 -- 以太网(此处的“以太”用来表示网络数据传输的介质)
以太网就是我们日常最常见到的有线网络。我们日常所用到的网线,也叫做“以太网线”,日常用到的网口也叫做“以太网口”,用到的交换机,也叫做“以太网交换机”。
这样的数据还要继续往下走,交给物理层
5. 物理层
物理层中涉及到的都是硬件设备。把上述这样的以太网数据帧,二进制结构(一串 0 1 0 1 这样的数据),转换成光信号(光纤,通过光的频谱进行编码)/ 电信号(网线,高低电平表示) / 电磁波(无线 wifi 不同波谱进行编码)然后进行发送
经过上述一系列的操作,数据终于从我们的电脑上发送出去了!!!(才出家门~~~)
暂时不考虑中间的过程,假定数据包已经到达 B 的网卡了,B 对数据包的处理过程,就称为“分用”。
分用
1. 物理层
B 的物理层收到了光信号 / 电信号 / 电磁波,就会把这些物理信号转换成数字信号(二进制的 0 1 0 1),得到一个以太网数据帧,进一步的把这个数据帧交给数据链路层处理。
2. 数据链路层
在数据链路层中,按照以太网数据帧的格式来对数据包进行解析,取出其中的载荷,再交给上层的协议。
3. 网络层 IP 协议
按照 IP 协议的格式进行解析,取出其中的载荷,再交给上层协议
4. 传输层 UDP 协议
按照 UDP 协议的格式进行解析,取出其中的载荷,再交给上层协议
5. 应用层 -- QQ 应用程序
按照 QQ 应用程序内部的应用协议格式来解析数据
分用的过程,就是封装的逆向过程。
现实情况下的数据交换
真实情况下,两个主机不太会是会通过网线直连的,而是通过一系列的交换机或者路由器来进行数据转发的~~~
上述主机 A 和 主机 B 之间就存在了一系列的交换机和路由器来进行数据转发,上述的每个节点都要涉及到封装和分用。
但是,实际上,即使是经过交换着或者路由器,上述的封装分用过程,也是同样适用的!!!只不过,封装分用的程度可能就不一定是到应用层了。
经典的交换机来说,就只需要封装分用到数据链路层即可。经典的路由器来说,就只需要封装分用到网络层即可。
假设其中有一个节点是交换机,交换机就会把物理层的光电信号,转换成以太网数据帧二进制数据,交给数据链路层
交换机的数据链路层就会对上述数据进行解析,这个解析过程,一方面要取出载荷部分,另一方面,就要解析到帧头中的关键信息。根据帧头中的信息,决定下一步把数据往哪里进行发送,根据这个情况再进一步的构造出新的以太网数据帧。
再把这个新的数据继续通过物理层发送出去~~
假设其中的另一个节点是路由器,情况稍微复杂一点点,要封装分用到网络层,先是物理层拿到光电信号,转成二进制数据交给数据链路层
数据链路层对上述数据进行解析,拿到载荷,交给网络层(IP 协议),IP 协议又会进一步的对这个数据进行解析,取出载荷,当然也要解析这里的报头(路由器需要通过 IP 报头中的目的 IP 来知道具体接下来如何转发~~)
取出的数据,IP 协议重新进行封装
继续交给数据链路层,继续加上帧头和帧尾
这个数据再交给物理层,转成物理信号,继续传输~~~
上述的过程,都是经典的交换机和路由器的大概传输过程,如果现实中的情况可能就会更加复杂,比如,交换机要截取/ 解析所传的数据,就会封装到应用层,把我们的 hello 拿出来看看~~~
(因此,网络传输数据,并非是一个非常简单的事情,背后有大量的工作,只不过这些工作都是硬件 & 驱动 & 操作系统帮我们完成的)
补充:
描述一个网络上传输的数据“单位”,可能会用到这几个术语,但我们并不是搞科研或者写论文,不需要深究其区别,使用的时候也会混用。
一般情况下:
包(packet) IP 数据包
段(segment)TCP 数据段
报(datagram)UDP 数据报
帧(frame)以太网数据帧