• 【Linux】网络原理


    📖 前言

    本章开始我们进入Linux网络编程阶段的学习,本章我们将来认识一下网络,学习一下网络原理。
    对网络整体有个大概的认识,要了解网络传输数据的基本流程,并了解封装和解包的过程,目标已经明确,搬好板凳准备开讲了……


    1. 计算机内部的交流

    计算机内部有很多设备,那么设备和设备之间的交流是通过什么方式呢?在设备和设备间一定要有“线”连接起来。

    这样,这些硬件之间,设备与设备之间才能进行通信,如数据总线,地址总线等…

    此时设备与设备之间就被用物理上的线连接起来了,那么就可以通过这些线来进行设备间的通信。

    计算机内部的交互主要是通过总线系统实现的,包括数据交互、地址寻址、控制信号传递、中断处理以及与外部设备的连接等。这些交互过程协同工作,使得计算机能够完成各种任务和操作。

    1.1 计算机之间的交流:

    网络互联:多台计算机连接在一起,完成数据共享。

    要想多台计算机之间进行交流,就要将多台计算机通过线连接起来。

    网络的本质:就是因为线变长了!

    • 主机内,“线” 比较短
      • 存在信号干扰的问题。
    • 跨主机,“线” 比较长
      • 线长了就会有各种各样的问题:可靠性、寻找方式、效率问题等等。

    体系结构上有网络,络也可以构建体系结构。
    也可以使用多主机互相联通,构建宏观的冯诺依曼(集群)。

    两台主机之间的通信本质上可以理解成体系结构的延展,也是通过线连起来的。
    体系内能通信,体系外也能通信。


    2. 协议

    协议是一种约定:

    • 例如每个地方都有各自的方言,人们可以用方言这种协议,来进行交流。
    • 计算机生产厂商有很多,计算机操作系统也有很多,同样的计算机网络硬件设备,还是有很多。
    • 那么让这些不同厂商之间生产的计算机能够相互顺畅的通信,就需要约定一个共同的标准。
    • 这个约定大家都来遵守,这就是网络协议

    2.1 网络分层:

    在我们之前的学习中,我们知道软件是可以分层的,例如进程地址空间就是一层软件层。

    为什么要分层?分层的优势:

    1. 软件在分层的同时,也把问题归类了。
    2. 分层的本质:软件上解耦。
    3. 便于工程师进行软件维护。

    网络的分层结构是由软件的分层来决定的。网络本身的代码,就是层状结构!同层之间,一定都要有自己的协议!

    这样做的好处:

    • 层状结构下的网络协议,我们认为,同层协议,都可以认为自己在和对方直接通信,忽略底层细节。
    • 正是因为软件采用了分层结构的设计理念,网络才得以采用类似的分层结构。
    • 不同设备采用不同的协议,才能整体的保证网络系统完善。

    为什么同层之间,一定都要有自己的协议:

    • 同一层之间需要有自己的协议是为了分离功能、定义接口、提高兼容性和互操作性,并且实现灵活性和可扩展性。
    • 每个层次内部的协议确保了同层设备或系统按照统一的规范进行通信,使得整个网络能够协同工作并实现高效可靠的通信。
    • 每一层添加协议是为了实现该层所需的功能和任务,并确保各个层之间的有效通信。

    2.2 以打电话为例:

    当两个人用座机打电话交流时,他们只会认为自己是和对方直接通信, 而不会认为自己是和座机电话在交流。

    可以把系统理分成三层,分别是:人与人之间的语言沟通协议,座机与座机之间的数据交互协议,以及最底层的信号传输通信协议。

    • 用户关心的是使用什么语言与对方进行交流。
    • 电话主要职责是将声音转换成电信号,并通过通信协议进行传输。
    • 底层硬件只负责传输信号,确保数据能够准确地传递到目的地。

    不同层次的设备可以将自己视为直接与对方进行交流,而不必关心其他层使用的具体协议。每个层次的设备都有自己的功能和责任,只需确保将数据传递给上一层或下一层即可。

    这样做的好处:

    • 这种分层的设计使得网络通信更加灵活和可靠,各层之间可以独立运作,互不干扰。
    • 因此,无论在何种场景下,设备只需关注与相邻层设备的接口和交互,而不需要过多关注其他层使用的是什么协议。

    2.3 OSI七层模型:

    在这里插入图片描述

    OSI(Open Systems Interconnection)是一个通信系统互联协议的参考模型,由国际标准化组织(ISO)在20世纪80年代提出。该模型将计算机网络通信划分为七个层次,每个层次都负责特定的功能和任务,从而将复杂的通信过程简化为各个独立的层次。

    OSI层级层名功能描述
    第7层应用层(Application Layer)提供网络服务和应用程序之间的接口
    第6层表示层(Presentation Layer)处理数据格式化、加密、解密和压缩,确保数据能被正确解释
    第5层会话层(Session Layer)建立、管理和终止会话连接
    第4层传输层(Transport Layer)提供端到端的可靠传输和错误恢复
    第3层网络层(Network Layer)处理分组在网络中的路由和转发
    第2层数据链路层(Data Link Layer)负责物理地址寻址、错误检测和纠正
    第1层物理层(Physical Layer)处理与物理介质的传输相关的细节

    OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输。

    2.4 TCP/IP:

    OSI 标准在定的时候是特别好的,每一层该做什么工作都做的特别好,只不过,实际在实施的时候,
    里面有些东西是不可能在标准当中定好的,尤其是会话、表示、应用这三层是不好去处理的。

    • 实际做出来的协议是五层。
    • 标准是四层协议,只不过大部分教材写的是五层。
    • 因为物理层关注的较少,所以一般都只注重于剩下的四层,重点讲的是软件层。

    TCP/IP 协议是在OSI的基础上发展起来的。
    TCP IP 是一种网络通信协议集合,它由两个部分组成:传输控制协议(TCP)和互联网协议(IP)。TCP/IP 是互联网的核心协议套件,广泛应用于全球范围的计算机网络中。

    在这里插入图片描述

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

    3. 操作系统与网络的关系

    为了使用户的网络请求成功发送给目标设备,需要经过网卡这个硬件,并且网卡的访问需要通过操作系统来进行

    在网络当中对应的主机相互通信,一定是由用户发起,使用应用层协议,贯穿对应的协议栈,到对应的物理层,经过网络路由转发,被对方的物理层收到,然后再提交到对方的数据链路层,依次向上提交,最后就到达了对方的用户。

    在这里插入图片描述
    体系结构直接决定,数据包在主机内进行流动的时候,一定是要进行自顶向下或者自底向上,进行流动的。以前的所有的IO都是这样的!!这是由体系结构决定的,这就是计算机本身的工作方式。

    网络的实现从软件上讲分了四层,顶层是应用层,用户去实现的,底层是驱动去实现的,中间两层传输和网络层是内核去实现的,也属于操作系统的一部分。

    网络未来的数据流向,一定是自动向下,或者自底向上的。

    • 为什么要自定向下呢?
      • 计算机发数据一定是经过硬件去转发,用户层数据无法直接递达硬件,必须贯穿操作系统。
      • 而网络协议栈,隶属于操作系统,所以必须自顶向下交付给硬件。
    • 为什么又要自底向上呢?
      • 因为发数据的时候,大部分的数据是用户给用户的。
      • 而底层的硬件也没办法把数据直接给用户,必须要贯穿操作系统,以及对应的协议栈,来将数据进行交付。

    TCP/IP 协议和操作系统之间的关系是:

    • 操作系统内部,有一个模块,就叫做 TCP/IP 协议,网络协议栈是隶属于OS的!
    • TCP/IP 协议栈是一种标准,确保了不同操作系统之间的互操作性。
    • 必须让每一个操作系统都遵守,以便能够与其他遵循相同协议的设备进行有效的通信。

    4. 报头与解包

    在我们平时网购的时候,买的东西一定是商家给你打包好了的。为了明确快递的出发地和发往地的信息,快递员一定会给快递上贴一个快递单。而这个快递单就很好的维护了出发地与发往地的信息。

    在网络通信中,数据包或消息通常由两部分组成:报头(Header)和有效载荷(Payload)。

    在网络通信中,为了维护和控制协议的正常运行,通常需要在被传输的数据上新增其他数据,也就是所谓的协议数据

    • 协议数据是指在数据传输过程中添加的用于维护和控制协议的额外信息。这些信息可以包括报头(Header)、校验和、序列号、确认号、时间戳、流量控制信息等。

    报头:

    • 每一层网络协议,都会给我们要传输的数据添加上独有的协议信息,然后再交付给下一层。
    • 加上的这些信息是用来维护数据的,就好像是快递单号上的地址。
    • 多出来的协议数据被称为 —— 报头(报头是协议数据的一部分)。

    我们把每一层要交付给下一层的数据,给他添加上本层的 “多出来的协议数据”拼接在原始数据的开头,就是报头。

    解包:

    • 主机在收到信息后,当数据从发送方经过网络的不同层传输到接收方时,每一层都会负责解析自己的报头,并将其从数据中删除,再交给上一层。
    • 这种拆开数据的过程被称为 —— 解包。

    报头通常位于数据包或消息的起始位置,其长度和结构由所使用的协议规定。报头中包含了各种字段和参数,用于描述和控制数据包的属性、类型、源地址、目标地址、校验和等信息。

    在这里插入图片描述
    小结:

    • 只有硬件才能收发数据。每一层都认为自己在和对方层在直接通信。
    • 而通信的双方在维护自己的通信时要添加报头,每一层都要有自己的协议,每一层协议都有对应的报头.
    • 自顶向下的时候,每一层都要添加对应的报头.
    • 在对应的一端时,就要自底向下进行解包时,再把报文给拆出来。

    站在系统角度,以太网可以看作是两台主机之间的临界资源。


    4.1 报头的作用:

    1. 一般而言,任何报头属性里面,一定要存在的一些字段支持,我们进行封装和解包。
    2. 一般而言,任何报头属性里面,一定要存在的一些字段支持,我们进行分用

    数据包添加报头的时候,也要考虑未来解包的时候,将自己的有效载荷,交付给上层的哪一个协议!

    数据包被以太网驱动程序收到之后:

    • 以太网驱动程序报头得考虑有效载荷交给上层哪个协议。
    • 报头里决定,未来怎么去把报头字段和有效载荷字段分开。
    • 报头有的字段表示,整个报头字段是多长,报文字段是多长等。
    • 未来决定,这个有效载荷交给上层的哪一个协议。

    有效载荷的分用的过程:

    • 将决定自己向上交付给哪一层协议这个过程,我们称之为叫作有效载荷的分用的过程。

    报头中的分用属性(例如TCP协议中的端口号、IP协议中的源IP地址和目标IP地址等)都是公共的,这些属性可以被网络中的所有设备所识别和使用。
    分用属性通常用于标识数据包中传输的应用程序或服务,以便接收方设备能够正确地处理和响应这些数据。在TCP/IP协议族中,不同的协议会使用不同的分用属性。


    5. 局域网

    如果两台主机,处于同一个局域网,那么这两台主机,能够直接通信吗?答案是肯定的,可以!

    有一种局域网称之为以太网,至于名字怎么来的百度去~(剧透和物理有关哦)。

    5.1 MAC地址:

    MAC地址(Media Access Control address)是指网络设备在物理层上的唯一标识符。它由48位二进制数表示,通常以十六进制表示法呈现。每一台主机都要有唯一的标识,该主机对应的MAC地址!

    通过MAC地址在局域网找一台主机,就像是在一间教室里找人,只需要通过座位号来确定位置就好了。

    MAC地址叫做网卡地址,网卡已经内嵌了网卡地址,主要用作在局域网标定主机的唯一性。

    局域网碰撞的概念:

    • 在以太网(Ethernet)中,每个设备都可以随时发送消息,但为了避免碰撞域中发生的冲突,采用了碰撞检测机制。
    • 当一个设备准备发送数据时,它首先监听网络上是否有其他设备正在发送数据。
    • 如果没有检测到其他设备发送数据,该设备可以立即发送其数据。
    • 但如果它检测到其他设备正在发送数据(即发生了碰撞),它将停止发送并等待一个随机的时间间隔,然后重新尝试发送。
    • 这个随机等待的时间间隔是为了避免多个设备同时重试发送,再次发生碰撞。

    交换机:

    • 交换机是工作在局域网,工作在数据链路层的, 主要解决的是一个局域网中主机过多的问题。
    • 是基于碰撞检测和碰撞避免的,在局域网中,主机越多碰撞的概率就越大。
    • 一旦局域网中主机过多时,就必须新增交换机这样的设备。

    交换机交换更多的是Mac帧,而路由器交换的是IP报文,有一定的路由功能。

    5.2 IP地址:

    IP地址(Internet Protocol Address,简称IP地址)是互联网上用于标识和定位设备的一组数字,用于在网络中进行数据包传递和通信。

    它是一个由32位或128位二进制数字构成的标识符,分为IPv4和IPv6两种格式。

    对于IPv4来讲,IP地址是一个4字节,32个bit位的整数。通常使用 “点分十进制” 的字符串表示IP地址, 例如 “xx.yy.zz.aaa”,用点分割的每一个数字表示一个字节,范围是 0~255

    5.3 通信原理:

    在大多数情况下,数据经过路由器后会进入下一个局域网。路由器是连接不同局域网之间的设备,它通过查找目标IP地址来确定下一跳,并将数据包转发到正确的网络中。

    在这里插入图片描述
    IP协议有一个非常大的亮点:所有的IP向,上的协议发送和接受主机看到的数据是是一模一样的!屏蔽了底层网络的差异!!

    路由器可以分别当做两个局域网各自的主机。是横跨两个局域网的,身处两个局域网当中,才可能完成数据的路由转换。

    走到局域网时套上局域网的报头,在经过路由器时,就会去掉局域网的报头,在路由器内重新转到下一个路由的时候,重新会封装mac地址。

    所以当一个IP报文在不断流动的时候,目的IP一直都不变,但是原mac地址和目的mac地址一定是在变的。


    6. 广域网

    6.1 源IP地址和目的IP地址:

    源IP对应的就是标定通信主机的源主机。目的IP对应的就是标定通信主机的目的主机。

    • 这两个主机可以在同一个局域网,也可以不在同一个局域网。
    • 通过源IP和目的IP来保证两方在通信时,主机的唯一性。

    通信过程:

    在这里插入图片描述

    • MAC地址,用来在局域网中,标定主机的唯一性。
    • IP地址,用来在广域网(公网),标定主机的唯一性。

    在广域网通信中,每个数据包都需要提供源IP地址和目标IP地址来确定数据包应该从哪个源节点传输到哪个目标节点,还需要提供源MAC地址和目标MAC地址来进行标识。

    IP的意义:

    • IP地址不变,就相当于用IP层在网络内,将所有的主机设置了一个虚拟的软件层。
    • 在IP协议往上,任何设备看到的报文都是一样的。
    • 经过IP协议的设定,屏蔽了底层局域网的差异之后,上层的协议在全网都可以是统一的了。

    常识告诉我们,一般我们在进行路线选择的时候,我们一般有两套地址:

    • 从哪里来,到那里去
      • IP地址:源IP,目的IP。
    • 上一站从哪里来,下一站要到哪里去(下一站要去哪里是由到哪里去决定的)
      • MAC地址:源mac地址,目标mac地址。

    IP规定了一个宏大的目标,未来要去哪里,而Mac地址则是告诉我们当下,这一阶段要做什么事情。
    IP地址将底层Mac地址的差异屏蔽掉。

    自顶向下发送到局域网,发送到路由器,解包,再封包,然后重新再转发,最后数据经过路由器的路径选择,到达了目标主机。

    6.2 通信的本质 / 端口:

    我们在网络通信的时候,只要让两台主机能够通信就可以了吗??答案是否定的!

    • 实际上,在进行通信的时候不仅仅要考虑两台主机间互相交互数据!
    • 本质上讲,进行数据交互的时候,是用户和用户在进行交互。
    • 用户的身份,通常是用程序体现的!!而程序一定是在运行中 —— 进程!!

    主机间通信的本质是:

    • 在各自的主机上的两个进程在互相交互数据!!
    • IP地址可以完成主机和主机的通信,而主机上各自的通信进程,才是发送和接受数据的一方。
    • IP确保主机的唯一性,而端口号(port)则是确保该主机上的进程的唯一性。
    • IP地址 + 端口号,就可以表示互联网中唯一的一个进程。

    IP地址和端口号的组合被称为Socket(套接字):

    • 在网络通信中,Socket用于标识网络中的一个进程或应用程序。
    • 它由一个IP地址和一个端口号组成,形成了一个唯一的地址,使得数据能够准确地发送和接收到指定的进程或应用程序。

    网络通信的本质:也是进程间通信!!

    • 同一台机子上的进程具有独立性,不同机子上的进程独立性就更强了,这两个进程更是毫无瓜葛了。
    • 进程通信的本质是让两个或多个进程看到同一份共享资源。
    • 在网络里,这两个不同的客户端进程、服务端进程,看到的公共资源叫做网络。

    为什么不去把PID来标识进程的唯一性:

    • 技术上能做到,但是不会这么做,因为进程ID属于进程管理的范畴,而端口号属于网络的概念。
    • 如果非要将进程的PID来作两用,既用来做进程调度、进程管理,又用来标定网络中查找这个进程的概念。
    • 这样无疑就是将网络和进程管理强耦合起来了,可以但是不合理。
    • 更重要的是,在我们的系统中,并不是所有的进程都需要网络通信的。
    • 端口号是一个数字,用来标定进程的唯一性,更加是一个证明,证明该进程是用来网络通信的。
    • 凡是有端口号的一定是网络进程。

    操作系统维护了一张哈希表,存着进程ID,通过进程ID来查找进程的PCB。
    同样的类似的原理,在操作系统内,也存在着一张端口号的哈希表,可以通过端口号,快速找到目标进程。

    一个进程可以绑定多个端口号,而一个端口号只能被一个进程占用。

  • 相关阅读:
    长安链数据存储介绍及Mysql存储环境搭建
    风险风控-逻辑回归理论基础
    LDR6020双盲插音频随便插充电听歌随便插
    推荐这款全新一代性能强到爆的RPC框架
    mac知名的清理软件 cleanmymac和腾讯柠檬哪个好
    Springboot+Easyexcel将数据写入模板文件并导出Excel
    Servlet 学习笔记4
    编译原理 x - 练习题
    内核移植学习
    Linux docker(01) 基础操作
  • 原文地址:https://blog.csdn.net/m0_63059866/article/details/133212685