【网络】局域网LAN、广域网WAN、TCP/IP协议、封装和分用

简介: 【网络】局域网LAN、广域网WAN、TCP/IP协议、封装和分用

发展过程:

单机 —> 局域网 —> 广域网 —> 移动互联网

局域网 LAN

  • 局域⽹,即 Local Area Network,简称 LAN
  • Local 即标识了局域⽹是本地,局部组建的⼀种私有⽹络。
  • 局域⽹内的主机之间能⽅便的进⾏⽹络通信,⼜称为内⽹;局域⽹和局域⽹之间在没有连接的情况下,是⽆法通信的。局域⽹组建⽹络的⽅式有很多种:

  • 把几个电脑连接到一起,就构成了局域网
  • 但当电脑多了之后,就不方便两两相连,就创造了“路由器”
  • 只要电脑都连在同一个路由器上面,就可以构成局域网

[!quote] 调制解调器

  • 不同种类的信号转换
  • 这个是宽带普及之前,上网操作是通过“电话线”进行的,猫的作用是将电话线中的模拟新欢转换成网络中的“数字信号”
  • 光猫”就是把光信号和电信号之间进行相互转换(一般带有路由功能)
  • 因为路由器上面接口有限,当机器多了之后,就插不下了,此时就引入了“交换机”,就解决了上述问题
  • 交换机就相当与是对路由器的端口的扩展
  • 将计算机都插到交换机上面,然后交换机再连接路由器就行了
  • 此时这些电脑就相当于都插到路由器上了,这些电脑就都早一个局域网中了
  • 局域网是有路由器负责的,本身与交换器没有关系


广域网 WAN

  • ⼴域⽹,即 Wide Area Network,简称 WAN
  • 过路由器,将多个局域⽹连接起来,在物理上组成很⼤范围的⽹络,就形成了⼴域⽹。⼴域⽹内部的局域⽹都属于其⼦⽹。
  • 现在见到的“万维网”就是把全世界的设备都连接在一起的巨大广域网
  • “网游”就是电脑连接到了广域网上,可以和全国甚至全世界的玩家一起进行对抗

网络中的重要概念

IP 地址

  • IP 地址就是描述了一台主机,在互联网上所处的位置
  • IP 地址是使用一个 32 位整数来表示的
  • 使用“点分十进制”这样的方式,来表示“IP 地址”
  • 将 32 位整数用三个点分成了四份,每份取值范围 0~255(一个字节)
  • 使用点分十进制之后,更方便人阅读

端口号

  • 用来区分当前主机上的指定的应用程序(进程)
  • 一个主机上,使用网络的程序有很多个,可以通过端口号,区分当前主机收到的数据是要交给哪个程序来处理使用
  • 端口号同样也是一个整数,是一个两个字节的整数(0~65535)
  • 虽然是 0 ~65535 这样的范围,实际上 0~1023 这些端口都是有一些特定含义的
  • 咱们自己写代码使用的端口,一般都是用剩下的

[!quote] IP 地址和端口号

类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货⼈(端⼝号)

认识协议

网络中最核心的概念


  • 协议是进行一切通信的基础
  • 协议至少得有两个主机,让发送方发送数据,接收方能理解
  • 比如,我虽然在重庆上学,但我是湖北人,如果周围有人说重庆话,我有时候就听不到。
  • 这就属于无效的通信
  • 所以双方需要按照同样的规则来构造/解析数据,否则就是无效的通信
  • 协议就是在约束通信双方,交互数据的“规则”,协议确定了,双方就在一个频道上了,才能进行有意义的通信

所以,如何进行网络通信的问题,就转为了如何设计网络通信协议。

