networking - OSI 模型如何工作
问题描述
再会!
我正在研究 OSI 模型。
我有一些困惑的问题。
在网络层,数据可以被分成多个数据包并重新组合。
重组意味着“按顺序”组装,但在传输层协议 UDP 中,数据包可能是无序的。
我的问题是:
- 你在哪里重新组装数据包?
- 如果您在网络层工作,为什么 UDP 出问题了?
- 网络层和传输层做什么
解决方案
您正在混合不同的功能和层。
在网络层,超大的数据包可以被分段,由目的地的网络层重新组装。此功能解决了在跳到跳传输期间 MTU 可能变得小于实际数据包的问题(在 IPv4 - IPv6 中删除了此功能以支持路径 MTU 发现)。
在传输层,有(面向连接的)协议,如 TCP,将连续数据流分成由源和目标跟踪的段。当所有必要的段都到达时,数据流由目的地重建。使用跟踪重新发送丢失的段。
UDP 数据报可能需要沿途分段,需要由目的地重新组装。但是,如果其中一个片段丢失,则不会重新组装,也不会将数据报传递给应用程序——它就丢失了。
UDP 是一种传输数据报的“即发即弃”协议。不同的数据报可能采用不同的网络路由,可能会导致它们乱序到达。
当 TCP 段丢失时,它无法得到目的地的确认。这使得源重新发送段。携带分段的数据包是否需要分段并不重要——只有当所有分段都到达时,重新组装的分段才会传递给 TCP。然后 TCP 确认该段并将数据传递给应用程序。
TCP 还重建段的顺序,因此数据流与发送时完全相同。为此,段被编号,当它们无序到达时,TCP(传输)层会使用它们。
推荐阅读
- javascript - 为什么没有定义方法,但它已定义?
- java - Intellij IDEA 中的 FreeMarker:内置字符串“包含”突出显示为应具有任何参数
- php - 为什么 PhpStorm 不能像使用 php 文件那样使用 php-file
- javascript - 在 clickAway 上关闭 material-ui popper
- google-apps-script - 基于变量运行脚本的 Google Apps 脚本
- discord.js - Discord.js - 给角色一个所有频道
- video - 将媒体存储到 CloudKit 作为 CKAsset 仅适用于图像,不再适用于视频
- javascript - react componentDidMount中如何获取元素的准确offsetTop?
- postgresql - EF Core 实体配置未在 OnModelCreating 中应用
- r - 在 R 中使用 ANOVA 分析错误数量