Linux网络——网络初识

news/2024/11/16 7:41:07/

目录

1. 认识协议

2. 协议的分层

3. OSI 七层模型 && TCP/IP 五层(四层)模型

4. 网络传输的基本流程

5. 以太网的通信原理 

6. 数据的跨网络传播

7. 认识 IP 地址

① IP 是什么

② IP 与 MAC 的关系

③ 为什么需要 IP


在谈及网络之前,我们要先对学的知识有一个了解

网络的本质就是获取数据,而系统的本质就是加工数据

1. 认识协议

而我们要从网络上获取数据,这之中一定会出现很多的问题,比如

  • 如何处理发送过来的数据? -> 应用层 (http, https, ftp, smtp)
  • 长距离传输导致数据丢失了怎么办? -> tcp 协议
  • 如何定位主机呢? -> ip 协议
  • 如何保证数据能够传输到下一个设备呢? -> 数据链路层

那么为什么会出现这些问题呢?——其实是两个设备之间传输数据的距离变长了而已。对于 A 与 B 两个设备来说,整个通信的过程其实就是一个封装与识别的过程!

既然如此,只要我们通信两台设备并约定好协议就可以了吗?——当然不行,计算机的型号有很多,OS 也有很多,硬件一定更多。因此我们只能约定一个共同的标准——即网络协议。

2. 协议的分层

网络协议在实际意义上被分成了层级,在 C++ 中实际是通过继承来实现的,即使用虚拟文件指针在硬件和软件间分层。那么好端端的为什么要分层呢?——满足高内聚,低耦合,举个例子

对于通信设备层来说,我们可以将电话替换成无线电,这对上层的人是没有影响的,也就是解耦了!这会给我们带来一个好处——更加方便维护。在事实上,我们认为人和电话在沟通;在逻辑上,我们认为人和人,电话与电话在沟通。那为什么协议也要分层呢?——协议本身就是层状的。

3. OSI 七层模型 && TCP/IP 五层(四层)模型

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

图示如下 


但是,它既复杂又不实用。所以我们按照 TCP/IP 五层(四层)模型来讲解,即

应用层:如何处理数据?

传输层(TCP):数据出问题怎么办?

网络层(IP):如何选择路径?

数据链路层:保证任意两台主机能通信

物理层:保证信号的发送效率

这之中网络层与传输层最为重要因为它们与 OS 联系最为紧密,我们来看看 OS 与网络协议栈的关系,如图

我们的用户想做出动作本质就是访问硬件,但是我们又无法直接访问,因此这个过程一定会贯穿 OS ,其中传输层与网络层就是 Linux 内核中的一个模块。所以我们可以知道,整个网络通信的本质实际上就是一个贯穿协议栈的过程,即

4. 网络传输的基本流程

实际上,网络协议栈的层状结构中,每一层都有协议,举个例子

应用层:Telnet, FTP, HTTP, SMTP

传输层:TCP, UDP

网络层:IP, ICMP, IGMP

数据链路层:MAC

 我们现在来简单模拟一下网络传输的基本流程,如图

可以看到,从上往下是一个封装的过程,而从下向上则是一个解包分用的过程。那为什么一定是网卡拿到数据并向上传递呢?——冯诺依曼体系是这样规定的!所以,通信的过程本质就是在不断地进行封装与解包的过程。

只有理解了下面这两点,面对封装与解包我们才不会困惑,即

1. 几乎任何层的协议,都要提供一种能力——将有效载荷与报头分离的能力

2. 几乎任何层的协议,都要在报头中提供 将自己的有效载荷交付给上层的哪一个协议的能力

这是大部分协议的共性,我们以后学习各种各样的协议时都会提出对应的问题。

5. 以太网的通信原理 

接下来我们来看看以太网是如何互相通信的,我们先讲一个例子来引入

当我们坐在教室里上课时,老师在讲台上点名,此时老师点了“张三”,坐在教室里的所有同学在实际意义上都收到了这个信息,然后每个同学将“张三”这个信息和自己的名字作对比,如果相同那就是点到了自己,否则不理会即可

同样的,每台主机在局域网上都要有自己的唯一编号,如图

此时H1想与H7互相通信,H1 就向局域网中发送一个报文,这个报文会被每个主机看到,每个主机拿到这个报文后,会将其中的 dst 与自己作比较,如果不同就舍弃,如果相同就将报头与有效载荷分离以得到数据。