网络上传输的数据:光信号(光纤,激光的光)/电信号(网线里的)/电磁波(WiFi、5G…)

  • 无论是哪种信号,本质上都是传输 0101 这样的二进制
  • 光信号:可以用高低频光代表 0/1
  • 电信号:可以用高低频电代表 0/1
  • 电磁波:也是光,也可以通过频率进行编码
  • 所以在通信时就需要约定好,传输的这一大串 101010 都是啥意思
  • 这个就是"网络通信协议“要完成的核心工作

由于网络通信,是一件非常复杂的事情,如果只使用一个协议,去约定所有的网络通信细节,就会导致这个协议非常庞大,非常复杂

为了对抗这种复杂度,我们就进行“拆分”。将一个大的协议,拆分成多个小的协议,让每个小的协议,专注于解决一个/一类问题,再让这些协议相互配合

协议分层

是什么

  • 但是,拆分之后,拆出来了很多协议,不方便组织
  • 所以,将这些协议分层,把功能类似的协议放到一层,并且约定号,协议之间,不能随意进行交互,只能是相邻的层之间才能进行交互
  • 上层协议调用下层协议,下层协议给上层协议提供服务

分层的好处:

  1. 降低了使用的成本,使用某个协议的时候,不需要关注其他协议的实现细节
  • 打电话这个事情,不需要理解电话机的工作原理,只需要会说话即可
  1. 降低整个体系的耦合性,可以灵活的变更某个协议
  • 可以经汉语协议变为英语协议,不妨碍打电话;可以经无线电协议变为电话协议,也不妨碍打电话

当前互联网体系的现状就是“协议分层”的效果

OSI 七层网络模型

这种划分方式,只是存在于教科书里,并没有被真正的采用


TCP/IP 五层网络模型(或四层)

当前世界上最主流的网络协议模型

四层就是不散物理层,物理层和硬件相关,距离程序员非常遥远


物理层

  • 物理层:描述的是硬件设备(网线这样的设备)需要满足什么样的条件
  • 物理层就相当与是“公路“、”铁路”、“航线”
传输层

  • 传输层:主要就是关注网络通信中的“起点和终点”,并不关心通信的中间细节
  • 比如,你在网上买了个东西
  • 下单的时候,需要填写“收件人信息”
  • 卖家给你发快递的时候,也需要填写“发件人信息”
  • 最后卖家就把快递给快递小哥,快递小哥最后将快递送到你手上
  • 在这个过程中,传输层就只关注发货地和收货地,并不关心快递是如何到你手上的、如何运输的…
网络层

  • 网络层:进行网络通信的路径规划地址管理
  • 网络是很负责的结构,从 A 到 B 中间有很多不同的路线,此时网络层协议就要进行“路径规划”,称为“路由选择
  • 网络上的这些设备他们的地址都是什么、怎么去描述、用什么样的一套规则也是网络层安排
  • 比如快递小哥揽收你的包裹之后,需要进行包裹运输
  • 就要规划选择一条合适的路径将包裹送到你手中
  • 合适的选择不是绝对的,可能看路程、可能看速度、可能看成本…
  • 使用地图导航,也是类似于网络层“路由选择”的过程
数据链表层

  • 数据链路层:针对好上述规划好的路径,进行具体的实施
  • 比如,你的包裹要从上海运往西安,选择的路径是:上海 —> 南京 —> 西安
  • 上海 —> 南京:走水路,坐船
  • 南京 —> 上海:走铁路,火车
  • 西安 —> 驿站:走公路,坐卡车
  • 驿站 —> 收货地:骑三轮
  • 在这每两个地点之间的交通选择,都是数据链路层负责的
  • 董事长(传输层) —> 制定一个公司的发展目标(今年营业额要达到 xxx 小目标)
  • 高管(网络层) —> 规划一下,如何达到上述目标,明确达到上述目标,分成几个步骤,先做什么再做什么。路径规划/路由选择的过程
  • 基层员工(数据链路层) —> 进行具体实施,第一步到第二步,第二步到第三步… 具体咋办
  • 办公用到的基础设施(物理层) —> 办公室、工位、电脑、打印机、网络…

