Linux 网络通信

计算机网络背景

  1. 早期通信技术:20世纪初,电报和电话等通信技术的发展为后来的计算机网络奠定了基础。这些技术使得远距离通信成为可能,激发了人们对信息交流的需求。
  2. 计算机技术发展:随着计算机技术的发展,人们开始意识到将多台计算机连接起来可以共享资源和信息。这促使了计算机网络的发展。
  3. 冷战时期的需求:冷战时期,美国政府对于分散的计算机系统之间的通信需求增加。为了应对这一需求,美国国防部资助了ARPANET项目,这被视为互联网发展的起点。
  4. ARPANET的发展:1969年,ARPANET建立了第一个节点,标志着互联网的雏形。随后,ARPANET不断发展,增加了更多的节点和功能,成为了今天互联网的雏形。
  5. TCP/IP协议的诞生:20世纪70年代末,TCP/IP协议被提出并广泛应用,它标志着互联网技术的成熟和普及,也使得不同网络之间的互联变得更加容易。
  6. 商业化和普及:20世纪90年代,随着互联网商业化的兴起和个人电脑的普及,互联网迅速发展成为人们生活和工作中不可或缺的一部分。
  7. 移动互联网的兴起:21世纪初,移动通信技术的发展推动了移动互联网的兴起,人们可以随时随地通过移动设备接入互联网,这进一步推动了互联网的发展。

网络通信

问题背景

我们知道网络通信存在相隔很远的两台主机进行通信的情况。在这样的条件下,一台主机想要和另一台主机进行通信势必存在这样几个问题:

  • 如何保证数据能正确地到达下一个设备?
  • 如何定位主机?
  • 如何解决长距离传输数据导致数据丢失的问题?
  • 如何处理发来的数据?

我们学习网络的过程就是要不断地解决这些问题。那么,为什么会出现这些看起来令人头大的问题呢?

显然就是因为两台主机之间的距离变得很远啦!我们之前学习进程间通信就没有这样的问题。

那么,我们的前辈们是如何解决这些问题的嘞?

前辈们在每一个问题的解决上都定制了相应的协议:

  • 数据链路层解决:如何保证数据能正确地到达下一个设备的问题。
  • ip 协议解决: 如何定位主机的问题。
  • tcp 协议解决:如何解决长距离传输数据导致数据丢失的问题。
    http/https等等协议解决:如何处理发来的数据的问题。
    可见我们之后就要一个一个地来学习这些协议啦!

网络协议初识

生活例子

我们先来举一个生活例子来理解协议:

就拿打电话的例子来说吧:假设你正在和一个人进行通话,你肯定会认为你在和对方进行交流。但是真是的情况可能不是这样子的:电话将你的音频录制下来转换为数据/信号发送给对方的电话机,对方的电话机对收到的数据进行转化,对方才能听到你说的话。因此,真实的情况是人在和电话沟通。

但是在逻辑上,我们认为人和人电话和电话在进行通信。

  • 假设今天你和对方在使用汉语进行沟通,明天就换成了英语进行交流。电话机之间还是能正确传输数据。
  • 假设电话之间今天使用这一种电话协议进行数据传输,明天又使用了另一种电话协议进行数据传输,但是打电话的双方并不会因为电话机协议的改变而无法进行通信。

可以看出,上述例子中出现了明显层状结构。
上层语言的改变以及下层协议的改变都不会另一层。

这不就是我们常说的高内聚,低耦合吗?

  • 层与层之间高内聚。
  • 每一层之间是低耦合的。

网络协议七层模型

我们先来看看协议的概念吧:

在网络通信中,协议(Protocol)是指计算机网络中用于规定数据传输格式和传输过程的约定或规则。它定义了数据在网络中的传输方式、数据的格式、数据如何被分组、传输的流程等内容,以确保不同设备或系统之间能够有效地通信。

对协议的理解需要我们在后续的学习过程中不断强化对他的理解。

在上面打电话的例子中,我们提到了分层的概念,聪明如你,你肯定猜到了网络通信是分层的了!

猜到了没难度,可是网络通信为什么要进行分层呢?

  • 第一个原因就是网络通信项目的规模太大了,我们需要通过分层,将这个大的项目变成一个一个的小项目,每一个小项目就可以理解为一层。层与层之间低耦合,每一层内部高内聚。有效降低了维护成本。
  • 第二个原因就是因为网络通信存在的问题本身就是分层的嘛。你可以看看我们刚才提到的网络通信存在的不可不解决的问题。

你说网络协议要分层,这没问题!但是一个人说我要这么分层,另一个人说我要这么分层,那不玩完了。因此就需要有一个标准来统一,这个标准要足够严谨,并且要被大部分人接受。这里就要引出我们的主角了:OSI 七层模型。

