Linux篇第十七篇——网络基础(概念+协议的认识+OSI七层模型+TCP/IP五层模型+网络传输的流程)

Posted 呆呆兽学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux篇第十七篇——网络基础(概念+协议的认识+OSI七层模型+TCP/IP五层模型+网络传输的流程)相关的知识,希望对你有一定的参考价值。

⭐️ 本篇博客开始要给大家介绍网络相关的内容了,本篇博客介绍的是网络中比较基础的一些知识,能够帮助大家认识网络

目录


🌏网络的发展

网络的发展有下面几个阶段:

  • 独立模式: 计算机最开始是以单机模式被广泛使用的。每一台计算机都是独立的,之间不能够进行数据共享与通信

  • 网络互联: 计算机之间可以链接在一起,完成数据共享,计算机之间还可以进行相互通信

  • 局域网(LAN): 一片区域内的计算机通过路由器和交换机连接在一起,可以用来相互通信的计算机数量增多

  • 广域网(WAN): 多个局域网通过路由器连接起来,构成一个广域网,也可以说是一个更大的局域网

    “广域网”和“局域网”是一个相对的概念,例如:一座城市的网络的网络布局可以说是城域网,从大的方面讲,城市里面有许许多多的局域网,构成了这个大的广域网,对于一个国家的网络而言,整个国家的网络可以看作是由许许多多的城市的局域网构成的一个更大的广域网,而每一个城市的网络就看作是一个局域网。同样地,这个国家的网络也可以看作是一个更大的局域网。

🌏协议

🌲认识“协议”

协议就是一种 “约定”。它是多方协商出来的一种通信方案,达成一种“共识”。双方想要进行通信,就需要按照双方事先都知道的约定进行通信。例如:两方之间发送电报,事先约定了0代表收到,1代表发起进攻等,这个约定是两方都知道的。
协议的好处:

  • 统一标准,通信双方能够通过某种标识把数据识别出来
  • 提高通信的效率和可靠性

计算机之间想要传递各种不同的信息,就需要约定好双方的数据格式。

🌲协议分层

整个网络协议栈被分成层状结构的一个个的小模块,具体到实例有OSI七层参考模型TCP/IP五层模型
协议分层的好处:

  • 每一层做不同的工作,下一层为上一层提供特定的服务,同一层之间交互使用相同的“协议”
  • 同一层之间进行交互会使用下一层提供的服务(接口服务),且不会关心下一层的实现细节,层与层之间通过接口实现通信,实现了“解耦”

举例: 两个人在打电话,都是用汉语进行交流,表面上看是两人直接进行通信。仔细思考会发现,在人通信层的下一层在为两人通信提供服务,电话层与对端的电话层通过电话协议进行通信,电话层需要将人说话的声音进行处理,转为电信号,然后发送给对端的电话层,对端的电话层收到电信号之后进行处理,转为人的声音,这样,对端的人就听到的是人的声音。两个人通信的时候是不会关心下一层服务细节,就可以直接进行通信。

协议分层的本质: 实现了软件工程上的解耦,层与层直接只有接口相互接口调用关系

🌲OSI七层模型

OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,
是一个逻辑上的定义和规范

  • 把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机
  • OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输
  • 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯

🌲TCP/IP五层(或四层)模型

OSI七层模型既复杂又不使用,所以就有了TCP/IP五层(或四层)模型。TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。物理层有时候不做讨论,所以有时候也叫四层模型。

  • 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub,加强信号,让数据传的更远)工作在物理层.
  • 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
  • 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
  • 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
  • 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层

图解:

可以看出的是,OS贯穿整个网络协议栈,协议栈是网络标准组织定义的,所有的OS(Windows.Linux和MacOs等)都是支持的。数据通信的本质就是两个协议栈之间进行通信
总结:

  • 应用层解决的传输数据的目的,根据特定的通信目的,进行数据分析与处理,达到某种业务性的目的
  • 传输层和网络层处理数据传输遇到的问题,保证数据的可靠性
  • 数据链路层和物理层负责数据真正发送的过程,完成以太网和局域网的通信
  • 下三成处理的是通信细节,应用层处理的是业务细节

