文章目录
- 网络初识
- 网络中的重要概念
- IP地址
- 端口号
- 认识协议(最核心概念)
- OSI七层模型
- TCP/IP五层(或四层)网络模型
- 网络设备所在分层
- 封装和分用
网络初识
网络中的重要概念
网络互联的目的是进行网络通信,也是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据.
那么,在组建网络的过程中,如何判断到底是从哪台主机,将数据传输到哪台主机呢?这就需要使用IP地址来标识.
IP地址
IP地址主要用于标识网络主机,其他网络设备(如路由器)的网络地址,简单说,IP地址用于定位主机的网络地址.
IP地址是一个32位的二进制数,通常被分割为个"8位二进制数"(也就是4个字节).
通常用"点分十进制"的方式来表示,即a.b.c.d的形式(a,b,c,d都是0-255之间的十进制整数)
端口号
在网络通信中,IP地址用于标识网络地址,端口号可以标识主机中发送数据,接收数据的进程.
简单说:端口号用于定位主机中的进程
端口号是一个0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据.
虽然是0~65535这样的范围,但是实际上0~1023这些端口,都是有一些特定含义的.咱们自己写代码使用的端口,一般都是用剩下的.
有了IP地址和端口号,可以定位到网络中唯一的一个进程,但是还存在一个问题,网络通信是基于二进制0/1数据来传输,如何告诉对方发送的数据是什么样的呢?
网络通信传输的数据类型可能有多种:图片,视频,文本等等.同一个类型的数据,格式可能也不同,如发送一个文本字符串"你好!".那么如何标识发送的数据是文本类型,及文本的编码格式呢??
基于网络传输,需要使用协议来规定双方的数据格式.
认识协议(最核心概念)
协议是指各方之间达成的共同约定或规定的规则和规范。在计算机领域,协议是指计算机系统、设备或应用程序之间进行通信和交互所使用的规定格式、语法和行为。协议可以规定数据的传输方式、通信的语言和格式、消息的编码和解码方式等,确保各方能够理解和正确处理通信中的数据和指令。
协议最终体现为在网络上传输的数据包的格式.
为什么需要协议?
因为计算机之间的传播媒介是光信号和电信号.通过"频率"和"强弱"来表示0和1这样的信息.想要传递不同的信息,就需要约定好双方的数据格式.
- 计算机生产厂商有很多
- 计算机操作系统,也有很多
- 计算机网络硬件设备,还是有很多
如何让这些不同厂商之间生产的计算机能够相互顺畅的通信?
就需要有人站出来,约定一个共同的标准.大家都来遵守,这就是网络协议.
由于网络通信是一件非常复杂的事情.
如果使用一个协议,约定所有的网络通信细节,那么就会导致这个协议非常庞大,非常复杂.
于是我们把一个大的协议,拆分成多个小的协议,让每一个小的协议,专注于解决一个/一类问题,再让这些协议相互配合来完成通信.
这一拆,拆出来很多协议,为了更好的把这些协议组织起来,我们就对这些协议进行了分层(把功能定位类似的协议,放到同一层里,并且约定好层和层之间的交互关系)
我们约定,协议之间不能随意相互交互,只能是相邻的层之间才可以.
上层协议调用下层协议,下层协议给上层提供服务.
分层最大的好处,类似于面向接口编程:定义好两层之间的接口规范,让双方遵循这个规范来对接.
在代码中,类似于定义好一个接口,一方为实现接口的实现类(提供方,提供服务),一方为接口的使用类(使用方,使用服务):
- 对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可.
- 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可.
协议分层降低了整个体系的耦合性,我们可以灵活的变更某个层次的协议.
这样便于更好的扩展和维护~
OSI七层模型
OSI:即Open System Interconnection,开放系统互联.
- OSI七层网络模型是一个逻辑上的定义和规范,它把网络从逻辑上分为了7层.
- OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输.
由于OSI七层模型既复杂又不实用,所以OSI七层模型没有落地,实现.
实际组建网络时,只是以OSI七层模型设计中的部分分层,也是以下TCP/IP五层(或四层)模型来实现.
TCP/IP五层(或四层)网络模型
这里的五层都是啥,都是啥作用,一定要记住!!(背下来)
TCP/IP是一组协议的代名词,他还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通信协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
- 应用层:负责应用程序间的沟通,如简单电子邮件传输(SMTP),文件传输协议(FTP),网络远程访问协议(Telnet)等.我们的网络编程主要就是针对应用层.
- 传输层:负责两台主机之间的数据传输.如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机.
- 网络层:负责地址管理和路由选择.例如在IP协议中,通过IP地址来标识一台主机,并通过路由表示的方式规划出两台主机之间的数据传输的线路(路由).路由器工作在网络层.
- 数据链路层:负责设备之间的数据帧的传送和识别.例如网卡设备的驱动,帧同步(就是说从网线上检测到什么信号算作新帧的开始),冲突检测(如果检测到冲突就自动重发),数据差校验等工作.有以太网,令牌环网,无线LAN等标准.交换机(Switch)工作在数据链路层.
- 物理层:负责光/电信号的传输方式.比如现在以太网通用的网线(双绞线),早期以太网采用的同轴电缆,光纤,现在的wifi无线网络使用电磁波等都属于物理层的概念.物理层的能力决定了最大传输速率,传输距离,抗干扰等.集线器(Hub)工作在物理层.
也可以看图~
物理层我们考虑的比较少.因此很多时候也可以称为TCP/IP四层模型.
TCP/IP中把表示层和会话层融合到一起了.
网络设备所在分层
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即使TCP/IP五层模型的下四层.
- 对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层.
- 对于一台交换机,它实现了从数据链路层 到物理层,也即是TCP/IP五层模型的下两层.
- 对于集线器,它只实现了物理层.
以上的说法都是站在经典的模型上讨论的.如果在笔试中遇到了选择题/填空题,就照着上面写~
真实情况下,交换机,也可能是工作在网络层,甚至是传输层/应用层;路由器,也可能是工作中数据链路层,也可能是传输层,也可能是应用层~
封装和分用
数据在网络通信中的整体流程,涉及到了两个名词,分别叫做封装和分用.
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame).这几个术语,严格来说是有区别的,但是平时日常交流的时候,就不会刻意区分~
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部,称为封装.
- 首部信息中包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息.
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的"上层协议字段"将数据交给对应的上层协议处理.
下图为数据封装的过程
下图为数据分用的过程
光说概念可能不太好理解.
举个例子~
我现在要通过QQ,发送一个hello给另一个人.
[站在发送方的视角]
-
用户在输入框中输入"hello"字符串,点击发送按钮.
QQ这样的程序就会把hello这个内容从输入框中读取到,并构造成一个"应用层数据包".应用层的网络协议就描述了这个数据包的构造.这里的应用层协议,往往是开发QQ的程序员自行定义的.
如果是我来开发QQ,我可能会按照下列的方式来定义这个应用层数据包的结构(定义方式有很多种).由于网络上传输的数据都是"二进制"的字符串,所以我们要能够约定好一个类似于分隔符这样的机制,用来划分不同的内容(下文的使用 ; 来表示).
数据包格式: 发送者的QQ号;接受者的QQ号;发送时间;消息的正文\n
数据包样例: 123456789;987654321;2024-08-05 12:00:00;hello\n进行网络传输数据,通常需要把一个"结构化"的数据,转成一个二进制字符串.
- 把 结构化数据 转换成 二进制字符串 这个过程称为序列化.
- 把 二进制字符串 转换成 结构化数据 这个过程称为反序列化.
-
QQ 这样的应用程序就会调用操作系统提供的API(传输层给应用层提供的API)
操作系统会提供一个类似于"发送数据"这样的API,然后应用程序就会把上述组织好的应用层数据包,作为参数传进来,于是应用层数据包就到了系统内核里了,就进入到传输层的代码部分了.
此时,传输层这里,就会把上述的应用层数据,再进一步的封装成一个传输层数据包.计算机网络中的封装其实就是字符串拼接~
由于传输层有多种协议(其中最主要的是这两个,TCP和UDP)
此处假设使用的是UDP协议~
UDP报头里就包含了一些UDP相关的信息,比如包含发送者的端口号和接受者的端口号.
-
传输层构造好之后,就会继续调用网络层提供给传输层的api,把数据进一步交给网络层了.
由于传输层和网络层都是系统内核里面实现好的,上述的调用过程,我们无需关心,也感知不到~
IP协议,就会把上述拿到的传输层数据包构造成网络层数据包.(再次进行字符串拼接,拼接上IP报头)
IP报头里会包含很多信息,这里主要的信息,发送方的IP地址,和接收方的IP地址.
-
网络层继续调用数据链路层的api,把数据交给数据链路层处理,数据链路层的常见协议:以太网(平时插网线,进行上网的这种方式)
在IP数据包的基础上再进一步进行包装
-
上述得到的数据,需要进一步交给物理层(硬件设备)
网卡就会针对上述的二进制数据,进行真正的传输操作,就需要把上述 0101 这样的序列,转换为 光信号/电信号/电磁波…
[接收方视角]
此处接收方做的工作,其实就是发送方的工作的"逆序工作".
发送方的封装,可以认为是"打包快递".
接收方的分用,可以认为是"拆快递".
-
接收方物理层收到光信号,把这样的光信号还原成 010101 这样的二进制字符串.
-
物理层转换回来的数据,交给数据链路层.
以太网拿到这个数据包,就会对这个数据包进行解析.拿出这里的报头和载荷,根据报头中的信息,做一些处理.
根据报头信息决定这个数据包是丢弃还是转发,还是自己保留(向上进行解析)
-
网络层拿到了上述解析好的数据.
IP协议,也要对这个数据包进行解析,取出IP报头和载荷.这里也是需要根据报头中的信息确认,是丢弃,转发,还是保留(给上层协议)
-
传输层这边,UDP协议也要针对数据进行解析了.
取出UDP报头和载荷.根据报头判断是丢弃还是保留(给上层协议).
如果保留,那么就会把载荷这里的内容进一步交给应用层协议(应用程序).
由于应用程序有很多,那么这里的内容该交给那个程序处理呢?
UDP报头中会包含"端口号",可以根据端口号来找到对应的进程进行处理. -
到这里,数据就到了QQ这样的应用程序这里了.
QQ就要针对上述数据进行"反序列化",并针对反序列化后的数据进行进一步的逻辑.- 把收到的消息,显示到界面上
- 播放"滴滴滴"这样的声音,提醒收到消息
- 显示弹窗提示收到消息
- 更新未读消息的列表
- …
[数据转发过程]
中间过程的交换机和路由器,也会涉及到封装和分用.(这里谈到的都是经典的,教科书上的交换机)
交换机封装分用到数据链路层,就可决定数据是要丢弃,还是要继续转发了,不继续分用.
路由器,封装分用到网络层,就可以决定数据是要丢弃,还是要继续转发了,也不再继续分用.
封装分用这么麻烦,那会不会导致交换机,路由器,主机的通信的过程效率很低呢?
如果拿网络通信和人的反应时间去比,那速度还是很快的.
如果拿网络通信和读写硬盘来比,通常确实认为,网络的速度比硬盘的速度更慢,更不必说与内存比了~
本文到这里就结束啦~