OSI七层模型的诞生可以追溯到20世纪70年代末和80年代初,当时计算机网络的发展迅速,但各种网络技术和协议之间缺乏统一的标准和框架。为了解决这一问题,国际标准化组织(ISO)于1978年启动了OSI项目,旨在制定一个通用的网络体系结构模型,为不同厂商和组织开发的网络设备和协议提供一个统一的参考框架。

OSI项目的目标是设计一个能够描述任何计算机网络的通信过程的通用模型,这个模型应该具备以下特点:

  • 分层结构:将网络通信分解为若干层次,每一层都有特定的功能和责任,且层与层之间通过标准化的接口进行通信。

  • 标准化:为每一层定义明确的标准和协议,以确保不同厂商开发的设备和软件能够互通互用。

  • 开放性:鼓励开发开放式标准,以促进创新和发展,并使得网络技术能够适应未来的发展。

  • 通用性:适用于各种不同类型的网络,包括局域网、广域网、无线网络等。

在经过多年的研究和讨论后,1984年ISO正式发布了OSI七层模型,这个模型成为了计算机网络领域一个重要的标准,为网络技术的发展提供了重要的参考和指导。

我们来看看 OSI 七层模型都有哪七层吧:

OSI 七层模型实在理论中滴,在实际的工程实践中显示出了五层,会话层与表示层在操作系统中不好实现,交给了应用层来实现。因此,我们平时用到的其实是五层啦,我们把这五层叫做:TCP/IP 五层模型。

为什么要叫这个名字呢?

站在纯操作系统的层面,网络通信协议中最重要的两层是网络层和传输层。传输层最具代表的协议是 tcp 协议,网络层最具代表的协议是 ip 协议。我们将这样的网络协议栈叫做 TCP/IP 协议栈。

网络协议栈与我们之前学习的操作系统有什么关系呢?

传输层与网络层就是在操作系统中实现的,网络通信的本质就是访问网卡这个硬件。我们之前就提到过,操作系统不相信任何人,用户想要访问硬件就必须贯穿操作系统,因此操作系统就必须提供系统调用让用户访问网卡这个硬件!

因为访问网卡需要贯穿操作系统,因此网络通信的本质就是贯穿协议栈的过程,只不过信息发送者与信息接受者贯穿的方向不同罢了!

你可以对比我们之前打电话的例子,电话通信的过程不也是贯穿的过程嘛!

初识了 OSI 七层模型,TCP/IP 五层模型,我们不难得出结论:虽然不同操作系统的进程管理模块,线程管理模块,文件管理模块等不相同,但是网络这一模块不同的操作系统是一毛一样的!

如果你的操作系统网络模块和你对象的不同,你就和他无法通信了哦!

网络通信的宏观过程

  • 假设我们在应用层要发送一个字符串 "你好",让我们看看网络通信的宏观过程是怎么样的。
  • 首先,"你好" 这个字符串在应用层会被加上一个报头,即上图所示的 "带V1正方形"。我们将 "你好" 这个字符串称为:有效载荷。其中报文 = 报头 + 有效载荷。
  • 在应用层进行封转之后报文就会被传送到传输层,在传输层中同样也会加上传输层的报头,形成新的报文,发给网络层。
  • 在网络层添加的报头中,有两个字段:源 ip 地址和目标 ip 地址。这两个字段确保数据能够正确发送到目标主机。
  • 到了链路层 ,同样会添加链路层的报头,形成新的报文。最后通过以太网发送到目标主机。
  • 报文到了目标主机之后,就会向上层层进行解包分用,最后目标主机得到 "你好" 这个字符串。

上面我们举得一个例子是基于局域网通信来讲的。什么是局域网等会儿再讲。

这么来看是不是和打电话的例子很像,同层协议之间可以看作是互相通信的。

网络协议栈的层状结构中,每一层都要有协议,通信的过程就是在不断进行封转和解包的动作。

我们在以后会深入理解封装和解包的过程,但现在必须提出两点共识:

  1. 任何层的协议,都要提供一种将报头和有效载荷分离的能力。
  2. 解包的过程,向上会有不同的协议,因此,几乎任何层的协议,都要在报头中提供将自己的有效载荷交付给上层哪个协议的能力,此过程叫做报头的分用。

局域网通信

局域网的概念

