网络初识
网络中的告急概念
网络互联的目的是举行网络通信,也是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据.
那么,在组建网络的过程中,如何判断到底是从哪台主机,将数据传输到哪台主机呢?这就需要利用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就要针对上述数据举行"反序列化",并针对反序列化后的数据举行进一步的逻辑.
- 把收到的消息,显示到界面上
- 播放"滴滴滴"这样的声音,提醒收到消息
- 显示弹窗提示收到消息
- 更新未读消息的列表
- …
[数据转发过程]
中间过程的交换机和路由器,也会涉及到封装和分用.(这里谈到的都是经典的,教科书上的交换机)
交换机封装分用到数据链路层,就可决定数据是要抛弃,还是要继续转发了,不继续分用.
路由器,封装分用到网络层,就可以决定数据是要抛弃,还是要继续转发了,也不再继续分用.
封装分用这么贫苦,那会不会导致交换机,路由器,主机的通信的过程效率很低呢?
如果拿网络通信和人的反应时间去比,那速度还是很快的.
如果拿网络通信和读写硬盘来比,通常确实认为,网络的速度比硬盘的速度更慢,更不必说与内存比了~
本文到这里就竣事啦~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |