【Linux | 网络】网络基础

目录

  • 一、网络发展
  • 二、认识 "协议"
    • [2.1 协议的简单认识](#2.1 协议的简单认识)
    • [2.2 网络 VS 系统](#2.2 网络 VS 系统)
      • [2.2.1 网络通信问题](#2.2.1 网络通信问题)
      • [2.2.2 网络的解决方案 ---- 网络的层状结构](#2.2.2 网络的解决方案 ---- 网络的层状结构)
        • [2.2.2.1 简单理解层状结构](#2.2.2.1 简单理解层状结构)
        • [2.2.2.2 OSI七层模型](#2.2.2.2 OSI七层模型)
        • [2.2.2.3 TCP/IP五层(或四层)模型](#2.2.2.3 TCP/IP五层(或四层)模型)
      • [2.2.3 网络与系统的关系](#2.2.3 网络与系统的关系)
  • 三、网络传输基本流程
    • [3.1 重谈协议](#3.1 重谈协议)
    • [3.2 局域网中多台主机可以直接通信吗?怎么通信?](#3.2 局域网中多台主机可以直接通信吗?怎么通信?)
    • [3.3 网络传输流程图](#3.3 网络传输流程图)
    • [3.4 数据包封装和分用](#3.4 数据包封装和分用)
  • 四、网络中的地址管理
    • [4.1 简单认识IP地址](#4.1 简单认识IP地址)
    • [4.2 简单认识MAC地址](#4.2 简单认识MAC地址)
    • [4.3 IP地址 VS MAC地址](#4.3 IP地址 VS MAC地址)
  • 结尾

一、网络发展

独立模式:计算机之间相互独立


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

局域网LAN : 计算机数量更多了,通过交换机和路由器连接在一起

广域网WAN :将远隔千里的计算机都连在一起;

所谓 "局域网" 和 "广域网" 只是一个相对的概念。比如,我们有 "天朝特色" 的广域网,也可以看做一个比较大的局域网。


二、认识 "协议"

2.1 协议的简单认识

这里我们还没有开始学习网络,但是我们应该知道,网络的本质就是两台机器通过网络进行通信。我们知道一个计算机是符合冯诺依曼体系的,每一个设备是独立的,从一个设备将数据发送给另一个设备本质上就是拷贝,两个独立的设备之间相互拷贝本质上就是这两个设备在进行通信,这两个设备就需要通过总线连接起来,所以单台设备也是一个网络结构。长距离传输本质上就是两台主机的网卡进行通信,本质上就是两个硬件之间进行通信,那与一台主机之间两个硬件之间通信有什么区别呢?

主要的区别就是距离变长了,这就互延伸出以下三个问题:

  1. 两台主机通信时,丢包了怎么办,也就是如何确保可靠性
  2. 一台主机中的硬件种类和个数基本上是固定的,并且都被操作系统管理好了,而连接网络的主机是非常多的,那么一台主机想要向另一台主机发送信息,还需要面临一个问题就是如何在众多的主机中定位到它想发送给的那台主机
  3. 两台主机通信时,需要通过非常多的路由器,假设一台主机需要向另一台主机请求服务,当请求送达对方主机时,还需要解决将服务推送给请求的主机的问题

为了解决这些问题,就提出了协议的概念,协议的本质就是约定,就例如婴儿张嘴、发出"嗷嗷"声‌:说明宝宝饿了,婴儿打哈欠、揉眼睛:表示宝宝困了。两台主机也可以定义这样的约定,假设一个主机向另一台主机发送1就是要视频的服务,发送2就是要听音乐的服务。


计算机之间的传输媒介是光信号和电信号。通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。那么只要通信的两台主机,约定好协议就可以了么?

其实并不是的,计算机生产厂商有很多,计算机操作系统也有很多,计算机网络硬件设备还是有很多,有的电脑可能是使用频率的快慢来表示0和1的,有的电脑可能是使用振幅的强弱表示0和1的,它们都使用的0和1这样的信息进行通信,但是它们底层的电气特性是不相同的,而网络的就是要让不同的电脑都能无障碍的连接到互联网中。

如何让这些不同厂商之间生产的计算机能够相互顺畅的通信?就需要有人站出来,约定一个共同的标准,大家都来遵守,这就是网络协议,它可以规定硬件上的电气特性,也可以规定软件上的软件特性,让所以的计算机的厂商按照这样的特性进行生产。将网络协议定义出来后,还需要编码实现协议。


2.2 网络 VS 系统

2.2.1 网络通信问题

网络通信有以下几个问题:

  1. 如何保证将数据交给下一跳
  2. 在转发的过程中,如何进行路径的选择,目标定位的问题
  3. 如果报文在转发的过程中出现错误或丢失如何解决
  4. 送达的数据还要解决如何使用数据的问题

1、2、3这三个问题在上面讲到过,是将这三个问题解决了,就是解决了将数据从主机A可靠的转发给主机B。上面的每一个问题都需要对应的协议进行解决。


2.2.2 网络的解决方案 ---- 网络的层状结构

2.2.2.1 简单理解层状结构

就以打电话为例,看下图,我们打电话看似是直接将信息传递给对方,实际上是需要将信息传递给自己的电话,然后自己的电话再将信息给对方的电话,最后对方的电话再将信息传递给对方。在下图中,人对应人,电话对应电话,就是层状结构,在层状结构中,就算同时更换两个通信人为相同的语言或通讯设备,也并不会影响最终的通信。

在软件中,绝大部分的解决方案都是层状结构,它能够完成对软件的解耦,方便未来对软件的维护(更新、替换、优化...)。


2.2.2.2 OSI七层模型
  • OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范
  • 把网络从逻辑上分为了7层,每一层都有相关、相对应的物理设备,比如路由器,交换机
  • OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输
  • 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯
  • 虽然OSI模型定义的非常完美,但是实际在编码实现时,却没有办法完全将应用层、表示层和绘画层分开,所以在日常生活中,我们并不会使用这个模型,而是将这三层合并为一个应用层来使用,也就是TCP/IP模型。

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

TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。

TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

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

一般而言

  • 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容
  • 对于一台路由器,它实现了从网络层到物理层
  • 对于一台交换机,它实现了从数据链路层到物理层
  • 对于集线器,它只实现了物理层

但是并不绝对。很多交换机也实现了网络层的转发,很多路由器也实现了部分传输层的内容(比如端口转发)。


2.2.3 网络与系统的关系

在下图中,我已经标注好了网络协议栈的每一层对应与操作系统的每一部分,由于TCP协议与IP协议是五层模型中最为关键的两个模型,所以五层模型又被称为TCP/IP五层模型,并且这两个协议在操作系统中也被实现了。由于网络协议被标准化了,操作系统都需要按照这个标准来写,所以所有的操作系统中网络的系统调用的使用都是大同小异的。我们还知道两台主机通信,最终一定是会使用网卡进行通信,所以用户发送的信息一定会贯穿整个协议栈的每一层。


三、网络传输基本流程

3.1 重谈协议

在生活中,大部分人都在网上买过东西,而最终收到快递时,我们收到的东西一定是比买到的东西多的,多出来的东西就是快递单,快递单上的东西卖家会填、快递员和买家看得懂,快递单本身就是一个约定,本身就是一种协议,长距离发送的时候,实际收到的快递=快递单+物品,这个快递单我们就可以叫做报头。如果我们想用C语言来描述这个快递单,那么一定是使用结构体来描述,协议通常就是使用结构化字段表征的,这个结构体定义出来的对象,我们就叫做协议报头。


3.2 局域网中多台主机可以直接通信吗?怎么通信?

局域网中多台主机是可以直接通信的,每一台主机都有一个唯一的MAC地址,看上图,假设局域网中的主机A想给主机B发送信息,它就会将携带主机B的MAC地址、主机A的MAC地址与它想要发送的内容整体发送到局域网中,局域网中的所有主机都会收到这个信息,但最终只会有主机B会获得到A发送的内容,因为整体内容中包含了发送指定的主机,也就是主机B的MAC地址,其他主机获取到整体内容时,看到与自己的MAC地址不匹配时,就会将其丢弃。

在局域网中的所有主机都可以发送信息,但是任何时刻,只允许一台主机在局域网中发送信息,若是同一时刻有多台主机同时发送信息,就会发生数据碰撞,这时候发生数据碰撞的主机就会调用碰撞避免算法,让这几台主机各自休眠一段时间,同时局域网中的其他主机在此时还可以发生信息,这样就减小了数据碰撞的可能性了。

如果我们在系统的角度来看,局域网其实就是一个临界资源,碰撞检测、碰撞避免、重发就是完成互斥访问。


3.3 网络传输流程图


当用户想给另一个用户发送一个信息时,这个信息并不是直接交给对方,这个给信息需要在网络协议栈中层层向下交付后,再通过以太网发送到对方的数据链路层,再层层向上交付,最终对方获取到信息。信息层层向下交付的过程叫做封装报文 = 报头 + 有效载荷 ,上一层交付给下一层的内容,就是下一层的有效载荷 ,每一层协议都需要在有效载荷前面加上它对应层上协议的报头,再交付给下一层,最终到数据链路层添加完毕后,则封装完毕。由于协议是标准化的,每一台主机都能够向报头中填写信息,也可以从报头中读取信息,报文层层向上交付的过程叫做解包+分用,每一层需要将报文拆分为报头+有效载荷(解包),在将有效载荷向上交付(分用),最终对方会获取到用户发送的信息。从逻辑上我们可以理解为,每一层是直接与对方对应层进行通信,因为用户发送的数据与对方收到的数据是相同的。

封装就一定要考虑后面解包的过程,就会出现下面的两个问题:

  1. 如何将报文中的报头和有效载荷进行分离
  2. 由于每一层并不只有一个协议,所以每一个协议都要解决如何将有效载荷交付给上层中的哪一个协议

这两个问题是所有协议都需要解决的问题,这两个问题后在后面的文章进行讲解。


3.4 数据包封装和分用

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

下图为数据封装 的过程

下图为数据分用的过程:


四、网络中的地址管理

4.1 简单认识IP地址

  • IP协议有两个版本,IPv4和IPv6。后面的文章中,凡是提到IP协议,没有特殊说明的,默认都是指IPv4
  • IP地址是在IP协议中,用来标识网络中不同主机的地址
  • 对于IPv4来说,IP地址是一个4字节,32位的整数
  • 我们通常也使用 "点分十进制" 的字符串表示IP地址,例如 192.168.0.1;用点分割的每一个数字表示一个字节,范围是 0 - 255

4.2 简单认识MAC地址

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

4.3 IP地址 VS MAC地址

相信大家都看过西游记,唐僧一群人每到达一个国家都会跟国王说自己的终极目标,从东土大唐来去西天取经,然后说自己的当前目标,从哪里到当前国家的,最后问想要去西天,下一个国家应该去哪。

在这里我们就看出来了,最终目标一直都没变,而当前目标一直在变。这里的终极目标就代表着IP地址,当前目标就代表着MAC地址,在发送信息时,报文的IP地址是一直不变的(目前来看),而MAC地址需要一直改变。

我们通过下图也可以看出来数据在进行转发的时候IP地址是不会改变的,而MAC地址会一直改变,并且以网络层为界限,下层转发数据的方式有多种,而从网络层从上看网络报文没有差异,一切皆IP(网络IP地址)。

在实际主机A向主机B发送信息时,会经过很多的路由器,它会将接受到的报文向上进行解包分用,但是最终到网络层,然后继续向下进行封装,再将报文转发给其他的路由器或是目标主机。


结尾

如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。

希望大家以后也能和我一起进步!!🌹🌹

如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹

相关推荐
wdfk_prog5 小时前
[Linux]学习笔记系列 -- 底层CPU与体系结构宏
linux·笔记·学习
逑之5 小时前
C语言笔记15:动态内存管理
c语言·网络·笔记
行走的bug...5 小时前
cmake总结
linux·运维·服务器
zfxwasaboy5 小时前
DRM KMS 子系统(3)CRTC
linux·c语言
hui函数5 小时前
如何解决 pip install 网络报错 403 Forbidden(访问被阻止)问题
网络·pip
凌波粒5 小时前
Linux 面试题篇
linux·运维·服务器
Joren的学习记录5 小时前
【Linux运维疑难杂症】k8s集群创建calico网络失败
linux·运维·kubernetes
乾元5 小时前
现场运维机器人的工程化落地——移动探针采集 + AI 诊断,在真实网络中的实现路径
运维·网络·人工智能·架构·机器人·自动化
鲨莎分不晴5 小时前
Docker 网络深度解析:打破容器的“孤岛效应”
网络·docker·容器
虾..5 小时前
Linux 线程控制
linux·运维·服务器