局域网(LAN,Local Area Network)是指在相对较小的范围内,由多台计算机和其他网络设备(如打印机、路由器等)组成的网络。局域网通常覆盖的范围是一个办公室、学校、实验室、家庭或者一个建筑物。局域网的特点包括:

  • 地理范围小:局域网的范围通常在几百米到几千米之间,不同于广域网(WAN)覆盖更大范围。

  • 高速传输:局域网内部的数据传输速度通常很快,可以达到几百兆或者几千兆每秒,远远超过广域网的传输速度。

  • 低成本:相比于广域网,局域网的建设和维护成本相对较低。

  • 易扩展:局域网可以通过增加网络设备或者改变网络拓扑结构来扩展规模。

  • 共享资源:局域网上的计算机可以共享打印机、文件服务器、互联网接入等资源。

  • 专用性:局域网通常是为了满足特定组织或者个人的需求而建立的,具有一定的私有性。

主机在局域网内是可以和局域网中的设备直接通信的,比如电视投屏。直接通信也是要有奇数保证的:局域网协议。局域网协议比较典型的有以太网,无线 LAN,令牌环网等等。

为什么叫以太网这个奇怪的名字大家可以搜一搜还蛮有意思的。

以太网通信

我们先来通过一个例子引入以太网通信的原理:

这天,老师正在讲台上讲课,他突然想起来张三没交昨天的作业。于是老师就叫张三起来交作业。

  • 老师叫张三起来交作业,其实教室里面的人都听到了老师讲的话,但只有张三站起来了,这是因为其他学生在核对自己的名字之后发现不是叫的自己。
  • 张三站起来之后说,"作业我早上交了"。同样地张三说的话,也被教室里面的同学听到了。

可见:老师和张三对话的过程,其中包含的信息教室里面的人是完完全全的接收到了的!

这个故事和我们的以太网通信有啥关系呢?我们来尝试做一下角色替换:

  • 将教室换成以太网。
  • 将张三和老师换成两台主机。
  • 将其他同学换成局域网中的其他主机。
    进行替换之后,就能够看到局域网通信的一些特点啦!

以太网通信前提:每台主机在局域网中都要有一个唯一的标识。

网卡上有一个唯一的 48 位序列号,这个序列号可以作为这个唯一标识,在局域网通信中,习惯称之为 Mac地址。Mac 地址在局域网中唯一就行。

我们来看看以太网的通信图解:

其中,H 表示一台主机,M 表示 Mac 地址。

我们来看看 H1 如何与 H10 在局域网中是如何通信的:

  • H1 主机发送了一个报文,该报文由报头和有效载荷组成,报头中有两个字段:一个是源 Mac 地址,另一个是目的 Mac 地址。
  • H1 发送的报文实际上是被所有的主机都收到了,但是每个主机都会对比报文中目的 Mac 地址与自己的 Mac 地址。如果不一样就会直接丢弃,如果一样就会交由上层处理。

在以太网中,常见的连接介质包括铜线(通常是双绞线,就当作网线吧)和光纤。


这就势必会造成一个问题,如果以太网中有两台主机同时在发送报文怎么办呢?

要是两台主机在同时发送报文,就会发送数据碰撞的问题,这就会导致数据谁都收不到。


那么,如何知道数据发生碰撞了呢?

发送数据的主机能够接收到自己发送的数据,从而可以甄别是否发生数据碰撞。

我们把众多主机构成的局域网称为碰撞域。


发生数据碰撞了,如何解决呢?

  • 当数据碰撞发生时,发送数据的设备会立即停止发送,并发送一个特殊的信号,称为碰撞检测信号。然后,设备会等待一个随机的时间段,再次尝试发送数据。这种随机等待的时间段有助于减少碰撞的再次发生,这个过程被称为指数退避算法。
  • 注意到上图中的交换机,以太网交换机通常具有碰撞检测和碰撞避免功能,进一步降低了碰撞发生的可能性。
    交换机有划分碰撞域的功能:
    1. 交换机发现 H1 和 H5 要进行通信,交换机就会阻止报文向交换机右侧发送
    2. 交换机发送 H3 和 H10 通信的时候发生了数据碰撞就不将报文向左侧发送了

局域网的理解:

  1. 局域网是众多主句的共享资源,任意时刻只能有一台主机发送信息!主机之间是互斥关系,并且没有加锁。
  2. 局域网可以看作是多台主机的临界资源,主机的背后其实就是进程,局域网通信,也可以看成进程间通信。

知识点总结:

  1. 计算机网络的发展。
  2. 网络通信的背景问题。
  3. 分成模型的建立(OSI TCP/IP)
  4. 网络通信的本质原理。
  5. 局域网(以太网)通信的过程。
相关推荐
传而习乎几秒前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
soulteary2 分钟前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
我们的五年10 分钟前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
爱吃青椒不爱吃西红柿‍️29 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
IT果果日记31 分钟前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教34 分钟前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
羑悻的小杀马特1 小时前
环境变量简介
linux
小陈phd1 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
运维&陈同学1 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!1 小时前
【Linux】进程状态
linux·运维