那我们如何看待局域网这个东西呢?——局域网是多台主机所共享的临界资源。那假如在同一时刻多台主机向局域网中发送大量报文,那么就会出现一定程度上的报文丢失,我们将这个问题称为以太网发送数据碰撞问题!所以,我们要使用让发送主机尽量避免碰撞的算法。

为了解决这个麻烦,就出现了交换机这个东西,比如在 H3 与 H8 之间存在一个交换机, H1 与 H7 都在交换机的左边,就会让报文不传递到交换机右边,以此来降低碰撞概率,这实际上是一种基于划分碰撞域的东西。

6. 数据的跨网络传播

如图

可以看到,在整个过程中 IP 协议屏蔽了底层网络的差异化(红线以下部分),靠的就是工作在 IP 层的路由器。也就是说, IP 实现了全球主机的虚拟层,即一切都是 IP 报文!

注:令牌与锁类似,只有持有特殊标识符的主机才能发送消息。

7. 认识 IP 地址

上面说到了 IP,我们就来认识认识 IP

① IP 是什么

IP 一般指 IPv4,它有4个字节,32个比特位,其风格类似于 10.65.181.55

② IP 与 MAC 的关系

在这里我们举个例子,如果我们想从北京到上海,肯定在一路上要路过相当多的省份,而在这之中

从哪里来(srcip),到哪里去(dstip)始终是不变的!其类似于 IP 地址;

而上一站从哪里来(srcmac),下一站到哪里去(dstmac)始终是变化的,其变化依据是我最终去哪里!其类似于 MAC 地址。

根据之前的学习,以太网中的主机设备凭什么将数据交给路由器呢?——根据 IP 判断是否在同一网段。 

③ 为什么需要 IP

对于 IP 地址来说,尤其是目的 IP ,一般都是不会改变的,且可以协助我们进行路径选择;对于 mac 地址来说,在出了局域网后,其源 mac 地址与目的 mac 地址都要丢弃,再经由路由器重新封装。


http://www.ppmy.cn/news/1547395.html

相关文章

React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现

在移动应用中,动画效果 是提升用户体验的重要手段。合理的动画设计可以增强应用的交互性、流畅性和视觉吸引力。React Native 提供了多种实现动画的方式,包括内置的 Animated API、LayoutAnimation 以及第三方库(如 react-native-reanimated&…

酒店行业数据仓库

重要名词: PMS:酒店管理系统CRS:中央预定系统客户:可以分为会员、散客(自行到店入住)、协议(与酒店长期合作,内部价)、中介预定:可以分为线上预定、线下预定…

【Java Web】MVC与分层开发

文章目录 MVC分层开发 MVC MVC(Model-View-Controller)架构模式将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),以实现清晰的责任…

鸿蒙学习生态应用开发能力全景图-鸿蒙生态伙伴 SDK 市场(4)

鸿蒙生态伙伴 SDK 市场帮助开发者获得更优质安全的闭源 SDK,与 SDK 伙伴、开发者共建一站式的 SDK 选用平台,实现开发者、SDK 伙伴和华为共赢。鸿蒙生态伙伴 SDK市场汇聚热门 SDK 助力开发者构建高品质鸿蒙原生应用。同时伙伴 SDK 市场通过 SDK 签名认证…

综合文化信息管理系统|基于java和小程序的综合文化信息管理系统设计与实现(源码+数据库+文档)

综合文化信息管理系统 目录 基于java和小程序的打印室预约系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&…

如何将java项目打包成docker 镜像并且可运行

java 项目打包成 Docker 可运行的镜像,其目的是便于运用docker容器来管理项目。下面是具体的步骤,如果大家遇到啥问题可以留言有空会逐一回复。 目录 1. 确保项目已经打包成 JAR 文件 2. 编写 Dockerfile 3. 构建 Docker 镜像 4. 运行 Docker 容器 …

Spring——单元测试

单元测试:JUnit 在之前的测试方法中,几乎都能看到以下的两行代码: ApplicationContext context new ClassPathXmlApplicationContext("xxx.xml"); Xxxx xxx context.getBean(Xxxx.class); 这两行代码的作用是创建Spring容器&a…

微信小程序点击跳转打电话功能

wx.makePhoneCall 属性类型默认值必填说明phoneNumberstring是需要拨打的电话号码successfunction否接口调用成功的回调函数failfunction否接口调用失败的回调函数completefunction否接口调用结束的回调函数&#xff08;调用成功、失败都会执行&#xff09; <view class&q…