当前位置: 首页 > news >正文

网络原理(2)——封装和分用

1. 数据在网络通信中的整体流程:封装和分用

例子:通过 QQ 发送一个 hello 给另一个人

a) 发送方视角

1. 用户在输入框中输入 “hello” 字符串,点击发送按钮

QQ 这样的程序就会把 hello 这个内容从输入框读取到,并构造成一个“应用层数据包”

应用层数据包:应用层的网络协议就描述了这个数据包的构造,此处的应用层协议,往往是开发 QQ 程序员自行定义的

假设是下列方式定义的应用层数据包的结构:(定义方式不唯一)

数据包格式:发送者的QQ号;接收者的QQ号;发送时间;消息的正文\n

数据包样例:123456789;987654321;2024-08-06 12:00:00;hello\n

tip:进行网络传输数据,通常需要把一个“结构化”的数据,转化成一个“二进制字符串”

把结构化数据 => 二进制字符串 这个过程称为 序列化

把二进制字符串 => 结构化数据 这个过程称为 反序列化

2. QQ 这样的应用程序,会调用操作系统提供的 API(传输层给应用层提供的 API)

操作系统就会提供一个类似于“发送数据”这样的 API,然后应用程序就会把上述组织好的应用层数据包,作为参数进来,于是应用层数据包就到了系统内核里,就进入到传输层的代码部分了

此时传输层就会把上述的应用层数据再进一步封装成一个传输层数据包(计算机网络中的封装其实就是字符串拼接

由于传输层有多种协议(其中最主要的是两个:TCP 和 UDP,这两个协议给应用层提供的是两组不同的 API ),假设此处使用的是 UDP 协议

其中的 UDP 报头中就包含了一些 UDP 相关的信息,比如包含发送者的端口号和接收者的端口号

3. 传输层构造好数据之后,就会继续调用网络层提供给传输层的 API 把数据进一步交给网络层

由于传输层和网络层都是系统内核里面实现好的,上述的调用过程就无需关心了,我们也感知不到

网络层有多种协议,其中最主要的就是 IPv4 协议(简称为 IP 协议)

IP 协议就会把上述拿到的传输层数据包构造成网络层数据包(再次进行字符串拼接,拼上 IP 报头)

其中 IP 报头包含很多信息,最主要的:发送方 IP 地址,接收方 IP 地址

4. 网络层继续调用数据链路层的 API ,把数据交给数据链路层处理

数据链路层的常见协议:以太网(平时插网线进行上网的这种方式)

在 IP 数据包的基础上再进一步封装

5. 上述得到的数据进一步交给物理层(硬件设备)

网卡就会针对上述的二进制数据进行真正的传输操作,就需要把上述 0101 这样的序列转为 光信号/电信号/电磁波...

tip:网络传输数据的基本单位:

1. 数据包(packet):传输层

2. 数据报(Datagram):网络层

3. 数据段(segment):传输层

4. 数据帧(frame):数据链路层

这几个术语严格来说是有去别的,但是平时不会刻意区分

b) 接受方视角

1. 接收方物理层收到光电信号,把信号还原成 010101 这样的二进制字符串

2. 物理层转换回来的数据交给数据链路层,以太网拿到这个数据包就会对这个数据包进行解析

拿出数据包中的报头和载荷,根据报头信息决定这个数据包是丢弃还是转发,还是自己保留(向上进行解析)

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

3. 网络层拿到了上述解析好的数据

IP 协议也要对这个数据包进行解析,取出 IP 报头和载荷

也需要根据报头中的信息确认,丢弃、转发、保留(给上层协议)

4. 传输层这边 UDP 协议,也要对数据进行解析,取出 UDP 报头和载荷

此处也需要把载荷的内容进一步交给应用层协议(应用程序)

依赖 UDP 报头中的“端口号”,端口号就是用来区分不同的进程的

5. 数据就到了 QQ 这样的应用程序里了

QQ就要针对上述数据进行“反序列化”,针对这里的数据进行进一步的逻辑:

1) 把收到的信息显示到界面上

2) 播放“嘀嘀嘀”的声音,提示收到消息

3) 显示弹窗提示收到消息

4) 更新未读消息的列表(红色圆圈写个数字)

......

tip:

中间过程的交换机和路由器也会涉及到封装和分用,但是他们没有上述过程那么复杂

交换机封装分用到数据链路层就可以决定数据是丢弃,还是转发,就不再继续分用了(这是经典的教科书上的交换机,如今的交换机又集成了很多其他功能),又称其为 二层转发

路由器封装分用到网络层就可以决定数据是丢弃,还是转发了,就不再继续分用了,又称其为 三成转发

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鸿蒙图形开发【3D引擎接口示例】
  • 数据结构——排序(1):插入排序
  • 递归深度问题和尾调用的关系
  • Linux中多线程压缩软件 | Mingz
  • jupyter下载
  • 软件RAID配置实战(2个案例场景)
  • 【云原生】ConfigMap存储
  • 浅谈操作系统
  • Python处理日期时间常用操作
  • 用Ollama 和 Open WebUI本地部署Llama 3.1 8B
  • 前端性能优化-Gzip工作原理
  • java之多线程篇
  • Nodjs编程-typeorm实体管理器
  • OpenCV||超详细的灰度变换和直方图修正
  • 从容应对技术面试:策略、技巧与成功案例
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • emacs初体验
  • GraphQL学习过程应该是这样的
  • HTTP那些事
  • Java小白进阶笔记(3)-初级面向对象
  • jquery cookie
  • Meteor的表单提交:Form
  • PAT A1050
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Redis中的lru算法实现
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Vue组件定义
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 当SetTimeout遇到了字符串
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 排序算法之--选择排序
  • 用 Swift 编写面向协议的视图
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (function(){})()的分步解析
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (poj1.2.1)1970(筛选法模拟)
  • (poj1.3.2)1791(构造法模拟)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (算法)大数的进制转换
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • *1 计算机基础和操作系统基础及几大协议
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • ./和../以及/和~之间的区别
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .gitignore文件_Git:.gitignore
  • .net 4.0发布后不能正常显示图片问题
  • .net 受管制代码
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)