一般而言

  • 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容
  • 对于一台路由器, 它实现了从网络层到物理层(有些可到应用层)
  • 对于一台交换机, 它实现了从数据链路层到物理层
  • 对于集线器, 它只实现了物理层
    但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发)

🌏网络传输的基本流程

🌲数据的封装和分用

  • 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame),应用层叫做请求和响应
  • 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
  • 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
  • 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 “上层协议字段” 将数据交给对应的上层协议处理

思考几个问题:

  1. 每一协议层的数据包是什么?

数据包=报头+有效载荷

  1. 协议的共性是什么?

几乎所有的协议都需要解决两个问题:
1.如何将数据包中的报头有效载荷分离的问题,这个过程叫做解包
2.自底向上,要确认自己的有效载荷交付给上层的那个协议,这个过程叫做分用

  1. 如何解决将数据包中的报头和有效载荷分离的问题?

通常有两种方法:
1.定长报头。报头的长度是确定的,这样就可以实现二者分离。
2.自定义描述符字段。报头中添加一个字段,表示报头的长度。

数据封装的过程:

数据分用的过程:

🌲局域网通信

局域网内的主机是通过路由器和交换机连接在一起的,局域网内的两台主机通信本质就是两个协议栈之间在进行通信,下面是两台主机通过TCP/IP协议进行文件传输的过程:

数据在自身协议栈自顶向下进行封装:

  • 数据包交给应用层,应用层添加上对应的应用层协议报头,然后把整个数据包向下交付给传输层
  • 传输层再添加上对应的传输层协议报头,然后把整个数据包向下交付给网络层
  • 网络层再添加上对应的网络层协议报头,然后把整个数据包向下交付给数据链路层
  • 数据链路层再添加上对应的数据链路层协议报头,然后把整个数据包通过网络交付给对端数据链路层

数据在对端协议栈自底向上进行分用:

  • 数据链路层将数据包的报头和有效载荷进行解包分离,然后将有效载荷交付给上层的网络层
  • 网络层将数据包的报头和有效载荷进行解包分离,然后将有效载荷交付给上层的传输层
  • 传输层将数据包的报头和有效载荷进行解包分离,然后将有效载荷交付给上层的应用层
  • 应用层将数据包的报头和有效载荷进行解包分离,将最后的数据进行相关处理然后交付给用户

思考几个问题:

  1. 局域网中,所有的主机可以直接通信,它们是如何确定数据是发给哪一台主机,目标主机又是如何确认数据是发给自己的?

在数据链路层,有一个MAC地址(48位),网卡硬件地址或者序列号,是全球唯一的,用来标识主机的唯一性。每一台主机都要一个MAC地址,且都知道,发送方将数据发出去,这个数据里面包含目标主机的MAC地址信息,每个主机都可以收到这一份数据,且用自己的MAC地址与数据中的目标主机MAC地址进行比较,如果不同,表明该数据不是发给自己的,就将数据丢掉,相同就表明该数据是发给自己的,就收下。

  1. 局域网中,如何将数据发送给所有主机?

主机发送数据是,将MAC地址设置为一个广播地址,这样所有的主机都认为这个数据是发给自己的

  1. 局域网通信原理

局域网中,有多台主机直接通信,有可能会发生数据碰撞,这样就会影响其它主机间的通信,所以一个局域网可以看作是一个碰撞域
碰撞后的数据就是垃圾数据量,局域网中的所有主机都可以收到发出去的数据,包括发数据的主机本身也是如此,该主机会将收到的数据和此前发出去的数据进行对比,如果不同,代表此前发出去的数据发生了碰撞,这就是碰撞检测
数据发生碰撞后,发送方不会立即将数据进行重写发送,而是等一段数据,在重新发生,这就是碰撞避免算法,也是碰撞避免的一种机制
所以说,局域网的数据通信时在一个碰撞域中不断地碰撞,然后进行碰撞检测,碰撞避免。
局域网通信的本质就是基于碰撞域、碰撞检测和碰见避免实现通信,局域网内主机越多,碰撞几率越多,交换机在局域网中的作用就是划分碰撞域,解决碰撞问题,降低碰撞几率