这四层都是程序员干预不了的,操作系统/硬件设施已经实现好了的

应用层

  • 应用层:程序员可以干预到的,可以决定这个应用是用来干什么

下面的这篇文章中有详细介绍

应用层的作用、自定义应用层协议

网络设备所在分层
  • 对于⼀台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是 TCP/IP 五层模型的下四层
  • 对于⼀台路由器,它实现了从⽹络层到物理层,也即是 TCP/IP 五层模型的下三层
  • 对于⼀台交换机,它实现了从数据链路层到物理层,也即是 TCP/IP 五层模型的下两层
  • 对于集线器,它只实现了物理层
    这都是站在经典的模型上讨论的,笔试中遇到了相关的选择/填空题,可以照着答

真实情况下,交换机也可能是工作在网络层,甚至是传输层/应用层

路由器也可能是工作在数据链路层,也可能是传输层,也可能是应用层

封装和分用

通过 QQ,发送一个 hello 给另一个人

[站在发送方视角](封装)

  1. 用户输入框中输入“hello”字符串,点击“发送”按钮
  • QQ 这样的程序,就会把 hello 这个内容从输入框读取到,构成一个“应用层数据包”
  • “应用层数据包”是应用层的协议,描述了这个数据包的构造,此处的应用层协议,往往是开发 QQ 的程序员自行定义的

[!quote] 序列化/反序列化

  • 将结构化数据 —> 二进制字符串:序列化
  • 将二进制字符串 —> 结构化数据:反序列化
  • 进行网络传输数据,通常就需要把一个“结构化”(C 的结构体/Java 的类,包含很多属性)数据转成一个“字符串”(二进制字符串,不需要非得在码表上可以查到,任何的 01 序列都可以接在一起)

[!quote] 应用层数据包

  • 主要是做了一个“序列化”的工作,将传入的信息整合成一个“字符串”
  • “应用层数据包”是应用层的协议,描述了这个数据包的构造,此处的应用层协议,往往是开发 QQ 的程序员自行定义的
  • 如果是我来开发 QQ,我可能会按照下列的方式定义这个应用层数据包的结构(定义方式有很多种)
  • 数据包格式:发送者的 QQ 号;接收者的 QQ 号;发送时间;消息正文\n
  • 数据包样例:123456789;987654321;2024-01-14 23:50:10;hello\n
  1. 应用层数据包准备就绪后,QQ 这样的应用程序,就会调用操作系统提供的API传输层给应用层提供的 API
  • 操作系统就会提供一个类似于“发送数据”这样的 API,然后应用程序就会把上述组织好的应用层数据包作为参数传进来,于是应用层数据包就到了系统内核里,就进入到传输层的代码部分了
  • 此时,传输层这里,就会把上述的应用层数据,再进一步封装(字符串拼接)成一个传输层数据包
  • 由于传输层有多种协议(其中最重要的是两个:TCPUDP),这些协议给应用层提供的API是不同的,看应用程序种使用哪组API就使用哪个协议
  • 假设此处使用 UDP 协议,则会在刚刚整合的“字符串”前面加一个“UDP 报头”,这串“字符串”叫“UDP 正文/载荷payload)”
  • UDP报头中就包含了一些 UDP 相关的信息,比如发送者的端口号和接受者的端口号
  • 拼上的这些信息,都是给后续的转发打下基础的,就类似于“贴标签
  • 网络中,有多层协议,每一层协议都要贴标签,每一层标签的侧重点不同,贴上的标签中的信息也不一样
  1. 传输层构造好数据之后,就会继续调用网络层提供给传输层的API,把数据进一步交给网络层
  • 由于传输层和网络层都是系统内核里面实现好的,上述调用的过程,我们无需关心,也感知不到
  • 网络层也有多种协议,其中最重要的就是IPv4 协议(简称为IP 协议
  • IP 协议就会把上述拿到的传输层数据包构造成网络层数据包
  • IP 报头中也会包含很多信息,主要信息为发送方的 IP 地址,接收方的 IP 地址
  1. 网络层继续调用数据链路层的API,把数据交给数据链路层处理
  • 数据链路层的常见协议是:以太网(平时插网线,进行上网的方式)
  • 在 IP 数据包的基础上,进一步进行包装

网络传输数据的基本单位

  1. 数据包(packet)
  2. 数据报(Datagram)
  3. 数据段(segment)
  4. 数据帧(frame)

这几个术语严格来说是有区别的,但平时日常交流的时候,不会刻意区分

  1. 上述得到的数据,需要进一步交给物理层(硬件设备)
  • 网卡就会针对上述的二进制数据,进行真正的传输操作
  • 就需要把上述 0101 这样的序列转为光信号/电信号/电磁波…

[站在接收方视角](分用)

  1. 接收方物理层收到光电信号,把这样的光电信号还原成 010101 这样的二进制字符串
  2. 物理层转换回来的数据,交给数据链路层以太网拿到这个数据包,就会对这个数据包进行解析
  • 拿出这里的报头载荷,根据报头中的信息做一些处理
  • 这个数据包是要丢弃、还是转发、还是自己保留,向上进行解析
  • 由于是站在接收方的视角,所以在这里这个数据包要交给上层协议,再做进一步解析
  • 所以这个数据包就会从数据链路层交给网络层

  1. 网络层拿到了上述解析好的数据,网络层的 IP 协议也要对这个数据包进行解析
  • 取出 IP报头载荷
  • 根据报头中的信息确认,是丢弃、转发还是保留(给上层协议)
  • 由于是站在接收方的视角,所以在这里这个数据包要交给上层协议,再做进一步解析

  1. 传输层这边,UDP 协议也要针对数据进行解析
  • 取出 UDP 报头载荷
  • 此处也需要把载荷里面的内容,进一步交给应用层协议
  • 依赖 UDP 报头中的端口号,区分需要交给哪个应用程序(端口号就是用来区分不同进程的)

  1. 数据就到了 QQ 这样的应用程序这里了
  • QQ 就要针对上述的数据进行“反序列化
  • 再针对里面的数据进行进一步的逻辑
  1. 将收到的消息显示到界面上
  2. 播放“滴滴滴”这样的声音,提醒收到信息
  3. 显示弹窗,提示收到信息
  4. 更新未读消息的列表(红色的圆圈写个数字)

  • 此处接收方做的工作就是发送方工作的“逆向工作
  • 发送方的“封装”,认为是“打包快递
  • 接收方的“分用”,认为是“拆快递

一个电脑,会先连到交换机上,交换机可能连到路由器上,路由器可能又连到另一个交换机上,交换机又连到另一个路由器上… 总之,这中间会连接很多的交换机和路由器,来完成数据转发的过程

中间过程的交换机和路由器,也会涉及到封装和分用(不会像主机这样复杂)

  • 交换机封装分用到链路层,就可以决定数据是丢弃还是继续转发了,不再继续分用(经典的教科书上的交换机)
  • 路由器,封装分用到网络层,就可以决定数据是丢弃还是继续转发了,也不再继续分用
    在传输的过程中,每到一个设备都要进行封装分用,经过层层数据的交换,最终到达终点

封装分用这么麻烦,会不会导致交换机、路由器、主机之间的通信效率很低呢?

  • 得看和谁比
  • 如果是那网络通信和人的反应时间相比,速度还是很快的
  • 如果拿网络通信和读写硬盘相比,通常认为,网络的速度比硬盘的速度更慢
  • 更不必说和内存比了

也有特殊情况:

  • 如果拿网络中最强的“万兆网卡”和硬盘中最弱的“机械硬盘”相比,网络的速度更快


相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2577 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
163 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
977 14
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
221 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
734 9