🌲跨网络通信

跨网络通信就是分别处于不同局域网的两台主机之间进行通信,根据前面的知识我们可以知道,两个局域网之间是通过路由器进行通信的,所以这两台主机进行通信要经过至少一台路由器,更多的时候是多台路由器,下面是跨网段的两台主机的文件传输,中间会经过很多台路由器,下面的过程只经过一台路由器:

可以看到的是,这里的通信比局域网内通信多了一个封装和分用的过程,数据封装完毕不是把数据包直接通过网络交付给对端的数据链路层,而是交付给路由器,这是为什么呢?

路由器横跨两个局域网,两个局域网负责设备之间的数据帧传送的网络协议可能是不同的,有以太网、令牌环网和无限LAN等通信协议标准。在上面的图片中显示,一个局域网使用的是以太网协议标准,两一个局域网使用的是令牌环网,双方的标准有差异不能够直接通信,所以就需要有中间媒介处理进行处理,这个媒介就是路由器。前面说过了,路由器是从网络层到物理层,所以数据封装完毕会把数据包交付给路由器,最后一次封装会添加路由器的mac帧(这样局域网内的主机就可以找到对应的那一台路由器,局域网的主机都认为路由器是自己所在局域网的一台主机)。
路由器处于数据链路层的以太网驱动会把数据包中的以太网协议(路由器mac帧)报头去掉,将剩下的有效载荷交付给路由器的网络层,路由器根据目的IP地址,查询路由表进行路由转发,然后将数据包进行向下交付给令牌环网的驱动程序,它会给数据添加上对端的令牌环网协议报头信息,最后将数据包传送给对端协议栈的数据链路层

数据包在路由器中不断调整mac帧协议报头,也就是,数据包的源mac地址和目的mac地址是在不断变化的,但是源IP和目的IP是不变的。可以看到的是IP层往上的数据报头信息是不变的,变的是IP层往下的协议报头信息,这就体现了IP层协议的好处:

通过IP地址虚拟化了底层协议的差异,这样就不需要关心底层使用的是那种通信协议,只要有源IP地址和目的IP地址就可以将数据转发出去

🌏网络中的地址管理

🌲认识IP地址

IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4

  • IP地址是在IP协议中, 用来标识网络中不同主机的地址;
  • 对于IPv4来说, IP地址是一个4字节, 32位的整数;
  • 我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
  • IP地址可以由人手动静态分配,也可以让路由器来动态分配

🌲认识MAC地址

  • MAC地址用来识别数据链路层中相连的节点;
  • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
  • 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)

🌲通过指令查看IP和MAC

通过ifconfig 可以查看主机的网络信息

🌐总结

网络基础的部分就先介绍到这里了,这里都是点到为止,没有过多地介绍细节,更多协议的细节后面还会逐一介绍,喜欢的话欢迎点赞、收藏和关注~

以上是关于Linux篇第十七篇——网络基础(概念+协议的认识+OSI七层模型+TCP/IP五层模型+网络传输的流程)的主要内容,如果未能解决你的问题,请参考以下文章

Linux篇第十七篇——网络基础(概念+协议的认识+OSI七层模型+TCP/IP五层模型+网络传输的流程)

Linux从青铜到王者第十七篇:Linux网络基础第二篇之UDP协议

java基础第十七篇之网络编程和装饰者模式

Python之路(第十七篇)logging模块

Linux篇第十三篇——多线程(线程概念+线程控制)

Linux篇第十三篇——多线程(线程概念+线程控制)